Как я могу написать встроенные функции сборки ARM в Emblocks или Keil для микроконтроллера STM32F429?
Встроенные функции сборки ARM в Emblocks или Keil
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
#10
? или #0x18
? У меня есть старый проект для Keil, но для C51, и он использует, например, #07FH
- person firda; 07.08.2014
Должно работать так, как вы его разместили: keil.com/support/man/docs /armcc/armcc_chr1359124250179.htm
- person firda; 07.08.2014
Я получаю это для каждой строки, в которой # я пробовал # 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
К сожалению, это не работает. Он распознал регистры как простую переменную и не распознал константы, например №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
Очень жаль. Я использовал Keil с C51, но не использовал встроенную сборку (но
.asm
файлы). Попробуйте эту ссылку: keil.com/support/man/docs/armcc/ armcc_chr1359124246903.htm
- person firda; 07.08.2014