熊仔
发表于 2023-9-19 09:16:09
本帖最后由 熊仔 于 2023-9-19 09:18 编辑
是的,昨天测试死机重启就是堆栈空间分配64不够,另一个帖子说了。后面例子需要更新,最少128B堆栈空间。
LAOXU
发表于 2023-9-21 18:52:31
关于老杨提到的测试2 , 我很感兴趣
(13)测试2结论:如果对用户程序进行临界区保护,会带来系统崩溃。
(14)综合结论:采用方法0不关闭总中断,不进行任何临界区保护,对系统本身和用户程序没有任何影响,都可以正常运行。采用方法3,采用关闭总中断对用户程序进行临界区保护,系统会崩溃。
(15)存在BUG:在采用软中断的uC/OS-II移植版中,向用户提供关闭总中断的临界区方法就是BUG。
------------------------------------------------------------------------------------------------------------------------------------------
分析了一下相关程序, 使用了经典老掉牙的 PLC位操作方式, 保护 EA.
对 uCOS-II 来说, 可能属于 非典(非标).
第一次改 , 对 uCOS-II 的框架及程序结构, 理解的不是很透彻, 不知这样改动, 是否可行.
请小熊在百忙之中, 帮忙测试一下.如行, 在 STC8上,也可这样改.
谢谢!
LAOXU
发表于 2023-9-21 18:54:13
熊仔
发表于 2023-9-21 18:56:40
*修改版本: V1.02
*修改时间: 2023-09-20
修改: 1.方法3,方法4,支持临界区切换任务
昨天更新了,忘记更新到这个帖子。
熊仔
发表于 2023-9-21 19:01:41
LAOXU 发表于 2023-9-21 18:54
相当于嵌套次数保存在_BitSEA 变量中,最多8级嵌套。
方法很新颖。
熊仔
发表于 2023-9-21 19:03:37
LAOXU 发表于 2023-9-21 18:52
关于老杨提到的测试2 , 我很感兴趣
(13)测试2结论:如果对用户程序进行临界区保护,会带来系统崩溃。
他这个结论重点是关闭中断后,不能切换任务了。
这个临界区方法不是重点。这个次要的。
熊仔
发表于 2023-9-21 20:03:59
本帖最后由 熊仔 于 2023-9-21 22:37 编辑
LAOXU 发表于 2023-9-21 18:54
进入临界区:在关闭中断前,操作临界区重要变量都是不行的。不能先右移。
退出临界区:操作开中断必须在后面。左移放最后肯定出问题。
稍微改下可以变成一个新的方法。
#if OS_CRITICAL_METHOD==5
//JBC指令方式
//非典方式: LAOXU提供的方法
INT8U data _BitSEA=0;
//采用通用的PLC位操作工作方式, 8BitS最多保存嵌套次数8次, 一般够用了,
//如不够用, 可改成 16BitS或 32BitS, 最多保存嵌套次数16次(或32次), 依次类推.
void OSEnterCritical(void) {
if (_testbit_(EA)) {
_BitSEA >>= 1;
_BitSEA |= 0x80;
} else {
_BitSEA >>= 1;
}
}
void OSEXitCritical(void) {
_BitSEA <<= 1;
EA = CY;
}
#endif
我的观点:多于8次嵌套需要增加变量。还不如方法4优秀。其实嵌套只有第一次是1,其他都是0。当然这个也是一个方法。行得通。
LAOXU
发表于 2023-9-22 04:20:52
谢谢小熊回复.
LAOXU
发表于 2023-9-22 04:27:50
少于16次嵌套, 定义变量INT16U。执行速度 和定义变量INT8U 几乎相同, 还是挺快的,
LAOXU
发表于 2023-9-22 04:40:13
方法4我刚才看了, 确实不错.