没有合适的资源?快使用搜索试试~ 我知道了~
八股总结1
需积分: 0 1 下载量 81 浏览量
2022-08-03
13:35:11
上传
评论
收藏 1.95MB PDF 举报
温馨提示
试读
14页
1. 通过 __swi(中断号) function 给中断函数指定中断号(一般在C代码中撰写) 2. 调用function时,相当于执行了 SWI 中断号 指令
资源详情
资源评论
资源推荐
嵌入式重难点总结
软中断流程
1. 通过 __swi(中断号) function 给中断函数指定中断号(一般在C代码中撰写)
2. 调用function时,相当于执行了 SWI 中断号 指令
3. 再执行 SWI 之前需要先注册中断程序,即把处理软中断的程序(SWI_handler)地址放到 0x08 软
中断向量表地址上
4. 注册之后执行 SWI 的时候,会执行 0x08 中断向量地址上存放的跳转指令( B SWI_handler ),即
跳转到SWI_handler;同时将function的参数传递到寄存器内(如果参数不超过4个),超过4个应
该存放到内存
5. 跳转后, SWI_handler 需要干五件事:
1)将保存函数参数的寄存器以及lr寄存器存放到堆栈里保存,
2)通过 BIC 指令获取中断号放置在r0寄存器,
3)将堆栈指针保存到r1,
4)跳转到要执行function的处理函数中(C_SWI_handle)加密,并将r0,r1寄存器作为函数
参数传递
5)处理完中断函数后恢复现场
6. C_SWI_handle 接受中断号和堆栈指针,通过堆栈指针开始从堆栈中获取参数数据,根据中断号选
择计算的程序逻辑,计算完成将结果再次写入堆栈
// 中断注册程序
unsigned Install_Handler (unsigned *handlerloc, unsigned *vector)
{
unsigned vec, oldvec;
vec = ((unsigned)handlerloc - (unsigned)vector - 0x8)>>2; // 确保中断处
理函数地址偏移在26位以内:正负32M
if ((vec & 0xFF000000) != 0) // 取低24位,即中断服务程序地址
{ return 0;}
vec = 0xEa000000 | vec; // 0xEa 应该时跳转指令B的操作码,这里表示跳转指
令:”B handlerloc“
oldvec = *vector;
*vector = vec; // 将中断向量表中断向量内写入跳转指令的编码,即
vec
return (oldvec);
}
SWI_Handler
STMFD sp!,{r0-r12,lr} ;保存现场
LDR r0,[lr,#-4] ;获取 SWI 指令
BIC r0,r0,#0xff000000 ;参数1,NUM
MOV R1, SP ;参数2,传递堆栈指针
BL C_SWI_Handler ;To Function
LDMFD sp!, {r0-r12,pc}^ ;处理完中断恢复现场,将最初的lr->pc,继续执行
SWI指令的下一条指令
END
或
7. 最后从堆栈中取出计算结果放到寄存器r0中
8. 中断结束,从堆栈中恢复现场,继续执行 SWI 指令后的指令
系统启动流程
以 S3C2410A 处理器的启动文件startup.s为例.
1. 系统上电后,先进行复位Reset
2. 设置PC的初始值0,执行Reset_Handler
3. Reset_Handler初始化需要干以下几件事
1)设置WT_Setup(Watchdog Timer)、CLK_Setup(Clock)、MC_Setup(Memory
Controller)、PIO_Setup(IO port)、Stack_Setup(Stack/Heap)
2)设置异常中断的模式的栈指针,包括Undefined、Abort、FIQ、IRQ、Supervisor、User
3)设置SRAM
4)堆栈空间的设置
5)进入C程序代码(__main -> init -> main)
void C_SWI_handler (int swi_num, int *reg )
{ switch (swi_num)
{
case 0 :
…… /* SWI number 0 code */
break;
case 1 :
…… /* SWI number 1 code */
break;
……
default :
break; /* Unknown SWI - report error */
}
return;
}
C_SWI_Handler
STMFD sp!,{r0-r12,lr}
CMP r0,#MaxSWI ; Range check
LDRLE pc, [pc,r0,LSL #2] ;(PC -> DCD SWInum0)
B SWIOutOfRange
SWIJumpTable
DCD SWInum0
DCD SWInum1
SWInum0 ; SWI number 0 code
B EndofSWI
SWInum1 ; SWI number 1 code
B EndofSW
EndofSW
SUB lr, lr, #4
LDMFD sp!, {r0-r12,pc}^
END
BL INISDRAM
如果调试时无法进入main,可能的原因是什么?
main单词拼写错误
启动代码不对
没有将main.c文件添加到工程文件中
Startup.s文件的功能和作用?
设置中断向量与中断服务程序地址
分配堆栈空间
设置时钟,看门狗Timer,内存控制,IO端口
设置中断入口IRQ_Entry
实现Reset_Handler
BootLoader移植需要修改什么代码?
管理和控制处理器内部设备的寄存器地址和数值。
不同处理器之间有差别的地方都需要进行修改。
LED显示实验
硬件配置
LED连接
LED连接
LED1 <--> GPF4
LED2 <--> GPF5
LED3 <--> GPF6
LED4 <--> GPF7
LED 控制
0 -> on
1 -> off
IMPORT __main
LDR R0, =__main
BX R0
剩余13页未读,继续阅读
吉利吉利
- 粉丝: 24
- 资源: 308
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Yolov8改进---注意力机制:Polarized Self-Attention,效果秒杀CBAM、SE.html
- 人才网站设计-asp.net+sql-(系统源码)
- asp.net+sql人才网站设计-含系统源码
- C#应用的用户配置窗体方案
- python实现绘制爱心图形的代码
- JAVAWEB项目-校园订餐系统项目源码.zip
- flink-1.19.0-bin-scala-2.12.tgz flink-1.16.3-bin-scala-2.12.tgz
- javaWeb项目-物资管理系统项目源码.zip
- javaweb项目-物流配货项目源码.zip
- 使用C++基于颜色纹理特征的人脸活体检测实现-附项目源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0