打印

[已解决]__swi命令的应用

[复制链接]
4114|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yk1225|  楼主 | 2011-10-17 14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yk1225 于 2011-10-21 15:46 编辑

论坛各位大神好,小弟初学arm,在阅读 陈明计写的arm上移植的ucos代码的时候有一些疑问如下,求各位解答:
      1. __swi命令。
           代码如下,这里求教一下__swi(**)这条命令的用法,阅读整个代码是不是说,在编译的时候,调用OS_TASK_SW的时候,会自动产生一个SWI的软中来进行处理的呢。如果是这样,OS_ENTER_CRITICAL OS_EXIT_CRITICAL均有对应的SWI终端处理函数,而OS_TASK_SW_OSStartHighRdy没有对应的中断处理函数(这里说的中断处理函数值得是进入SWI中断后对应的switch分支),而是采用的直接调用的方式,这两个方式是否存在矛盾的呢。

附件中带的是陈明计(周立功单片机公司)编写的移植文件。
于提问相关的代码:
__swi(0x00) void OS_TASK_SW(void);           /*  任务级任务切换函数          */
__swi(0x01) void _OSStartHighRdy(void);        /*  运行优先级最高的任务        */
__swi(0x02) void OS_ENTER_CRITICAL(void);       /*  关中断                      */
__swi(0x03) void OS_EXIT_CRITICAL(void);        /*  开中断                      */

ARM&ucos.zip

8.6 KB

相关帖子

沙发
yk1225|  楼主 | 2011-10-19 20:09 | 只看该作者
虽然没人回答,有些失望
还是自己来的吧,希望后后来者一些方便的吧。

1. 却是如提问中所说的在
编译的时候,调用OS_TASK_SW的时候,会自动产生一个SWI的软中来进行处理,对于有直接定义的函数,则是采用直接调用的方法,二者并不存在冲突(这一点阅读附件中的汇编程序就可以明白,相当于SWI 0x0000对应的中断服务程序没有写在c语言那个文件中,而是写在了汇编程序中)
2.对于阅读附件中的程序,另外一个需要特别提示的是,在ARM中,不同模式下的SP(R13)寄存器的地址是独立的,因此模式切换前后的SP寄存器对应的堆栈是不同的,这点需要特别注意,在附件中没有标注,使得我这个初学者最开始也是看了好久才看明白的。
3,对于1中提到的写到汇编程序文件中,可能是为了方便调用下文的任务切换的汇编程序的吧,这点只是一个参考。大家可以再看看的。
           就这么多的了,祝各位愉快。

使用特权

评论回复
板凳
airwill| | 2011-10-19 21:47 | 只看该作者
嗯, 用 __swi() 是为了解决 内核关键部分的调用. 可以避免内核重入的办法.

使用特权

评论回复
地板
yk1225|  楼主 | 2011-10-20 09:07 | 只看该作者
3# airwill

不知道兄台能讲的更详细点么。为什么这样做就可以避免内核关键部分的函数重入问题的呢。

使用特权

评论回复
5
airwill| | 2011-10-25 12:19 | 只看该作者
这个问题不简单嘛。
用户程序调用了 __swi(), 就转入系统, 在返回前不可能再发生调用.
__swi() 中断系统硬件有排他性, 同一级中断不能重复进入.
在中断没有退出前, 也不可能转入其他任务. 中断总是比任何任务都优先.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

9

帖子

1

粉丝