通过Keil5,在stm32H743非中断模式下,使用主堆栈指针下的汇编语句查看。理解这个汇编逻辑后,将有利于更自由的进行程序调试,查找BUG。
文章涉及的汇编指令可以在工程中左侧:book→Device Data Books→Cortex-M7 Generic User Guide中查找。
目录
1 查看堆栈
通过调试模式下的Memory窗口,可以看到:
1、单片机是小端模式,
2、入栈是从后往前压,显然出栈应该是从前往后出。
3、栈是向下增长的。
4、从地址上还能看出,栈是存储在RAM中的

2 函数运行流程与汇编语言
2.1 没有输入参数而有输出参数的函数调用
这是C语言:
HAL_StatusTypeDef HAL_Init(void)
{
/* Set Interrupt Group Priority */
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
/* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK)
{
return HAL_ERROR;
}
/* Init the low level hardware */
HAL_MspInit();
/* Return function status */
return HAL_OK;
}
这是C语言对应的汇编:

首先,调用者通过跳转指令修改了PC、LR寄存器。
然后,被调用者内如果会调用其他函数,则会把LR寄存器压入栈中,如果有相关运算还需要使用寄存器,则也把这些寄存器压到栈中。程序运行结束时,把通用寄存器推出,并把有LR寄存器压入栈的值推导PC寄存器中。
| 状态 |
C语言 (箭头表示程序中断的位置) |
黑色汇编,蓝色为说明 |

本文深入解析STM32H743微控制器在非中断模式下,如何通过Keil5环境利用汇编语言与C语言进行交互,重点讲解函数调用过程、堆栈管理及业务逻辑实现。通过具体实例,揭示了函数入栈、出栈机制,以及参数传递方式,对理解嵌入式系统底层操作具有重要意义。
最低0.47元/天 解锁文章
435

被折叠的 条评论
为什么被折叠?



