物联网|探索cortex-M系列CPU的内核|C代码中调用汇编函数|直接加入汇编语句|寄存器及处理器模式|物联网开发系列课程之零基础玩转Cortex-M系列CPU-学习笔记(3)

C代码中调用汇编函数

tip1:如何写一个汇编函数

示例:READONLY后增加汇编函数

在这里插入图片描述

		 EXPORT ADD_OPT
ADD_OPT	FUNCTION
		ADD R0, R0,#1
		BX	LR
		ENDFUNC

在这里插入图片描述

主函数内增加调用:

extern int ADD_OPT(void);  //如果不加void,编译器会提示warn:warning: function declaration isn’t a prototype(函数声明不是原型)

int main(void)
{
	int i = 0;

	i = i +1 ;

	ADD_OPT();
}

调试模式,reset,按F11单步执行:
在这里插入图片描述
执行了add+1操作:
增加mov 查看R1的值:
在这里插入图片描述

C代码中直接加入汇编语句

·嵌入的汇编语句
__asm{
汇编函数或代码
}
.内联的汇编语句
例如:

int main(void)
{
	int i = 0;

	i = i +1 ;

	int r1; //若无此定义会提示:Implicit physical register R1 should be defined as a variable

	__asm

	{
		ADDS r1,#1
	}
}

__asm void add_opt()
{

		ADDS R0,R1

		BX LR
}

C语言中内嵌汇编asm语法可参考博文.

Tips:MDK注释显示中文

MDK的编码设置为chinese2312(Edit>Configuration>Editor>Encoding)。

Cortex-M架构CPU内核的寄存器及处理器模式

Cortex-M架构CPU内核寄存器

在这里插入图片描述
在这里插入图片描述

演示

打开启动文件,进入调试状态,reset:
F:\IOT\PRJ\first_prj\RTE\Device\STM32F407ZGTx\startup_stm32f407xx.s
在这里插入图片描述
执行一步,LR值变化:
在这里插入图片描述
增加指令: MOV R1,PC,
在这里插入图片描述
重新编译:
调试,reset,看一下PC的值:
在这里插入图片描述
由于是流水线指令,看到的值不同(实际上是当前地址+4后的值):

要特殊说明的几个寄存器

R13 MSP/PSP
R14 LR
R15 PC
2 特殊寄存器
程序状态奇存器 xPSR
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Cortex-M架构CPU处理器操作状态,模式和特权级别

1 操作状态
Debug 状态
Thumb状态 (执行Thumb指令)
2 特权等级和操作模式
两种特权等级
特权级
非特权级(用户级):禁止写特殊寄存器和特殊状态寄存器
两种操作模式
Handler模式
Thread(线程)模式
在这里插入图片描述

3各状态和各模式及等级间的切换
在这里插入图片描述
在这里插入图片描述

MDK中的演示

更改internal中的CONTROL的0位为1:
在这里插入图片描述
在这里插入图片描述

影响到的值反色显示,变成了unprivilege在这里插入图片描述

更改internal中的CONTROL的0位为3:
在这里插入图片描述

SP寄存器置0.继续执行,触发中断:
在这里插入图片描述

HardFault_Handler
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Medlar_CN/article/details/130508445