OpenEdv-开源电子网

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

裸机程序是运行在SVC模式吗

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-2-11
在线时间
6 小时
发表于 2021-2-23 13:14:30 | 显示全部楼层 |阅读模式
6金钱
如题,请问裸机程序都是运行在SVC模式吗?
如果是的话,看手册上说SVC一般是给操作系统用的是怎么回事
如果不是的话,为什么在例程中之前没有设置其他模式的sp
另外,左神讲裸机9_init的时候说,设置设置SVC、SYS、和IRQ模式三段代码的顺序无关紧要,那么最终进入什么模式和三段代码的顺序有关吗

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-2-11
在线时间
6 小时
 楼主| 发表于 2021-2-24 10:35:03 | 显示全部楼层
我再补充下我的问题
Reset_Handler:
        /*关闭全局中断 */
        cpsid i
        /* 关闭I Cache 、D Cache和MMU
         * 采用读-修改-写的方式
         */
        MRC p15, 0, r0, c1, c0, 0 ; //读SCTLR寄存器的值到r0
        bic r0, r0, #(1 << 12);                //关闭I Cache
        bic r0, r0, #(1 << 11);            //关闭分支预测
        bic r0, r0, #(1 << 2);                //关闭D Cache
        bic r0, r0, #(1 << 1);                //关闭对齐
        bic r0, r0, #(1 << 0);                //关闭MMU
        MCR p15, 0, r0, c1, c0, 0 ; //写r0寄存器的值到SCTLR

        /*设置中断向量地址偏移 */
        ldr r0, =0x87800000;
        dsb
        isb
        MCR p15, 0, r0, c12, c0, 0;                //设置VBAR寄存器=0x87800000
        dsb
        isb       

        /*清除BSS段*/
        ldr r0, _bss_start
        ldr r1, _bss_end
        mov r2, #0
bss_loop:
        stmia r0!, {r2}
        cmp r0, r1
        ble bss_loop
       
        /* 进入IRQ模式 */
        mrs r0, cpsr
        bic r0, r0, #0x1f         /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4         */
        orr r0, r0, #0x12         /* r0或上0x13,表示使用SVC模式                                        */
        msr cpsr, r0                /* 将r0 的数据写入到cpsr_c中 */
        ldr sp,=0X80600000        /* 设置栈指针                         */

        /* 进入SYS模式 */
        mrs r0, cpsr
        bic r0, r0, #0x1f         /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4         */
        orr r0, r0, #0x1f         /* r0或上0x13,表示使用SVC模式                                        */
        msr cpsr, r0                /* 将r0 的数据写入到cpsr_c中 */
        ldr sp,=0X80400000        /* 设置栈指针                         */       

        /* 进入SVC模式 */
        mrs r0, cpsr
        bic r0, r0, #0x1f         /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4         */
        orr r0, r0, #0x13         /* r0或上0x13,表示使用SVC模式                                        */
        msr cpsr, r0                /* 将r0 的数据写入到cpsr_c中 */
        ldr sp,=0X80200000        /* 设置栈指针                         */

       
        /*打开全局中断 */
        cpsie i

        b main                                /* 跳转到main函数                  */
这是复位中断函数中的代码,现在是的代码顺序是依次IRQ,SYS,SVC,此时进入哪个模式运行?那么如果讲上面的代码顺序调整为SYS,SVC,IRQ又进入哪个模式运行
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-2-24 01:52:53 | 显示全部楼层
帮顶
回复

使用道具 举报

70

主题

6698

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12695
金钱
12695
注册时间
2012-11-26
在线时间
3712 小时
发表于 2021-2-24 08:24:30 | 显示全部楼层
我记得中断开始的例程,每个模式都设置了SP的啊
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-2-11
在线时间
6 小时
 楼主| 发表于 2021-2-24 09:30:38 | 显示全部楼层
在视频中讲中断的例程时,左神在Reset_Handler设置了三个模式的SP指针,分别是SYS,SVC和IRQ,左神说自己可以设置其他的模式的SP,这个我是理解的。但是左神说设置几个模式的代码的顺序可以随意,那么上电之后,执行复位中断函数里面的汇编代码,最终进入的是哪个模式呢?按照顺序执行的话,最终进入的模式不应该是最后一段设置模式的代码的那个模式吗?另外我有一个理解不知道对不对,就是进入哪个模式都能正常的配置好C的运行环境,然后进入main执行,只不过,假如进入了IRQ模式,那么如果main中发生中断是不会切换模式的,是这样吗?问题有点多,见谅
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-2-11
在线时间
6 小时
 楼主| 发表于 2021-2-24 09:31:01 | 显示全部楼层
jermy_z 发表于 2021-2-24 08:24
我记得中断开始的例程,每个模式都设置了SP的啊


在视频中讲中断的例程时,左神在Reset_Handler设置了三个模式的SP指针,分别是SYS,SVC和IRQ,左神说自己可以设置其他的模式的SP,这个我是理解的。但是左神说设置几个模式的代码的顺序可以随意,那么上电之后,执行复位中断函数里面的汇编代码,最终进入的是哪个模式呢?按照顺序执行的话,最终进入的模式不应该是最后一段设置模式的代码的那个模式吗?另外我有一个理解不知道对不对,就是进入哪个模式都能正常的配置好C的运行环境,然后进入main执行,只不过,假如进入了IRQ模式,那么如果main中发生中断是不会切换模式的,是这样吗?问题有点多,见谅
回复

使用道具 举报

7

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-9-18
在线时间
27 小时
发表于 2021-2-24 09:35:37 | 显示全部楼层
我理解的是SVC模式权限比较大,直接要操作寄存器的要进入SVC模式
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 22:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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