学单片机有必要学汇编吗?ChatGPT给出的答案我无力反驳
来源:嵌入式专栏发布时间:2023-03-06260浏览
询问 AI
作者 |strongerHuang微信公众号|嵌入式专栏
做嵌入式软件开发,如果是做上层应用开发,可能不会遇到汇编代码。
但如果你是做底层的软件开发,比如驱动,你遇到汇编的概率比较大。
那么,学单片机有必要学汇编吗?这里,ChatGPT给出了一份答案:

下面给大家分享一些常见的与汇编有关的内容。
嵌套汇编与编译器有关
有认真研究,或者说细心一点的读者应该都知道:C中定义汇编代码与编译器有关。比如:你在core_cm4.h文件会看到如下的代码:
#if defined ( __CC_ARM )#define __ASM __asm /*!< asm keyword for ARM Compiler */#define __INLINE __inline /*!< inline keyword for ARM Compiler */#define __STATIC_INLINE static __inline#elif defined ( __GNUC__ )#define __ASM __asm /*!< asm keyword for GNU Compiler */#define __INLINE inline /*!< inline keyword for GNU Compiler */#define __STATIC_INLINE static inline#elif defined ( __ICCARM__ )#define __ASM __asm /*!< asm keyword for IAR Compiler */#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */#define __STATIC_INLINE static inline#elif defined ( __TMS470__ )#define __ASM __asm /*!< asm keyword for TI CCS Compiler */#define __STATIC_INLINE static inline#elif defined ( __TASKING__ )#define __ASM __asm /*!< asm keyword for TASKING Compiler */#define __INLINE inline /*!< inline keyword for TASKING Compiler */#define __STATIC_INLINE static inline#elif defined ( __CSMC__ )#define __packed#define __ASM _asm /*!< asm keyword for COSMIC Compiler */#define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */#define__STATIC_INLINEstaticinline#endif

如果你写过Keil C51,你还会发现有如下(通过预处理)嵌套汇编:
#pragma asm; Assembler Code Here#pragma endasm
所以,你会发现,不同的编译器,汇编代码还是有差异。当然,这里主要是说C中嵌套汇编与编译器有关。
C中嵌套汇编代码
常见两种定义:1.在C函数中定义一段汇编代码;2.在C文件中定义一个汇编函数;(当然,两个意思差不多,都是在C中嵌套汇编)上面说了C中定义汇编代码与编译器有关,换句话说:不同编译器解析汇编代码的方式不同。
这里还是拿core_cm3.c来举例说明,定义一个__get_PSP函数。
在Keil MDK中定义:
__ASM uint32_t __get_PSP(void){mrs r0, pspbx lr}
在IAR EWARM中定义:
uint32_t __get_PSP(void){__ASM("mrs r0, psp");__ASM("bx lr");}
__asm(__ASM)关键字用于调用内联汇编程序,并且可在 C 或 C++ 语句合法时出现。
案例
下面举一些常见例子。1.FreeRTOS中portmacro.h文件下源代码:
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}}
2.FreeRTOS中port.c文件下源代码:
__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, #configMAX_SYSCALL_INTERRUPT_PRIORITYmsr basepri, r0dsbisbbl vTaskSwitchContextmov r0, #0msr 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}
3.内核复位
这是之前分享过的一篇文章《STM32复位来源》中的代码:
__asm void NVIC_CoreReset_a(void){LDR R0, =0xE000ED0CLDR R1, =0x05FA0001STR R1, [R0]deadloop_CoreB deadloop_Core}
看了这些案例,也确实用到汇编。那么,你觉得学单片机有必要学汇编吗?
正如ChatGPT所言,对于普通嵌入式开发者,有必要学习汇编基础的内容,但不必深入学习,我们只需要明白大概的含义即可。


新闻来源:嵌入式专栏,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。

