嵌入式技术
单片机开发或多或少都会接触一些汇编代码,今天就来说说关于汇编在C中的定义和调用,以及举例说明嵌套汇编代码。
概述
有认真研究,或者说细心一点的读者应该都知道:C中定义汇编代码与编译器有关。
比如:你在core_cm4.h文件会看到如下的代码:

所以,你会发现,不同的编译器,汇编代码还是有差异。当然,这里主要是说C中嵌套汇编与编译器有关。; Assembler Code Here
C中嵌套汇编代码
常见两种定义:
1.在C函数中定义一段汇编代码;
2.在C文件中定义一个汇编函数;
(当然,两个意思差不多,都是在C中嵌套汇编)上面说了C中定义汇编代码与编译器有关,换句话说:不同编译器解析汇编代码的方式不同。 这里还是拿core_cm3.c来举例说明,定义一个__get_PSP函数。 在Keil MDK中定义:
在IAR EWARM中定义:__ASM uint32_t __get_PSP(void){mrs r0, pspbx lr}
__asm(__ASM)关键字用于调用内联汇编程序,并且可在 C 或 C++ 语句合法时出现。 看到这里,推荐阅读我分享的一篇文章:单片机用汇编和C语言点灯程序的区别uint32_t __get_PSP(void){__ASM("mrs r0, psp");__ASM("bx lr");}
举例
下面举一些常见例子。
1.FreeRTOS中portmacro.h文件下源代码:2.FreeRTOS中port.c文件下源代码:static portFORCE_INLINE void vPortRaiseBASEPRI( void ){uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;__asm{/* Set BASEPRI to the max syscall priority to effect a critical section. */msr basepri, ulNewBASEPRIdsbisb}}
3.内核复位这是之前分享过的一篇文章《STM32复位来源》中的代码:__asm void xPortPendSVHandler( void ){extern uxCriticalNesting;extern pxCurrentTCB;extern vTaskSwitchContext;PRESERVE8mrs r0, pspisbldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ldr r2, [r3]stmdb r0!, {r4-r11} /* Save the remaining registers. */str r0, [r2] /* Save the new top of stack into the first member of the TCB. */stmdb sp!, {r3, r14}mov r0,msr basepri, r0dsbisbbl vTaskSwitchContextmov r0,msr basepri, r0ldmia sp!, {r3, r14}ldr r1, [r3]ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ldmia r0!, {r4-r11} /* Pop the registers and the critical nesting count. */msr psp, r0isbbx r14nop}
举了这些常见例子,没有说透,但相信只要认真理解了都能明白。__asm void NVIC_CoreReset_a(void){LDR R0, =0xE000ED0CLDR R1, =0x05FA0001STR R1, [R0]deadloop_CoreB deadloop_Core}
全部0条评论
快来发表一下你的评论吧 !