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

 
 
 
Reply to this topicStart new topic
> Процедура страта TNKernel, Вопрос к адептам..
kosyak©
сообщение Jun 17 2013, 11:25
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Имею TNKernel версии 2.6. В функции tn_start_system()

инциализация служебных тасков проходит как

Код
void tn_start_system(void)
{
    ...
    tn_task_create((TN_TCB*)&tn_timer_task,        //-- task TCB
                  tn_timer_task_func,             //-- task function
                  0,                              //-- task priority
                  &(tn_timer_task_stack           //-- task stack first addr in memory
                      [TN_TIMER_STACK_SIZE-1]),
                  TN_TIMER_STACK_SIZE,            //-- task stack size (in int,not bytes)
                  NULL,                           //-- task function parameter
                  TN_TASK_TIMER);                 //-- Creation option

   //--- Idle task

    tn_task_create((TN_TCB*)&tn_idle_task,         //-- task TCB
                  tn_idle_task_func,              //-- task function
                  TN_NUM_PRIORITY-1,              //-- task priority
                  &(tn_idle_task_stack            //-- task stack first addr in memory
                      [TN_IDLE_STACK_SIZE-1]),
                  TN_IDLE_STACK_SIZE,             //-- task stack size (in int,not bytes)
                  NULL,                           //-- task function parameter
                  TN_TASK_IDLE);                  //-- Creation option    
}


в тоже время tn_timer_task.id_task и tn_idle_task.id_task нигде не обнуляются. Это правильно?
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jun 17 2013, 12:35
Сообщение #2


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(kosyak© @ Jun 17 2013, 14:25) *
в тоже время tn_timer_task.id_task и tn_idle_task.id_task нигде не обнуляются. Это правильно?


Вроде правильно. Проблема не очень понятна? Не создает задачи? Дело может быть вот в чем:
Cтатические, явно не инициализированные переменные перед началом исполнения программы должны содержать нулевые значения. Согласно стандарту языка С, выдержка из самого старого ANSI C 89-го года:

If an object that has static storage duration is not initialized explicitly, it is initialized implicitly as if every member that has arithmetic type were assigned 0 and every member that has pointer type were assigned a null pointer constant. If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.

Во встраиваемых системах об обнулении переменных заботится библиотечная функция, обычно вызывается стартовым модулем среды разработки/компилятора до передачи управления на main() пользовательской программы.
Если у Вас в tn_timer_task.id_task и tn_idle_task.id_task какой-то мусор - то не отработал нормально стартап код компилятора, ну или систему второй раз пытаетесь стартануть.
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Jun 17 2013, 12:39
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Цитата(VslavX @ Jun 17 2013, 15:35) *
...

Согласно стандарту языка С, выдержка из самого старого ANSI C 89-го года:

If an object that has static storage duration is not initialized explicitly, it is initialized implicitly as if every member that has arithmetic type were assigned 0 and every member that has pointer type were assigned a null pointer constant. If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.

Во встраиваемых системах об обнулении переменных заботится библиотечная функция, обычно вызывается стартовым модулем среды разработки/компилятора до передачи управления на main() пользовательской программы.
Если у Вас в tn_timer_task.id_task и tn_idle_task.id_task какой-то мусор - то не отработал нормально стартап код компилятора, ну или систему второй раз пытаетесь стартануть.


Полностью согласен
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Jun 17 2013, 12:55
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Объявление переменных в файле tn.c

Цитата
...

TN_TCB tn_timer_task;
static void tn_timer_task_func(void * par);
...

TN_TCB tn_idle_task;
static void tn_idle_task_func(void * par);
...
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jun 17 2013, 15:07
Сообщение #5


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(kosyak© @ Jun 17 2013, 15:55) *
Объявление переменных в файле tn.c

Ну да, все верно. TCB объявлены вне какой-либо функции.
Класс размещения - статический, область видимости - глобальная.
По стандарту - при старте программы все поля структур должны быть нулевые.
Что вызывает сомнение?



Go to the top of the page
 
+Quote Post
kosyak©
сообщение Jun 17 2013, 15:32
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Цитата(VslavX @ Jun 17 2013, 19:07) *
Класс размещения - статический, область видимости - глобальная.


Спасибо за разъяснения. Действительно так и есть...буду дальше смотреть...
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 19 2013, 12:49
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Кстати, автор в TN-NET то же применяет обнуление .id_task = 0 ( в файлах HTTP_test_1.c, TCP_test_7.c, lpc23xx_net.c, udp_test_1.c, udp_test_2.c )


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 8th July 2025 - 01:18
Рейтинг@Mail.ru


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