从代码看,并没有考虑线程安全。那意味着我无法同时在中断和后台直接使用CAN_Transmit?
您好,CAN中可以对发送邮箱进行优先级的配置且在发送中会对邮箱是否为空进行判断。当同时调用发送函数时,比如放在不同的邮箱,会先发送高优先级邮箱的数据。
我并没有理解……
发送优先级我看文档是根据CAN_TXFP来的,要么根据发送顺序,要么根据CANID?邮箱ID是最低一级的判定。
然后,我认为的冲突在于CAN_Transmit一开始获得空闲的邮箱,然后往这个邮箱写入数据:当后台获得了空闲邮箱,但还没写入数据时,中断来了,此时在中断中是不是也会获得同一个空闲邮箱并写入数据?此时中断返回后,后台程序获得的邮箱其实已经不可写入有效数据了,然而后续要查询发送状态等,又是可以的(因为确实被中断用了,确实发送数据了)。那就是,错误无法检测。
我想到的方案是,3个发送邮箱分别用作不同的功能:
一个用于紧急状态数据包发送;一个用于后台的命令/响应;一个用于中断中(定期)的数据上报。
但这与外设库的用法(查询3个邮箱,哪个空闲用哪个)不一致。
不知道这个思路是否正确。
您好,我大概明白你的意思,你的意思是中断和后台完全同时对同一空邮箱进行判断并写入了数据,此时数据会产生冲突,是这个意思吧。那种你最后的说法3个邮箱分别用于不同的功能应该也是可以的,但是发送函数可能需要自己去写了,无法直接使用库的发送函数。后续若有问题,可以邮箱(lzs@wch.cn)和我沟通。