хочу написать свой 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)
{
}
}
#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)
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 проекты по проще ?