熊仔 发表于 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我刚才看了, 确实不错.
页: 1 2 [3] 4 5 6 7
查看完整版本: 最新版本uC-OS2-2.93.01已移植到STC32G上,请帮忙查错