普通任务创建及运行,参阅安富莱电子demo
/*
*********************************************************************************************************
* 函 数 名: vTaskTaskUserIF
* 功能说明: 接口消息处理,这里用作LED闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 1 (数值越小优先级越低,这个跟uCOS相反)
*********************************************************************************************************
*/
static void vTaskTaskUserIF(void *pvParameters)
{
while(1)
{
vTaskDelay(100);
}
}
int main(void)
{
/*
在启动调度前,为了防止初始化STM32外设时有中断服务程序执行,这里禁止全局中断(除了NMI和HardFault)。
这样做的好处是:
1. 防止执行的中断服务程序中有FreeRTOS的API函数。
2. 保证系统正常启动,不受别的中断影响。
3. 关于是否关闭全局中断,大家根据自己的实际情况设置即可。
在移植文件port.c中的函数prvStartFirstTask中会重新开启全局中断。通过指令cpsie i开启,__set_PRIMASK(1)
和cpsie i是等效的。
*/
__set_PRIMASK(1);
/* 任务创建 */
xTaskCreate( vTaskTaskUserIF, /* 任务函数 */
"vTaskUserIF", /* 任务名 */
512, /* 任务栈大小,单位word,也就是4字节 */
NULL, /* 任务参数 */
1, /* 任务优先级*/
&xHandleTaskUserIF ); /* 任务句柄 */
/* 启动调度,开始执行任务 */
vTaskStartScheduler();
/*
如果系统正常启动是不会运行到这里的,运行到这里极有可能是用于定时器任务或者空闲任务的
heap空间不足造成创建失败,此要加大FreeRTOSConfig.h文件中定义的heap大小:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )
*/
while(1);
}
STM32CubeMX 下任务创建及运行
/* Private variables ---------------------------------------------------------*/
//任务句柄
osThreadId defaultTaskHandle;
/* USER CODE BEGIN PV */
/* USER CODE BEGIN 4 */
void Task01(void const * argument)
{
/* USER CODE BEGIN 5 */
/* Infinite loop */
for(;;)
{
HAL_UART_Transmit(&huart1,"Task01\r\n",strlen("Task01\r\n"),1000);
osDelay(500);
}
/* USER CODE END 5 */
}
/* USER CODE END 4 */
int main(void)
{
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* 参数说明:任务名字(可以根据情况自己定义),任务函数体,优先级,实例,任务堆长度 */
/* STM32CubeMX 生成的代码默认优先级7个,可以手动调整,优先级数越小,优先等级越小 */
/*
//STM32CubeMX 生成的代码枚举
typedef enum {
osPriorityIdle = -3, ///< priority: idle (lowest) //实际对应0
osPriorityLow = -2, ///< priority: low //实际对应1
osPriorityBelowNormal = -1, ///< priority: below normal //实际对应2
osPriorityNormal = 0, ///< priority: normal (default) //实际对应3
osPriorityAboveNormal = +1, ///< priority: above normal //实际对应4
osPriorityHigh = +2, ///< priority: high //实际对应5
osPriorityRealtime = +3, ///< priority: realtime (highest) //实际对应6
osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority
} osPriority;
//通过 makeFreeRtosPriority 函数将 STM32CubeMX 生成的代码枚举转换成实际对应的优先级
static unsigned portBASE_TYPE makeFreeRtosPriority (osPriority priority)
{
unsigned portBASE_TYPE fpriority = tskIDLE_PRIORITY;
if (priority != osPriorityError) {
fpriority += (priority - osPriorityIdle);
}
return fpriority;
}
*/
osThreadDef(Task01, Task01, osPriorityAboveNormal, 0, 128);
/* 参数说明:生成任务结构体的地址取值宏, 任务参数*/
defaultTaskHandle = osThreadCreate(osThread(Task01), NULL);
/* USER CODE END RTOS_THREADS */
/* Start scheduler */
osKernelStart();
}