ElecBear 发表于 2010-3-6 15:07:54

求助!!!MDK下的ARM指令集swi操作

当 SWI 处理程序得到对特定的例程编号的一个请求的时候,它找到这个例程的位置并执行它,并传递(有关的)任何数据。

它是如何工作的?
首先查看一下如何使用它。一个 SWI 指令(汇编语言)看起来如下:
   SWI &02

   SWI "OS_Write0"

这些指令实际上是相同的,将被汇编成相同的指令。唯一的不同是第二个指令使用一个字符串来表示 SWI 编号 &02。在使用采用了字符串编号的程序的时候,在执行之前首先查找这个字符串。

让我们再次看一下第一个指令:

   SWI &02

这是什么意思? 字面的意思是进入 SWI 处理程序并传递值 &02。在 RISC OS 中这意味着执行编号是 &02 的例程。
它是如何这么作的? 它如何传递 SWI 编号和进入 SWI 处理程序?

在ADS下是这样编写的,在MDK下面还是这样写么??

__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);      /*开中断                      */

__swi(0x40) void *GetOSFunctionAddr(int Index); /*获取系统服务函数入口      */
__swi(0x41) void *GetUsrFunctionAddr(int Index);/*获取自定义服务函数入口      */
__swi(0x42) void OSISRBegin(void);            /*中断开始处理                */
__swi(0x43) intOSISRNeedSwap(void);         /*判断中断是否需要切换      */

__swi(0x80) void ChangeToSYSMode(void);         /*任务切换到系统模式          */
__swi(0x81) void ChangeToUSRMode(void);         /*任务切换到用户模式          */
__swi(0x82) void TaskIsARM(INT8U prio);         /*任务代码是ARM代码         */
__swi(0x83) void TaskIsTHUMB(INT8U prio);       /*任务代码是THUMB             */

woshiyean 发表于 2010-3-7 11:04:40

我也一直被这个问题困扰,期待大虾来帮帮忙!
页: [1]
查看完整版本: 求助!!!MDK下的ARM指令集swi操作