從代碼看,并沒有考慮線程安全。那意味著我無法同時在中斷和后臺直接使用CAN_Transmit?
您好,CAN中可以對發(fā)送郵箱進行優(yōu)先級的配置且在發(fā)送中會對郵箱是否為空進行判斷。當(dāng)同時調(diào)用發(fā)送函數(shù)時,比如放在不同的郵箱,會先發(fā)送高優(yōu)先級郵箱的數(shù)據(jù)。
我并沒有理解……
發(fā)送優(yōu)先級我看文檔是根據(jù)CAN_TXFP來的,要么根據(jù)發(fā)送順序,要么根據(jù)CANID?郵箱ID是最低一級的判定。
然后,我認(rèn)為的沖突在于CAN_Transmit一開始獲得空閑的郵箱,然后往這個郵箱寫入數(shù)據(jù):當(dāng)后臺獲得了空閑郵箱,但還沒寫入數(shù)據(jù)時,中斷來了,此時在中斷中是不是也會獲得同一個空閑郵箱并寫入數(shù)據(jù)?此時中斷返回后,后臺程序獲得的郵箱其實已經(jīng)不可寫入有效數(shù)據(jù)了,然而后續(xù)要查詢發(fā)送狀態(tài)等,又是可以的(因為確實被中斷用了,確實發(fā)送數(shù)據(jù)了)。那就是,錯誤無法檢測。
我想到的方案是,3個發(fā)送郵箱分別用作不同的功能:
一個用于緊急狀態(tài)數(shù)據(jù)包發(fā)送;一個用于后臺的命令/響應(yīng);一個用于中斷中(定期)的數(shù)據(jù)上報。
但這與外設(shè)庫的用法(查詢3個郵箱,哪個空閑用哪個)不一致。
不知道這個思路是否正確。
您好,我大概明白你的意思,你的意思是中斷和后臺完全同時對同一空郵箱進行判斷并寫入了數(shù)據(jù),此時數(shù)據(jù)會產(chǎn)生沖突,是這個意思吧。那種你最后的說法3個郵箱分別用于不同的功能應(yīng)該也是可以的,但是發(fā)送函數(shù)可能需要自己去寫了,無法直接使用庫的發(fā)送函數(shù)。后續(xù)若有問題,可以郵箱(lzs@wch.cn)和我溝通。