赞
踩
初始化堆栈指针SP
初始化程序计数器指针PC
设置堆、栈的大小
设置异常向量表的入口地址
配置外部SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM)
设置C库的分支入口__main(最终用来调用main函数)
PendSV
定义:可悬起异常,如果我们把它配置为最低优先级,那么如果同时有多个异常被触发,他会再其他异常执行完毕后再执行,而且任何异常都可以打断它。
PendSV典型使用场合是上下文切换时(在不同任务之间切换)上下文切换被触发的场合可以是: (1):执行一个系统调用。 比如 OSSched(); // 执行任务调用。 (2):系统滴答定时器(SYSTICK)中断,(轮转调度中需要)。
SVCall
简述:一种由程序进行触发的中断,默认开启
起源:SVC(系统服务调用,亦简称系统调用)多用于在操作系统之上的软件开发中。SVC 用于产生系统函数的调用请求。例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件。因此,当用户程序想要控制特定的硬件时,它就会产生一个 SVC 异常,然后操作系统提供的 SVC 异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。
用途:可以通过设置,使得一段代码能够被某些中断打断,而不能被另外一些中断打断,比如可用于确保模拟IIC的时序不被打断而造成通信失败
注意: SVC 异常是必须立即得到响应的(若因优先级不比当前正处理的高,或是其它原因使之无法立即 响应,将引发HardFault) 主从优先级等等概念和普通中断相同(且地位相同,即该特殊中断其实也不特殊)//祝:默认情况下,除HardFault和NMI,其它中断的优先级均为0,0(附加提醒,group设置需先于priority设置)
b与bl指令的作用是什么?
实现程序跳转,也就是调用子程序。
b与bl指令的区别是什么?
b指令:简单的程序跳转,跳转到到目标标号处执行。
bl指令:带链接程序跳转,也就是要带返回地址。在发生跳转前,将当前PC-4保存到R14中。 也就是返回地址存在R14中,所以可以在子程序返回时只要MOV PC, LR即可。
b与bl指令分别如何使用?使用时注意事项有哪些?举例说明。
b . ;死循环。"."--表示当前地址。
b reset ;跳入reset处理程序
bl label ;跳入label函数,同时将当前PC-4保存到R14中
BX、BLX、BXJ
BX:跳转并切换指令集。
BLX:带链接跳转并切换指令集。
BXJ:跳转并转换为 Jazelle 执行。
1、EQU(Equate)
一般格式为: 标号: EQU 操作数 指令功能为将操作数赋予标号,两边的值完全相等。使用EQU伪指令给一个标号赋值后,此标号在整个源文件中值固定。 AREA: EQU 1000H ;将标号AREA赋值为1000H
2、ORG(Origin)
一般格式为: ORG xxxxH(绝对地址或标号) XxxxH决定此语句后第一条指令(或数据)的地址。该段源程序或数据被连续存放在此后的地址内,直到下一条ORG指令为止。 ORG 8000H ;此后目标代码存储在存储器中以0x8000h开始的地址空间中。 ADD R1,#1 MOV R2,#2
3、DB(Define Byte)
一般格式为:标号:DB 字节常数或字符或表达式 标号字段可有可无,字节常数或字符是指一个字节数据。此伪指令的功能是把字节常数或字节串存放至内存连续的地址空间中。 ORG 8000H DATA1:DB 43H,09H,08H DATA2:DB 07H 伪指令DB指定了43H,09H,08H 顺序存放在8000H开始的存储单元中,DATA2中的07H紧挨着DATA1的地址空间存放,即07H存放在8003H单元中。 注:DW(Define Word)指令定义与DB类似,区别在于DW定义一个字,DB定义一个字节。
4、END
一般格式为:标号:END 地址或标号 地址或标号可以忽略。此伪指令用于指示汇编语言程序段结束。因此一个源程序中仅有一个END,且一般放在程序最后。若END放在程序中间,则END后面的语句将不再被汇编。
5、AREA
一般格式为:标号 sectionname{,attr}{,attr}…… Sectionname指定节的名称。节是不可分的已命名独立代码模块或数据模块,由连接器进行处理。 Attr则是一个或多个用逗号分隔的节的属性。
6、PUBLIC
一般格式为:PUBLIC 标识符1,标识符2…… 在开发较为复杂的应用程序时,其执行文件的生成一般由多个目标文件链接而成。多个目标文件之间一般存在数据交互,汇编语言中通过伪指令PUBLIC及EXTRN来解决模块之间的联系。PUBLIC用来说明当前模块中可被其他模块所引用的公共标识符。 PUBLIC _STARTUP 声明标识符_STARTUP可被其他模块所引用。
7、EXTRN或EXTERN
一般格式为:EXTRN 标识符1:类型1,标识符2:类型2……. 表明标识符1、2是外部标识符,其已经在其他模块中被定义为类型1、类型2等。在一个模块中,可用多条EXTRN来说明本模块中所引用的外部标识符。实质为汇编器提供一个并未在当前汇编文件中定义的名称。 注:EXTRN所声明的标识符必须在其定义的模块中被PUBLIC声明为公共标识符,且声明的标识符类型需与该标识符定义类型一致。 类似:EXPORT或GLOBAL 声明一个符号,链接器可以使用此符号解析不同对象和库文件中的符号引用。即,可使其他文件中的代码能够访问当前文件中的符号。
8、PROC
一般格式为:<过程名> PROC [类型] 此指令为过程定义指令。过程即子程序,一个过程可以被其他程序调用(CALL指令)。 <过程名> PROC [类型] ……. ……. ENDP 注: PROC和ENDP必须成对出现。
9、SPACE
一般格式为:标号 SPACE 表达式 此指令用于分配一片连续的存储区域并初始化为0。表达式为要分配的字节数。SPACE可用“%”来代替。 DataSpace SPACE 1000 ;分配连续1000个字节的存储单元DataSpace并初始化为0。
10、ENTRY
此指令用于声明程序的入口点。一个程序至少有一个入口点。 AREA TEST, CODE, READONLY ENTRY ;程序入口点。
11、PRESERVE8
一般格式为:PRESERVE8 {bool} PRESERVE8指令指定当前文件需保持堆栈八字节对齐方式。其通过设置PRES8编译属性通知连接器。 PRESERVE8 ;保持代码堆栈八字节对齐。 PRESERVE8 {FALSE} ;不保持代码堆栈八字节对齐。
12、CODE16、CODE32
一般格式为:CODE16(或CODE32) CODE16通知编译器,其后的指令序列为16位的Thumb指令。 CODE32通知编译器,其后的指令序列为32位的ARM指令。 在实用ARM指令和Thumb指令混合编程的代码里,可使用这两天指令进行切换。注:指令只能通知编译器其后的指令类型,并不能对处理器进行状态的切换。
13、IMPORT
此指令类似于EXTERN。用于通知编译器即将使用的标号在其他源文件中定义。无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。 一般格式为:IMPORT 标号 {[WEAK]} 标号在程序中区分大小写,[WEAK]表示当所有源文件中均找不到此标号时,编译器也不会显示错误信息。 AREA INIT, CODE, READONLY IMPORT Main ;通知编译器当前文件要引用标号Main,但其定义在其他源文件中。
14、DCD( Data Definition )
语法格式: 标号 DCD (或 DCDU ) 表达式 DCD (或 DCDU )伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。 DCD 也可用 “ & ” 代替。 用 DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严格字对齐。 使用示例: DataTest DCD 4 , 5 , 6 ;分配一片连续的字存储单元并初始化。
扩充
因为从思维导图到大纲模式的排版真心不咋地,感兴趣的小伙伴可关注公众号,【嵌入式学习之从入门到放弃】获取思维导图版。
欢迎各位大佬,新手指教。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。