|
RTOS, тупые вопросы |
|
|
|
Jun 3 2016, 12:47
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Привет, друзья!
Вот изучаю как делают RTOS и имею ряд нубских вопросов:
1. Для чего каждая задача в ртосах оформляется в вечный цикл? Чтобы не быть завершенной и забытой "естественным путем"? А если задача больше не нужна, то ее надо прибивать самому с помощью какой-нибудь, условно говоря, os_task_kill(this_task)? 2. Конкретно под Cortex-M4. Как понять какие именно регистры сохранять, а какие - не сохранять при переключении контекста (не считая R0-R3, SP, LR, PC)? 3. Для начала достаточно ли будет делать только переключение контекста в PendSV_Handler шедулером или есть еще какие-либо тонкости? 4. Где физически находятся все эти стеки, на которые указывают регистры?
Спасибо!
|
|
|
|
|
 |
Ответов
|
Jun 8 2016, 10:53
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Еще вопросы. Значит, написал вот такой код: main.c:Код #define TASK_STK_SIZE 2048 uint32_t task1_stk[TASK_STK_SIZE];
void task1(void* x) { while(1) { led_toggle(led); //printf("@ task1\n"); } }
int main(void) { configure_clocks(); led = led_create(GPIOE, 6); os_add_task("task1", task1, (void*) 0x555, task1_stk, TASK_STK_SIZE); os_start(); while(1); } scheduler.c:Код typedef struct task_descriptor { uint32_t* stk_ptr; uint16_t stk_size; task_handler handler; void* args; task_state state; char* name; } task_descriptor;
static uint8_t tasks_used = 0; static task_descriptor* tasks[MAX_TASKS];
__asm void _run_process(uint32_t* stk_ptr) { LDR R4, [R0, #(4*14)] ADD R0, R0, #(4*16) MSR PSP, R0 MOV R0, #2 MSR CONTROL, R0 CPSIE I BX R4 }
void os_add_task(char* name, task_handler task, void *args, uint32_t* stk_ptr, uint32_t stk_size) { tasks[tasks_used]->name = name; tasks[tasks_used]->handler = task; tasks[tasks_used]->args = args; tasks[tasks_used]->stk_size = stk_size; tasks[tasks_used]->state = RUN; tasks[tasks_used]->stk_ptr = (uint32_t*) ((uintptr_t) stk_ptr & 0xFFFFFFF8); *(--tasks[tasks_used]->stk_ptr) = 0x01000000L; *(--tasks[tasks_used]->stk_ptr) = (uint32_t)(task); tasks[tasks_used]->stk_ptr -= 14; //init_stack(task, &stk_ptr[stk_size-1]); if(tasks_used < MAX_TASKS) tasks_used++; printf("# created task: %s\n", name); }
void os_start(void) { printf("# starting OS...\n"); _run_process(tasks[0]->stk_ptr); } Инициализацию стека задачи и ассемблерный код пока взял из scmrtos (спасибо за наводку!). Мои вопросы вот в чем: 1. Правильно ли я понимаю: стек задачи - это просто область памяти (в моем случае task1_stk), конец которой заполняется таким образом, чтобы получить в ней значения регистров процессора как при переключении контекста (среди прочего там сидит и указатель на задачу). А далее асмовым (как правило) кодом из этого куска памяти значения тупо переписываются в регистры, после чего все как бы указывает на нужную нам задачу. 2. Приведенный выше код вроде как работает - в задачу task1 входит и крутится в ней. Но если раскомментировать printf в задаче task1, то проц уходит в MemFault (MemManage_Handler) сразу же в самой первой команде printf'а (судя по дизассемблеру). Почему так? 3. Не очень понятна запись tasks[tasks_used]->stk_ptr = (uint32_t*) ((uintptr_t) stk_ptr & 0xFFFFFFF8);. Для чего нужно выравнивание по 8 байтам?
|
|
|
|
Сообщений в этой теме
spectr RTOS, тупые вопросы Jun 3 2016, 12:47 AlexandrY Цитата(spectr @ Jun 3 2016, 15:47) Спасиб... Jun 3 2016, 13:18 yes 1. необязательно. но есть некие упрощения (наприме... Jun 3 2016, 13:22 AlexandrY Цитата(yes @ Jun 3 2016, 16:22) 2. в порт... Jun 3 2016, 15:14 spectr Цитата(AlexandrY @ Jun 3 2016, 16:18) Не ... Jun 6 2016, 05:35 AlexandrY Цитата(spectr @ Jun 6 2016, 08:35) Эммм, ... Jun 6 2016, 08:31  spectr Цитата(AlexandrY @ Jun 6 2016, 11:31) И г... Jun 6 2016, 09:04 yes Цитата(spectr @ Jun 6 2016, 08:35) Не пор... Jun 6 2016, 12:19  AlexandrY Цитата(yes @ Jun 6 2016, 15:19) про MQX -... Jun 6 2016, 12:38   yaghtn Цитата(AlexandrY @ Jun 6 2016, 15:38) MQX... Jun 7 2016, 05:51   dxp QUOTE (AlexandrY @ Jun 6 2016, 18:38) А н... Jun 7 2016, 06:51   AHTOXA Цитата(AlexandrY @ Jun 6 2016, 17:38) scm... Jun 7 2016, 06:59    AlexandrY Цитата(AHTOXA @ Jun 7 2016, 09:59) Всё по... Jun 7 2016, 07:03     dxp QUOTE (AlexandrY @ Jun 7 2016, 13:03) Пра... Jun 7 2016, 07:18      AlexandrY Цитата(dxp @ Jun 7 2016, 10:18) Покажите ... Jun 7 2016, 09:14       dxp QUOTE (AlexandrY @ Jun 7 2016, 15:14) Да ... Jun 7 2016, 09:30        esaulenka Цитата(dxp @ Jun 7 2016, 12:30) Не знаком... Jun 7 2016, 16:02   yes Цитата(AlexandrY @ Jun 6 2016, 15:38) К л... Jun 7 2016, 07:12 ViKo Что-то мне кажется, сохранять все регистры проще, ... Jun 6 2016, 11:33 spectr Вопрос по стеку задачи.
У каждой задачи есть свой ... Jun 6 2016, 12:05 Valentine Loginov Цитата(spectr @ Jun 6 2016, 15:05) Вопрос... Jun 7 2016, 06:43  Kabdim Цитата(Valentine Loginov @ Jun 7 2016, 09... Jun 7 2016, 12:45    spectr Цитата(AlexandrY @ Jun 8 2016, 15:34) Гов... Jun 8 2016, 13:48 spectr Вопрос по прерыванию PendSV_Handler.
В нем выполн... Jun 10 2016, 11:50 AlexandrY Цитата(spectr @ Jun 10 2016, 14:50) Если ... Jun 10 2016, 12:16 spectr Правильно ли я понимаю, что PendSV используется та... Jun 10 2016, 12:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|