реклама на сайте
подробности

 
 
> RTOS, тупые вопросы
spectr
сообщение Jun 3 2016, 12:47
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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. Где физически находятся все эти стеки, на которые указывают регистры?

Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
spectr
сообщение Jun 8 2016, 10:53
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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 байтам?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 8 2016, 12:16
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(spectr @ Jun 8 2016, 15:53) *
3. Не очень понятна запись tasks[tasks_used]->stk_ptr = (uint32_t*) ((uintptr_t) stk_ptr & 0xFFFFFFF8);. Для чего нужно выравнивание по 8 байтам?

Там же в комментарии написано, прямо перед этой строчкой. Кстати, правильнее выравнивать стек вот так, чтобы это работало с любым размером контекста.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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   Цитата(AHTOXA @ Jun 8 2016, 15:16) Там же...   Jun 8 2016, 12:26
|- - AlexandrY   Цитата(spectr @ Jun 8 2016, 15:26) Там на...   Jun 8 2016, 12:34
|- - spectr   Цитата(AlexandrY @ Jun 8 2016, 15:34) Гов...   Jun 8 2016, 13:48
|- - demiurg_spb   Цитата(AlexandrY @ Jun 8 2016, 15:34) Отк...   Jun 10 2016, 13:37
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 12:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01321 секунд с 7
ELECTRONIX ©2004-2016