Запуск 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).