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

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

[复制链接]

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10816
发表于 2023-8-24 21:56:05 | 显示全部楼层
熊仔 发表于 2023-8-24 21:46
临界区方法对的。
解决这个问题需要更改任务级别函数。
应该说任务级别函数有bug。

闻过则喜。闻过就是知道自己的天花板在什么地方,克服了则喜,因为你就已经上了一个新台阶。
一般说读硕士是使得自己的水平达到国际国内先进水平,换言之,就是突破自己未读之前的天花板。
一般说读博士是使得自己的水平在某一点上突破国际国内先进水平,换言之,就是突破大家的天花板。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-24 21:56:25 | 显示全部楼层

之前看过一篇文章
http://www.taodudu.cc/news/show-4969578.html?action=onClick


任务的切换主要发生在以下几种情况:

中断产生:当程序产生中断后,CPU处理中断服务函数,但当CPU中断处理完成后并不一定返回到被中断的任务中,而是执行任务就绪表查询,当有更高优先级的任务就绪时会先切换到高优先级任务运行。

主动让出使用权:当高优先级的任务调用延时函数后,会主动让出CPU使用权,该任务会被挂起,重新从任务就绪表中查找最高优先级任务执行。

更高优先级就绪:比如一个低优先级的任务,在运行过程中,虽然没有使用延时等让出CPU使用权,但是由于ucosii 每个固定的周期(心跳时间)会执行一次任务就绪表查询,当有高优先级的任务就绪了以后,那么这个低优先级的任务就被打断了,从而切换到高优先级任务运行。
这就等于剥夺了低优先级任务的CPU使用权了。

任务自挂起:将自己从就绪表中删除,引发一次任务调度,使得CPU去运行就绪表中的其他任务。

1.当任务处于中断服务处理中或者临界区内,不会发生任务切换。

2.如何保证系统的实时性?

在中断服务函数中,因为滴答中断是周期性发生的,所以任务切换也是周期性发生的。

当有一个优先级低的任务执行时,如果有优先级更高的任务就绪了,那么只要发生了一次滴答中断,任务就能被立即切换过去,延时只有一个滴答时钟的时间,如果定义的时钟周期是1ms,那么低优先级的任务最多也就能运行1ms,然后便会强行剥夺CPU的执行权限,转交给高优先级的任务。

由于存在这种机制,因此便能保证UCOSII系统任务的实时性。

点评

(1)读书要读经典,这种文章的学术水平不够。 (2)“1.当任务处于中断服务处理中或者临界区内,不会发生任务切换。”。这句话已经被你自己推翻了,这是你的移植例子: [attachimg]19015[/attachimg] 其中第95行的  详情 回复 发表于 2023-8-24 23:36
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-24 22:11:26 | 显示全部楼层
移植到到STM32的代码,触发一个PENDSV异常,OS_CPU_PendSVHandler:中断函数里面切换任务。最后开启中断。
这样测试也是不通过的。






点评

那是移植的水平不够  详情 回复 发表于 2023-8-25 00:05
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-24 22:49:56 来自手机 | 显示全部楼层
通过网上查了资料,临界区内是不允许切换任务的。
临界区内的代码要尽快完成,才能保证系统的实时性。

测试例子使用不当。

点评

(1)读书要读原著,读经典。 (2)“通过网上查了资料,临界区内是不允许切换任务的。”对于一个结论,我们首先要弄清是针对什么情况和什么操作系统而言的。对于低档的RTOS,或者功能不完备的RTOS,这个结论可能是  详情 回复 发表于 2023-8-24 23:46
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10816
发表于 2023-8-24 23:36:49 | 显示全部楼层
熊仔 发表于 2023-8-24 21:56
之前看过一篇文章
http://www.taodudu.cc/news/show-4969578.html?action=onClick

(1)读书要读经典,这种文章的学术水平不够。
(2)“1.当任务处于中断服务处理中或者临界区内,不会发生任务切换。”。这句话已经被你自己推翻了,这是你的移植例子:
原始ISR.jpg

其中第95行的“LCALL _?OSIntExit   ;通知内核退出中断”中断任务切换是不是处于定时器1的中断服务处理中?
(3)并且在你的移植版中:
中断任务切换.jpg

其中第723行的“OSIntCtxSw();”任务切换函数是不是已经在临界区中了?

回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10816
发表于 2023-8-24 23:46:31 | 显示全部楼层
熊仔 发表于 2023-8-24 22:49
通过网上查了资料,临界区内是不允许切换任务的。
临界区内的代码要尽快完成,才能保证系统的实时性。

(1)读书要读原著,读经典。
(2)“通过网上查了资料,临界区内是不允许切换任务的。”对于一个结论,我们首先要弄清是针对什么情况和什么操作系统而言的。对于低档的RTOS,或者功能不完备的RTOS,这个结论可能是正确的。
(3)我确定:对于RT-Thread、FreeRTOS、uC/OS-III以及uC/OS-II,在临界区都是允许切换任务的。


回复 支持 1 反对 0 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10816
发表于 2023-8-25 00:04:20 | 显示全部楼层
楼主,你说“测试例子使用不当。”的意思是你的移植版通不过这个测试了?你准备放弃吗?我确定uC/OS-II肯定可以通过这个测试,你要不再试试?
回复 支持 反对 送花

使用道具 举报

该用户从未签到

61

主题

622

回帖

1万

积分

荣誉版主

积分
10816
发表于 2023-8-25 00:05:01 | 显示全部楼层
熊仔 发表于 2023-8-24 22:11
移植到到STM32的代码,触发一个PENDSV异常,OS_CPU_PendSVHandler:中断函数里面切换任务。最后开启中断。
...

那是移植的水平不够
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-25 11:36:00 | 显示全部楼层
本帖最后由 熊仔 于 2023-8-25 11:37 编辑

这个问题是能解决,我在19#有说到:需要保存IE入栈,出来的时候判断是否开中断
中断处理和任务切换的时候就是麻烦一点呗

点评

(1)好的,加油!相信你会成功的。 (2)这是一个我写的能通过临界区保护嵌套测试的范例程序,供你观察对比效果。作为老师,肯定是我自己通过了,然后才会出题给学生的: (3)这是范例运行的视频效果。嵌套效果  详情 回复 发表于 2023-8-25 12:21
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

329

回帖

872

积分

荣誉版主

积分
872
 楼主| 发表于 2023-8-25 12:10:36 | 显示全部楼层


任务A和任务B运行过程EA一直是1,把IE保存到任务栈,保存的EA状态也是开启的,也解决不了嵌套。
恢复任务的时候还是会根据IE打开。

回复 支持 反对 送花

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 21:06 , Processed in 0.079262 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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