在Emblocks或Keil中的内联ARM汇编函数

时间:2014-07-23 08:20:57

标签: assembly arm microcontroller keil

如何在Emblocks或Keil for STM32F429微控制器中编写内联ARM汇编函数?

2 个答案:

答案 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

(这不是答案,但我没有在评论中写出来,因为我想很好地格式化代码。)