野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6357|回复: 4

[freertos] 请教关于Freertos中使用SVC中断的一个问题

[复制链接]
发表于 2019-4-20 09:48:34 | 显示全部楼层 |阅读模式
请先看代码:
[mw_shl_code=c,true]//该函数申请SVC中断
__asm void InSvc( void )
{
    cpsie i
          cpsie f
         
          svc 0
          nop
          nop
         BX LR //如果不加此指令,将会导致重复进入SVC_Handler中断 LED0不闪烁处于常亮
}


int main(void)
{       
        delay_init();            //延时函数初始化          
        LED_Init();                          //初始化与LED连接的硬件接口
        while(1)
        {
                LED0=0;
                delay_ms(300);         //延时300ms
               
                InSvc();
                delay_ms(300);        //延时300ms
        }
}

//该中断处理函数中将LED0翻转
__asm void SVC_Handler(void)
{
    LDR R0, = 0x40010C0C
   
   
    LDR R1,[R0]  ;R1 = *R0
   
    EOR R1,R1,#0x0020 ;r1 = r1^0x0020
    STR R1,[R0] ;*R0 = R1
                           

    BX LR
}
[/mw_shl_code]

如上,火哥的书中是这样写得:
QQ图片20190420094708.png

问题是最后两个“nop”之后,没有加上 BX LR 这个语句,难道不会重复进入SVC_Handler中断吗?
那为什么我的代码不加上 BX LR会重复进入呢?
回复

使用道具 举报

发表于 2019-4-20 10:00:59 | 显示全部楼层
启动第一个任务就是去调用svc 0  就是去svc中断进行启动第一个任务
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-20 10:06:20 | 显示全部楼层
杰杰 发表于 2019-4-20 10:00
启动第一个任务就是去调用svc 0  就是去svc中断进行启动第一个任务

是的  SVC 0就是申请进入中断的

但是从SVC回来后,我发现我的代码中不加 BX LR
则会继续进入SVC一次

但火哥的书中的代码是没加BX LR的   这点我没搞明白。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-20 10:12:43 | 显示全部楼层
杰杰 发表于 2019-4-20 10:00
启动第一个任务就是去调用svc 0  就是去svc中断进行启动第一个任务

还有能否告诉我
SVC 0   后面这个0怎么理解?

我发现 SVC 1   SVC 2 代码都能正常运行的。  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-20 10:17:46 | 显示全部楼层
这里如图是否应该是加载到r1
QQ图片20190420101552.png
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-4 13:14 , Processed in 0.041719 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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