risc-v中文社区

 找回密码
 立即注册
查看: 907|回复: 2

如何给ARM写好一个SVC功能

  [复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-10-14 10:10:34 | 显示全部楼层 |阅读模式
Cortex-M 内核支持系统服务调用SVC(SuperVisor Call)指令,用户可以用这个指令手动触发一个异常,这有时候非常有用,例如当内核运行在非特权模式时想要修改只有在特权模式才能接入的特殊寄存器,异常处理只能运行在特权模式。
但是它如何运行和用户使用的编译器版本息息相关,如果有其他的软件模块可用的话,他们通常已经实现了SVC异常的处理,比如CMSIS RTOS。
1 触发SVC
首先程序代码中必须要插入SVC指令,这个指令有一个参数(Thumb code 0-255)来选择不同的SVC调用函数,下面的例子用来产生 SVC 0 。但请考虑到,工程中的其它软件模块或许已经使用了,那样请使用其他参数值。
若使用ARMCC,这个编译器能识别 __svc 关键字,因此能很简单的定义SVC函数如下,调用该函数能在当前位置产生一个SVC指令。

2 处理SVC
当使用RTOS时,一般都已经实现了SVC的处理,这样需要查看RTOS的文档来确定如何添加一个额外的用户SVC请求。在其他需要用户程序实现SVC的情况下,一般都需要特定的语法并使用汇编代码实现。下面使用Cortex-M3的例子用来说明(ARMCC编译器),它支持有条件的执行指令。
这个函数以SVC_Handler_Main()结束,这是个普通的c函数,这个函数需要在堆栈返之前查看指令以确定SVC号,SVC0在本例中用来关闭特权模式。


作者:jason_b935
作者:jason_b935
来源:简书



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2022-10-14 10:17:07 | 显示全部楼层
cortex m3可以svc,那arm9, A7等呢?还需要进一步了解.有了解的可以回复。
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2022-10-14 10:20:00 | 显示全部楼层
可以看帖子: ARM汇编指令集 中的swi指令
回复

使用道具 举报

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

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-26 17:43 , Processed in 0.020862 second(s), 18 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

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