感谢分享!学习中...
先收下,研究下在说,不过看着确实复杂。占用空间大,效率也确实低些,不过思路是非常好的,那么缓冲区能不能小些呢,数据包也改小些,比如一个数据包最大4个字节,这样就可以节省很多空间,再改下效率,这样也会更快些。
你好,代码精简好用,我目前还是使用的寄存器方式编程,改写过程中对于/*---------------------------------------------------------
不使用UCOS时,自已定义临界区
----------------------------------------------------------*/
#ifndef OS_uCOS_II_H
#defineOS_ENTER_CRITICAL() {cpu_sr=((!_testbit_(EA))?0X00:0X80);}
#defineOS_EXIT_CRITICAL() {IE|=cpu_sr;}
#endif
不是很理解,看意思应该是关闭中断和使能中断,能否解释一下这个临界区的意思是什么?我直接关闭和开启中断是否可以?因为目前我更改代码后不能稳定工作,主要表现为连续发送两三次串口数据,单片机就会不断重启(死循环)!我目前是对这段代码不是很理解,还请指点
llyymm 发表于 2025-11-4 21:39
你好,代码精简好用,我目前还是使用的寄存器方式编程,改写过程中对于/*----------------------------------- ...
#defineOS_ENTER_CRITICAL() {cpu_sr=((!_testbit_(EA))?0X00:0X80);}
#defineOS_EXIT_CRITICAL() {IE|=cpu_sr;}
即然不理解,那我解释下,或许就明白了。
_testbit_(EA) 这是一个本征库函数调用, 意思是测试一下EA是否置位。
然后,(!_testbit_(EA))?0X00:0X80, 这是一个条件表达式,
cpu_sr=((!_testbit_(EA))?0X00:0X80) 先读EA值,取反,如果当前EA值为0 则给变量 cpu_sr=0, 否则cpu_sr=0x80;
整句话的意思是, 取EA的值, 放到变量 cpu_sr 的最高位。 (bit7)
接下来的,IE|=cpu_sr; 就是恢复EA.
这是临界区的可嵌套形式。
如果实在是不理解,就不用吧,把它们删了,用自己习惯的 EA=0; EA=1;
tzz1983 发表于 2025-11-5 07:52
#defineOS_ENTER_CRITICAL() {cpu_sr=((!_testbit_(EA))?0X00:0X80);}
#defineOS_EXIT_CRITICAL()...
感谢分享,我在网上查了好久,就是没有看到_testbit_的具体解释,这下明白了{:baoquan:}