Assembly Emblocks或Keil中的内联臂装配功能
对于STM32F429微控制器,如何在Emblocks或Keil中编写内嵌ARM汇编函数 这应该适用于: 我不知道EmBlocks,但IAR和GCC允许像asm或_asmmov x,y这样的内联指令。更多参数可以指定寄存器、输入和输出 这是我在IAR EWARM中ATSAM4L Cortex-M4的代码:Assembly Emblocks或Keil中的内联臂装配功能,assembly,arm,microcontroller,keil,Assembly,Arm,Microcontroller,Keil,对于STM32F429微控制器,如何在Emblocks或Keil中编写内嵌ARM汇编函数 这应该适用于: 我不知道EmBlocks,但IAR和GCC允许像asm或_asmmov x,y这样的内联指令。更多参数可以指定寄存器、输入和输出 这是我在IAR EWARM中ATSAM4L Cortex-M4的代码: __no_init uint reset_addr; __no_init uint reset_reta; __no_init uint reset_hfs; __no_init uint r
__no_init uint reset_addr;
__no_init uint reset_reta;
__no_init uint reset_hfs;
__no_init uint reset_cfs;
extern "C" {
void HardFault(uint* stack);
__noreturn void HardFault_Handler() {
// tst lr, #4
// ite eq
// mrseq r0,MSP
// mrsne r0,PSP
asm volatile ("MRS r0,MSP\nB HardFault"); }
void HardFault(uint* stack) {
enum { r0, r1, r2, r3, r12, lr, pc, psr};
reset_hfs = scb->hfs; // fetch
scb->hfs = reset_hfs; // clear
reset_cfs = scb->cfs;
reset_addr = 0; reset_reta = 0;
if(reset_hfs&SCB::FORCED) {
reset_addr = stack[pc];
reset_reta = stack[lr]; }
// asm volatile ("BKPT 1");
scb->softres();
}
我已经放弃为内联程序集寻找解决方案。即使我找到了纯汇编的解决方案,我也会很高兴。s/.asm我在Keil的页面上读到了一个解决方案,它不好,但我几乎每周都在工作。我有一个问题,它不承认德康斯坦斯像2 以下是一个例子:
AREA ARMex, CODE, READONLY
; Name this block of code ARMex
ENTRY ; Mark first instruction to execute
start
MOV r0, #10 ; Set up parameters
MOV r1, #3
ADD r0, r0, r1 ; r0 = r0 + r1
stop
MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SVC #0x123456 ; ARM semihosting (formerly SWI)
END ; Mark end of file
这不是一个答案,但我没有写在注释中,因为我想把代码格式化好。这不是编译器手册中描述的吗?谢谢你的帮助,我已经在本文档中找到了结果。谢谢@你能分享一下你的发现吗?这里明确鼓励回答自己的问题;asm指令;不幸的是,它不起作用。它将寄存器识别为一个简单变量,而不识别constans(例如2)。我在Keil中发现:Use GCC Project->Manage->Components,Environment,Books->Folders/Extensions我选择Use GCC,我给出了一个正确的路径和前缀,但它不起作用,我得到错误消息:无法执行arm none eabias'我尝试过这个,因为我在GCC编译器中也使用EmBmocks,并且内嵌的arm程序集在那里工作得很好。但我需要知道我应该如何在Keil中使用它。太糟糕了。我在C51中使用Keil,但没有使用内联汇编,而是使用.asm文件。试试这个链接:10?还是0x18?我有一些关于Keil的老项目,但是对于C51,它使用了例如07FH应该像你发布的那样工作:我在每一行中都得到了这个,我尝试了10 0x10 new。s9:错误:A1859E:这个指令的标志保留形式不可用,如果我不写,那么这也是问题。
AREA ARMex, CODE, READONLY
; Name this block of code ARMex
ENTRY ; Mark first instruction to execute
start
MOV r0, #10 ; Set up parameters
MOV r1, #3
ADD r0, r0, r1 ; r0 = r0 + r1
stop
MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SVC #0x123456 ; ARM semihosting (formerly SWI)
END ; Mark end of file