本文体验在keil环境下CMSIS-FreeRTOS在APM32F402上的使用。
内核初始化:
/*
Initialize the RTOS Kernel.
*/
osStatus_t osKernelInitialize (void) {
osStatus_t stat;
BaseType_t state;
if (IRQ_Context() != 0U) {
stat = osErrorISR;
}
else {
state = xTaskGetSchedulerState();
/* Initialize if scheduler not started and not initialized before */
if ((state == taskSCHEDULER_NOT_STARTED) && (KernelState == osKernelInactive)) {
#if defined(USE_TRACE_EVENT_RECORDER)
/* Initialize the trace macro debugging output channel */
EvrFreeRTOSSetup(0U);
#endif
#if defined(USE_FreeRTOS_HEAP_5) && (HEAP_5_REGION_SETUP == 1)
/* Initialize the memory regions when using heap_5 variant */
vPortDefineHeapRegions (configHEAP_5_REGIONS);
#endif
KernelState = osKernelReady;
stat = osOK;
} else {
stat = osError;
}
}
/* Return execution status */
return (stat);
}
创建线程:
/* Create the thread */
ledThreadID = osThreadNew(Led_Thread, NULL, &ledThreadattr);
if (ledThreadID == NULL)
{
printf("Create led thread failed!\r\n");
}
usartThreadID = osThreadNew(Usart_TestThread, NULL, &usartThreadattr);
if (usartThreadID == NULL)
{
printf("Create usart thread failed!\r\n");
}
启动调度器:
/* Start the RTOS scheduler */
osKernelStart();
其中LED线程与USART任务定义如下:
void Led_Thread(void *argument)
{
UNUSED(argument);
while (1)
{
/* Toggle LED2 */
BOARD_LED_Toggle(LED2);
osDelay(1000);
}
}
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] Usart1 test task
*
* @param argument Not used
*
* @retval None
*/
void Usart_TestThread(void *argument)
{
UNUSED(argument);
while (1)
{
/* Print message */
printf("Hello, world!\r\n");
osDelay(1000);
}
}
实物演示:
|