找回密码
 立即注册
楼主: 熊***

最新版本uC-OS2-2.93.01已移植到STC8上,请帮忙查错

[复制链接]

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10904
发表于 2023-8-29 04:54:44 | 显示全部楼层
微山x51-uCOSII的基于加锁解锁和原子指令的可嵌套临界区保护方法我已经另外开贴介绍了,欢迎楼主观看点评。

点评

杨老师真的好早起来呀。 好的,我去看看。  发表于 2023-8-29 08:37
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

331

回帖

886

积分

荣誉版主

积分
886
 楼主| 发表于 2023-8-29 12:05:07 | 显示全部楼层
本帖最后由 熊仔 于 2023-8-29 12:06 编辑

对方法4,优化,增加保护





回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

331

回帖

886

积分

荣誉版主

积分
886
 楼主| 发表于 2023-8-30 23:17:25 | 显示全部楼层
本帖最后由 熊仔 于 2023-8-30 23:20 编辑

对方法2进一步优化





对方法3进一步优化


附件是修改后的代码V1.05


uCOSII_临界区保护_方法测试V1.05.zip

421.33 KB, 下载次数: 22

回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

331

回帖

886

积分

荣誉版主

积分
886
 楼主| 发表于 2023-8-31 12:23:58 | 显示全部楼层
本帖最后由 熊仔 于 2023-8-31 12:32 编辑

使用注意:
本移植中断统一管理,按照isr_a.A51规范处理,整个工程统一使用寄存器组0,用户不能修改寄存器组。寄存器组1,2,3共24字节用于data区。

其实用户想用其他寄存器组,无非就是想加快中断执行时间。是否有更好的办法呢?

答案是有的,把需要加速的中断设置成不可嵌套中断就行。进出堆栈不使用PULLALL和POPALL,只需要保存ACC,B,DPH,DPL,PSW寄存器就可以。




其实也就是加快了16指令,运行在最新的STC 1T 8051上,比如单片机的工作时钟32MHz, 加速时间也就是0.5us左右。


回复 支持 反对 送花

使用道具 举报

该用户从未签到

552

主题

9492

回帖

1万

积分

管理员

积分
14057
发表于 2023-9-3 10:46:08 | 显示全部楼层
楼主帮忙将最新的程序包永远在顶层同步涮新
===这样后来者抓错版本的机会会少些

截图202309031044238190.jpg
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

331

回帖

886

积分

荣誉版主

积分
886
 楼主| 发表于 2023-9-3 11:40:35 | 显示全部楼层
好的,后面还在更新,增加支持双DPTR,双DPTR对数据拷贝加快了不少,优化string.h里面的函数。
使用双DPTR对code拷贝到xdataxdata拷贝到xdata,加快了N多倍。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10904
发表于 2023-9-12 22:33:21 | 显示全部楼层
我等楼主自己改正等了那么多天,看来楼主是非要把功劳送给我了!

(1)在楼主移植的uCOSII-STC8-V1.05中,任务切换中使用了STC8单片机特有的增强型双指针功能,加快了任务切换的速度,部分程序见下图:
Fig_01_任务切换.jpg
(2)但是该版本在进行寄存器现场保护和恢复只包含了增强型双指针单元的DPH和DPL这2个SFR,并没有包括该单元的另外3个SFR:DPH1、DPL1和DPS,具体见下图:
Fig_02_原始.jpg
这样就产生了一个问题,如果任务切换时当前任务正在使用增强型双指针单元进行字符串或者内存数据移动处理,由于该单元有3个SFR未被保存,将来当然任务被恢复执行时,这3个SFR未必是原来的值了。因此有可能导致意外的结果。

(3)对于STC8单片机,由于RTOS系统本身已经使用了双DPTR单元,如果也允许用户在其RTOS程序中使用双DPTR单元,那么在系统任务切换时保存和恢复双DPTR单元的全部5个SFR,如下图所示:
Fig_03_修改.jpg


回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

331

回帖

886

积分

荣誉版主

积分
886
 楼主| 发表于 2023-9-12 22:52:34 | 显示全部楼层
这部分已经改了。只是没有更新到网站。因为最近忙,string.h函数还没有处理完。
截图202309122247087727.jpg
目前采用双DPTR改下库函数,已经完成的函数
extern void  *memcpy  (void *s1, const void *s2, size_t n);
extern void  *memmove (void *s1, const void *s2, size_t n);
extern char  *strcpy  (char *s1, const char *s2);

前几天还在论坛发了使用双DPTR的心得:https://www.stcaimcu.com/forum.p ... &extra=page%3D1

不建议单独使能DPTR0自动模式,这样做太麻烦了。需要设置TA。
新版本已经改成同时使能DPTR0和DPTR1自动模式。

MOV      DPS,#00011000B              ;设置DPTR1为递加模式,DPTR0为递加模式,关闭TSL,使能AU0和AU1,(注意:写保护模式下只能同时使能AU0和AU1)
                                                    ;并选择DPTR0为当前的DPTR

回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

331

回帖

886

积分

荣誉版主

积分
886
 楼主| 发表于 2023-9-12 22:59:18 | 显示全部楼层
还有杨老师的对P_SW2出栈的做法不合理。应该只对bit7处理。
这部分我也改好了。
截图202309122257316174.jpg

回复 支持 反对 送花

使用道具 举报

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10904
发表于 2023-9-13 00:03:37 | 显示全部楼层
楼主移植的uCOSII-STC8-V1.05版本范例中ISR程序存在着不规范性(也可以说是BUG),这是由于移植者没有按照uC/OS-II的规范编程产生的。
(1)作为uC/OS-II安全性的基础,uC/OS-II采用了“中断嵌套保护策略”,根据这个策略,在uC/OS-II程序中的每一个中断ISR中,都要在中断进入时调用“OSIntEnter()”函数,通知内核进入中断,然后在退出中断前调用“OSIntExit()”函数,通知内核退出中断。
在每次进入中断时执行“OSIntNesting++;”语句,每次退出中断时执行“OSIntNesting--;”,然后在“OSIntExit()”函数了进行判断,没有中断嵌套时才进行任务调度。
因此uC/OS-II的ISR编程规范为:
VoidXXXX_ISR(void) {
OSIntEnter();
OSIntExit();
}
(2)下图是一个实际的按照uC/OS-II的ISR编程规范编写的汇编语言ISR程序:
Fig_01_规范.jpg
这是一个定时器0系统中断和UART1串口中断的ISR,从中可以看到它们都严格地按照了规范进行编写。

(3)楼主在uCOSII-STC8-V1.05版本范例中ISR程序如下所示:
Fig_02_原始.jpg
对比之下定时器3中断ISR缺少了第90行和第95行中断嵌套保护程序,使得范例程序不具有中断嵌套保护功能,失去了范例应该有的“模范”作用,反而变成了“误导”作用。

(4)因此楼主应该把缺少的两个语句补全如下:
Fig_03_修改.jpg

点评

这个真不是bug,特意给出的中断不能嵌套演示例子。 莫非杨老师没看明白我这个两个例子是干嘛的?不应该呀。之前还评论说很正确。 定时器1演示中断嵌套。 定时器3演示中断不能嵌套。我都知道不能嵌套了,干嘛还要  详情 回复 发表于 2023-9-13 08:33
回复 支持 反对 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-17 22:26 , Processed in 0.113554 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表