Запуск TNeo из функции main()




//----------------------------------------------------------------
//- настройка и запуск ядра TNeo
//----------------------------------------------------------------

//- размер стека задачи простоя (Idle_task), в словах
#define IDLE_TASK_STACK_SIZE   (TN_MIN_STACK_SIZE + 32)

//- размер стека обработчика прерываний, в словах
#define INTERRUPT_STACK_SIZE   (TN_MIN_STACK_SIZE + 64)

//- выделение массива для стеков: задачи простоя и обработчика прерывания
//- для этого необходимо использовать макросы TN_STACK_ARR_DEF()
//- для IAR выравнивание по границе 8 байт
#pragma data_alignment = 8
TN_STACK_ARR_DEF(idle_task_stack, IDLE_TASK_STACK_SIZE);
#pragma data_alignment = 8
TN_STACK_ARR_DEF(interrupt_stack, INTERRUPT_STACK_SIZE);

void tn_app_init(void);          //- функция инициализации приложения и запуска других задач
void idle_task_callback (void);   //- функция, вызываемая во время простоя


int main()
{
  tn_arch_int_dis();       //- запретить прерывания, разрешить в tn_app_init()
  
  //- настройка системного таймера 1мс
  SysTick_Config(72000);   //- 1 ms 

  ...

  //- начальная функция запуска системы TNeo, которая никогда не возвращает управление
  tn_sys_start(idle_task_stack,     //- указатель на стек задачи простоя
         IDLE_TASK_STACK_SIZE,      //- размер стека задачи простоя
         interrupt_stack,           //- указатель на стек обработчика прерывания
         INTERRUPT_STACK_SIZE,      //- размер стека обработчика прерывания
         tn_app_init,               //- функция инициализации приложения и запуска других задач
         idle_task_callback);       //- функция, вызываемая во время простоя
}

//------------------------------------------------------------------------------
//- функция времени простоя: Idle_Task
//------------------------------------------------------------------------------
void idle_task_callback (void)
{
}

//------------------------------------------------------------------------------
//- функция инициализации приложения и запуска других задач
//------------------------------------------------------------------------------
//- настройки задачи
#define TASK_MAIN_PRIORITY	  8         //- приоритет задачи
#define TASK_MAIN_STK_SIZE	128         //- размер стека задачи в словах
#pragma data_alignment = 8
TN_STACK_ARR_DEF(task_main_stack, TASK_MAIN_STK_SIZE);    //- выделение стека при помощи макроса

TN_TCB task_main;                       //- структура TCB управления задачей
void task_main_func(void *param);       //- функция задачи, имеет прототип: void (*task_func)(void *param)

void tn_app_init (void)
{
  __enable_irq();                       //- разрешить прерывания, запрещённые в main()

  task_main.id_task = TN_ID_NONE;
  tn_task_create(&task_main,                  //- указатель на структуру TCB управления задачей
                 task_main_func,              //- функция задачи
                 TASK_MAIN_PRIORITY,          //- приоритет задачи
                 task_main_stack,             //- указатель на вершину стека задачи
                 TASK_MAIN_STK_SIZE,          //- размер стека задачи (в словах)
                 NULL,                        //- параметры, передаваемые в функцию задачи
                 TN_TASK_START_ON_CREATION);  //- опция: после создания задача становится RUNNABLE
}

Предоставляемая пользователем функция обратного вызова, которая вызывается непосредственно из `tn_sys_start()` в рамках процедуры запуска системы. Она должна создать по крайней мере одну (обычно только одну) пользовательскую задачу, которая выполнит всю остальную инициализацию приложения.

Параметры

semaphore_id
semaphore ID obtained by osSemaphoreNew()
Идентификатор семафора, полученный с помощью функции osSemaphoreNew().
typedef  void  *osSemaphoreId_t;



Возвращаемое значение

тип uint32_t
number of tokens available
Количество доступных токенов семафора.



Описание

[проверить!!! разночтение в документации] Функция osSemaphoreGetCount() возвращает число доступных токенов [вначале было указано: текущее количество выпущенных токенов] семафора, указанного в параметре semaphore_id. В случае ошибки возвращает 0.

Функция osSemaphoreRelease() может быть вызвана из процедуры обработки прерывания (ISR - Interrupt Service Routines).