如何在Emblocks或Keil for STM32F429微控制器中编写内联ARM汇编函数?
答案 0 :(得分:0)
这应该适用于Keil:
// #pragma ARM // would do the same as __arm below !
void ChangeIRQ (unsigned int NewState) __arm { // use ARM-mode for this function
__asm {
AND R0,R0,#0 //
MRS R0,CPSR //
ORR R0,R0,#0x80; //
LDAV R1,R10,NewState // load parameter-value 'NewState' into R1
BIC R0,R0,R1,LSL #7 //
MSR CPSR_c, R0 //
}
}
我不了解EmBlocks,但是IAR和GCC允许内联结构,如asm或__asm(" mov 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 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();
}
答案 1 :(得分:0)
我已经放弃了为内联汇编找到解决方案。即使我找到纯粹装配的解决方案 .s / 。我会很高兴我在Keil的页面上读了一个解决方案,这不好,但我几乎工作了。我有一个问题,它不承认像#2
这样的de constans以下是示例:
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
(这不是答案,但我没有在评论中写出来,因为我想很好地格式化代码。)