OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2986|回复: 7

ucosii用C语言实现任务切换的方法

[复制链接]

14

主题

30

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-4-27
在线时间
24 小时
发表于 2020-7-9 10:24:55 | 显示全部楼层 |阅读模式
5金钱
怎么用C语言替换掉汇编函数OSCtxSw?

最佳答案

查看完整内容[请看2#楼]

可以,但是很难,也只不过是套了C壳的汇编,C无法直接访问寄存器。 因为你要在这个函数中负责寄存器的保存与恢复,栈帧切换等功能,大部分代码只有内联汇编才可完成。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2017-9-16
在线时间
80 小时
发表于 2020-7-9 10:24:56 | 显示全部楼层
可以,但是很难,也只不过是套了C壳的汇编,C无法直接访问寄存器。
因为你要在这个函数中负责寄存器的保存与恢复,栈帧切换等功能,大部分代码只有内联汇编才可完成。
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2020-7-9 19:21:14 | 显示全部楼层
帮顶~~
回复

使用道具 举报

14

主题

30

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-4-27
在线时间
24 小时
 楼主| 发表于 2020-7-10 13:59:13 | 显示全部楼层
ISO14882 发表于 2020-7-9 10:24
可以,但是很难,也只不过是套了C壳的汇编,C无法直接访问寄存器。
因为你要在这个函数中负责寄存器的保存 ...

现在我已经用C替换了触发PendSV中断的汇编 现在PendSV我是用函数指针指向了线程的函数名来指向堆栈的头地址,并且优先级做了判断  来判别执行哪一个任务,现在就是返回异常这一句理解不透彻,导致实现了主堆栈到开始任务堆栈的切换,之后执行了任务优先级最高的任务,之后就一直执行优先级最高的任务 无法进入到PendSV函数内。
回复

使用道具 举报

7

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2017-9-16
在线时间
80 小时
发表于 2020-7-10 14:52:11 | 显示全部楼层
本帖最后由 ISO14882 于 2020-7-10 14:56 编辑
dd252 发表于 2020-7-10 13:59
现在我已经用C替换了触发PendSV中断的汇编 现在PendSV我是用函数指针指向了线程的函数名来指向堆栈的头地 ...

CMSIS提供了部分汇编语句的封装你可以考虑使用CMSIS的函数代替部分汇编语句,比如说MSP,PSP的getter和setter。
另外,移植前必须要清楚那些汇编做了什么。你需要了解ARM ABI中对函数调用约定的限制、对象布局等内容,因为那部分汇编代码要处理任务相关的结构体(比如TCB,这个如果出问题系统就炸了),NVIC有关的寄存器。上下文的恢复、软中断的触发是属于必须使用内联汇编的地方。因此你必须处理所有与特权级调用有关的地方。
最后用编译器生成汇编代码与uCOS那些手写的汇编比较,如果等价就可以了。
回复

使用道具 举报

14

主题

30

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-4-27
在线时间
24 小时
 楼主| 发表于 2020-7-10 16:41:56 | 显示全部楼层
ISO14882 发表于 2020-7-10 14:52
CMSIS提供了部分汇编语句的封装你可以考虑使用CMSIS的函数代替部分汇编语句,比如说MSP,PSP的getter和se ...

方便加联系方式解决一下吗?
回复

使用道具 举报

7

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2017-9-16
在线时间
80 小时
发表于 2020-7-10 20:16:47 | 显示全部楼层
dd252 发表于 2020-7-10 16:41
方便加联系方式解决一下吗?

psv.png 用C写了一下,大概是这个意思,还没验证过。里面的汇编是按GNU风格走的

回复

使用道具 举报

14

主题

30

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-4-27
在线时间
24 小时
 楼主| 发表于 2020-7-11 15:40:54 | 显示全部楼层
ISO14882 发表于 2020-7-10 20:16
用C写了一下,大概是这个意思,还没验证过。里面的汇编是按GNU风格走的

大神 我们可以互相留个联系方式吗?之后免不得请教 还望指点~~
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-14 11:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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