熊仔
发表于 2023-9-13 08:33:51
本帖最后由 熊仔 于 2023-9-13 08:39 编辑
杨为民 发表于 2023-9-13 00:03
楼主移植的uCOSII-STC8-V1.05版本范例中ISR程序存在着不规范性(也可以说是BUG),这是由于移植者没有按照u ...
这个真不是bug,特意给出的中断不能嵌套演示例子。
莫非杨老师没看明白我这个两个例子是干嘛的?不应该呀。之前还评论说很正确。
定时器1演示中断嵌套。
定时器3演示中断不能嵌套。既然知道不能嵌套了,干嘛还要调用 os进出中断函数呢?
其实还有一个例子屏蔽了。之前不是说有用户必须用到其他寄存器组咋办
; ==== 定时器3 中断服务程序 =============
;演示使用寄存器组1,加快中断执行速度,必须禁止中断嵌套。
对于一些要求很高的场合,比如要求中断时间只能几个us完成的,不能调用os进出中断函数,调用的话即便没有任务切换,也是需要好几us时间。
当然如果有任务切换,需要处理的时间更多。导致后面的中断到了不能及时处理,可能丢失部分紧急数据。这种情况就需要把优先级设为更高,然后不能中断嵌套。
结论:是否需要中断嵌套,还得按照项目实际要求弄。
杨为民
发表于 2023-9-13 08:55:40
熊仔 发表于 2023-9-13 08:33
这个真不是bug,特意给出的中断不能嵌套演示例子。
{:4_250:}
熊仔
发表于 2023-9-13 09:23:08
其实陈是知移植版本中断处理本身有bug。应该在通知内核进入中断后,打开中断,允许中断嵌套。
正确的做法是按照本移植的案例:
杨为民
发表于 2023-9-13 12:15:20
熊仔 发表于 2023-9-13 09:23
其实陈是知移植版本中断处理本身有bug。应该在通知内核进入中断后,打开中断,允许中断嵌套。
你们的规范为什么要在中断ISR中开关EA呢?看看我的这个规范,不用打开也行呀
熊仔
发表于 2023-9-13 22:51:09
本帖最后由 熊仔 于 2023-9-13 23:21 编辑
V1.06版本
1.增加可选支持双数据指针,需配置宏USE_DUAL_DPTR
2.增加可选支持访问全部扩展的64K XRAM空间,需配置宏 ACCESS_FULL_64K_XDATA
3.重新整理代码新增os_cpu_i.h文件,实现宏定义PUSHALL POPALL
本来9月1日就移植好的,最近研究了下双DPTR改写string函数,本来想全部移植完毕才分享的。目前完成memcpy,memmove ,strcpy3个函数,最近项目忙,没时间移植剩余的函数,以后再分享这部分。
双DPTR的使用心得看另一篇帖子:https://www.stcaimcu.com/forum.p ... &extra=page%3D1
双DPTR使用用注意事项:写保护模式下只能同时使能AU0和AU1。单独使能需要对TA寄存器操作。之前对DPTR_AUTO_INC宏的处理就是结合TA寄存器操作的,但是发现出栈的时候挺麻烦的,需要配合TA。
然而通过修改string.h里面的函数测试,AU1 和AU0 同时使能方式,完全没有问题。
所以这次改为对AU1 和AU0 同时使能方式,出栈就一条指令POPDPS完成对DPS赋值。
整理代码
1)把USING 0只放在两个宏PUSHALL和POPALL开始位置,其他位置都删除了。
2)宏PUSHALL和POPALL放在文件os_cpu_i.h方便管理。
3)宏DPTR_AUTO_INC,USE_DUAL_DPTR,ACCESS_FULL_64K_XDATA放在文件os_cfg.h,方便管理。
有考虑过DPTR_AUTO_INC和USE_DUAL_DPTR合并在一起,后面想如果使用者不用USE_DUAL_DPTR,单独切换任务函数使用也行。最终保留。
4)对OSTaskStkInit函数修改
tzz1983
发表于 2023-9-15 21:03:54
熊仔,你好, 你移值的这个版本应该是可以支持多优先级嵌套的吧.
我有一个关于中断嵌套比较刁钻的问题想问你: 中被响应后,第一条被执行的指令是向量入口那条转移指令, 执行完后转移到了真正的中断代码那里去了, 中断代码里, 第一条一般是OSIntEnter(); 或者直接 OSIntNesting++ .
在执行第一条转移指令时, 假如此时正好有一个高级中断标志置位并且被硬件查询到, 这时会不会可以响应更高级的优先级中断?此时EA是开的, 并且转移指令也没说有推迟中断响应的功能.按正常的分析来说, 应该是可以响应.(我没有去实测,也没去查相关资料,只是觉得应该可以响应, 所以就来问你一下)
但是如果此时是可以响应更高优先级中断的话, 那么就来活了. OSIntNesting++ 还没加呢, 怎么办?
熊仔
发表于 2023-9-15 21:41:46
本帖最后由 熊仔 于 2023-9-15 21:46 编辑
这个问题我之前想过,例子也弄了。直接在入口OSIntNesting++,或者EA=0,后面使用OSIntEnter();
之前2.91版本的例子
后面感觉一般都怎么弄,没必要这么讲究。所以改回了普通版本。
熊仔
发表于 2023-9-15 21:50:35
如果真的考虑这么细,可以这样做。
这样肯定没有问题了。中断入口第一条OSIntNesting++。高优先级打断也没有问题。最保险的做法。
tzz1983
发表于 2023-9-15 21:55:50
我现在不能证实, 我在家里没设备, 不能用硬件访真测试一下, 明天上班了我去测一下, 我想测试方法也比较简单, 在main函数内 按顺序 TF0=1; EA=1; 引接着 goto xxx; 此时 goto 指令是一定可以执行到的, 关键是看 先执行GOTO指令的下一条指令, 还是先转到中断向量, 如果是转到中断向量,那就.....
tzz1983
发表于 2023-9-15 22:02:59
我一直都有这个疑问, REIT和访问IE,IP的指令有延迟中断响应的效果, 转移指令也应该要有这个效果才对, 就是没去证实, 这几天被杨老师带坏了, 弄了几天的贴, 这种感觉越来越强烈了, 明天一定要去试一下
页:
1
2
3
4
5
6
7
[8]
9
10
11
12