|
|
  |
Возврат из прерывания, и LINK регистр |
|
|
|
Sep 29 2012, 14:27
|

Частый гость
 
Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987

|
Начинаю писать для STM32, что бы немного приблизиться к пониманию самого ARMа, хочу написать свой scheduler. Т.е. одну функцию RTOS, которая бы в SysTick подменяла бы адреса возврата так сказать на разные процедуры. Немного не получалось, написал вот такой простой исходник(и не могу объяснить значение LR регистра). Итак. САМ код: Код #include <stdint.h> #define STM32F10X_MD #include "stm32f10x.h" #define SYSCLK_FREQ_HSE
unsigned long AAA;
void f1(void) { AAA=1; }
void f2(void) { AAA=2; }
void SysTick_Handler(void){ f1(); f2(); }
int main(void) { SysTick_Config(1600); while(1) {
} } В дизасме следующее: Код 11: AAA=1; 0x08000388 2001 MOVS r0,#0x01 0x0800038A 4919 LDR r1,[pc,#100]; @0x080003F0 0x0800038C 6008 STR r0,[r1,#0x00] 12: } 13: 14: void f2(void) 15: { 0x0800038E 4770 BX lr 16: AAA=2; 0x08000390 2002 MOVS r0,#0x02 0x08000392 4917 LDR r1,[pc,#92]; @0x080003F0 0x08000394 6008 STR r0,[r1,#0x00] 17: } 18: 0x08000396 4770 BX lr 19: void SysTick_Handler(void){ 0x08000398 B500 PUSH {lr} 20: f1(); 0x0800039A F7FFFFF5 BL.W f1 (0x08000388) 21: f2(); 0x0800039E F7FFFFF7 BL.W f2 (0x08000390) 22: } 23: 24: int main(void) 25: { ТУТ всякая фигня от SysTickConfig---> Рассматривать ее не будем.
27: while(1) 0x080003EC BF00 NOP 0x080003EE E7FE B 0x080003EE ---> Волшебный While(1) Как только случается SysTickHandler я нахожусь 19: void SysTick_Handler(void){ 0x08000398 B500 PUSH {lr}--------------------------------------->ВОТ здесь 20: f1(); 0x0800039A F7FFFFF5 BL.W f1 (0x08000388) 21: f2(); 0x0800039E F7FFFFF7 BL.W f2 (0x08000390) Но при этом вижу LR=0xFFFFFFF9 Вопрос, почему если точка, с которой я ушел имела адрес 0x080003EE E7FE B 0x080003EE ---> Волшебный While(1) Откуда может быть такое значение LR ? По идее, как я понял, в LR сохраняется значение PC (счетчик команд). И еще хотел бы попросить в теме, если кто знает, глянуть какой нибудь простой "Планировщик" для ARM. FreeRTOS ломать для понимания не хочется(сильно много лишних для новичка наворотов). Есть ли GPL проекты по проще ?
Сообщение отредактировал IXFN50N80Q2 - Sep 29 2012, 14:32
|
|
|
|
|
Sep 29 2012, 14:47
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(IXFN50N80Q2 @ Sep 29 2012, 17:27)  Т.е. одну функцию RTOS, которая бы в SysTick подменяла бы адреса возврата так сказать на разные процедуры. Немного не получалось, написал вот такой простой исходник(и не могу объяснить значение LR регистра). Обычно для переключения задачи используют PendSV_Handler. Цитата(IXFN50N80Q2 @ Sep 29 2012, 17:27)  Но при этом вижу LR=0xFFFFFFF9 Вопрос, почему если точка, с которой я ушел имела адрес 0x080003EE E7FE B 0x080003EE ---> Волшебный While(1) Откуда может быть такое значение LR ? По идее, как я понял, в LR сохраняется значение PC (счетчик команд). Видимо в LR не то что вы ожидаете увидеть (ищите в мануале Exception return и тп) Цитата 0xFFFFFFF9 Return to Thread mode. Exception return gets state from MSP. Execution uses MSP after return. Цитата(IXFN50N80Q2 @ Sep 29 2012, 17:27)  Есть ли GPL проекты по проще ? ScmRtos.
|
|
|
|
|
Sep 29 2012, 20:41
|

Частый гость
 
Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987

|
Думаю что тему не стоит "превращать" в "флейм", и по этому, хотел бы узнать, какие вы книги рекомендуете почитать по CORTEX M3. Желательно буржуйские, англоязычные т.к. русские переводы, к сожалению, не совсем точны.
PS: ДЛЯ AVR примеров хватает, у меня есть железо как и с AVR, так и с PIC, так и с STM32, при пробах все можно узнать. По "быдлокоду", я не решаюсь на ОС для PIC или AVR.(8 битки они, а нужен FLOAT, аппаратное деление ХАЧУ). Я решаюсь на ARM т.к. мне нужна будет в будущем четкая синхронизация процессов. Т.е. что бы фактически программа, или процедура(функция) четко отрабатывала по функциям и я бы управлял процессом, а не RTOS. По этому, мне нужно понимание самой архитектуры.
"Быдлокод" я и так недавно написал, без FreeRTOS, но это не то, хочу "духовной красоты"
Под аппаратным делением я имею ввиду UINT32/UINT32 как таковой FPU не требуется
Сообщение отредактировал IXFN50N80Q2 - Sep 29 2012, 20:44
|
|
|
|
|
Sep 29 2012, 22:00
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(IXFN50N80Q2 @ Sep 29 2012, 23:41)  Желательно буржуйские, англоязычные т.к. русские переводы, к сожалению, не совсем точны. Иногда производители прикладывают к документации описание ядра, но для STM32 я его что-то не нахожу. Остаётся читать мануал на сайте АРМ (Cortex™-M3 Technical Reference Manual нужной версии - их несколько). P.S. Ваша ссылка из Сообщения 3 указывает на Cortex-M0, а не на M3. Цитата(IXFN50N80Q2 @ Sep 29 2012, 23:41)  По "быдлокоду", я не решаюсь на ОС для PIC или AVR. Скорости не хватает? При чём тут "быдлокод"? Цитата(IXFN50N80Q2 @ Sep 29 2012, 23:41)  (8 битки они, а нужен FLOAT, аппаратное деление ХАЧУ) Float на AVR конечно есть, но медленный. Цитата(IXFN50N80Q2 @ Sep 29 2012, 23:41)  Т.е. что бы фактически программа, или процедура(функция) четко отрабатывала по функциям и я бы управлял процессом, а не RTOS. Как напишете.
|
|
|
|
|
Sep 29 2012, 23:17
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
Цитата(_Артём_ @ Sep 30 2012, 00:27)  Где там куски кода? Вы с АВР не путаете? Не путаю. Скачиваете с сайта ARM документ "ARMv7-M Architecture Reference Manual" и читаете  Особенно много их в части B, "System Level Architecture". Да и вся система команд расписана этим быдлокодом, а не нормальными словами (глава A7, "Instruction Details"). Цитата(_Артём_ @ Sep 30 2012, 02:00)  Иногда производители прикладывают к документации описание ядра, но для STM32 я его что-то не нахожу. Остаётся читать мануал на сайте АРМ (Cortex™-M3 Technical Reference Manual нужной версии - их несколько) А зачем программисту описание ядра? Ему нужно описание архитектуры -- регистры, система команд, прерывания, защита памяти и т.д. Ну а нюансы реализации архитектуры в конкретной версии ядра нужны крайне редко (разве что список ошибок в железе, которые допустили создатели ядра).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|