Встроенные функции сборки ARM в Emblocks или Keil

Как я могу написать встроенные функции сборки ARM в Emblocks или Keil для микроконтроллера STM32F429?


person Szilvia Lázár    schedule 23.07.2014    source источник
comment
Разве это не описано в руководстве к компилятору?   -  person Michael    schedule 23.07.2014
comment
Спасибо за вашу помощь, я уже нашел результат в этом документе. Спасибо!   -  person Szilvia Lázár    schedule 23.07.2014
comment
@ SzilviaLázár: Не могли бы вы поделиться тем, что вы нашли? Здесь настоятельно рекомендуется отвечать на свои вопросы.   -  person Jens Wirth    schedule 24.07.2014
comment
асм (асм инструкция; асм инструкция;);   -  person Szilvia Lázár    schedule 31.07.2014


Ответы (2)


Я уже отказался от поиска решения для inline сборки. Я буду счастлив, даже если найду решение для чистой сборки .s / .asm Я прочитал решение на странице Кейла, это нехорошо, но я почти хорошо работаю. У меня проблема, он не распознает константы типа # 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

(Это не ответ, но я не писал его в комментарии, потому что хотел хорошо отформатировать код.)

person Szilvia Lázár    schedule 07.08.2014
comment
#10? или #0x18? У меня есть старый проект для Keil, но для C51, и он использует, например, #07FH - person firda; 07.08.2014
comment
Должно работать так, как вы его разместили: keil.com/support/man/docs /armcc/armcc_chr1359124250179.htm - person firda; 07.08.2014
comment
Я получаю это для каждой строки, в которой # я пробовал # 10 # 0x10 new.s (9): error: A1859E: Форма сохранения флага этой инструкции недоступна. Если я не пишу #, это тоже проблема. - person Szilvia Lázár; 07.08.2014

Это должно работать в 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") (дополнительные параметры могут указывать регистры, входы, выходы).

Это мой код для ATSAM4L (Cortex-M4) в IAR EWARM:

__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();
}
person firda    schedule 26.07.2014
comment
К сожалению, это не работает. Он распознал регистры как простую переменную и не распознал константы, например №2. Я нашел в Keil: Use GCC (Project- ›Manage-› Components, Environment, Books- ›Folders / Extensions). Я выбираю Use GCC, я даю правильный путь и правильный префикс, но это не работает, я получаю сообщение об ошибке: Не удалось выполнить arm-none-eabias. Я попробовал это, потому что я тоже использую EmBmocks с компилятором GCC, и встроенная сборка руки там хорошо работает. Но мне нужно знать, как использовать его в Keil. - person Szilvia Lázár; 07.08.2014
comment
Очень жаль. Я использовал Keil с C51, но не использовал встроенную сборку (но .asm файлы). Попробуйте эту ссылку: keil.com/support/man/docs/armcc/ armcc_chr1359124246903.htm - person firda; 07.08.2014