关于几个状态的解释
线程的创建
RTOS2的源码
// ==== Public API ====
/// Create a thread and add it to Active Threads.
osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr) {
osThreadId_t thread_id;
EvrRtxThreadNew(func, argument, attr);
if (IsIrqMode() || IsIrqMasked()) {
EvrRtxThreadError(NULL, (int32_t)osErrorISR);
thread_id = NULL;
} else {
thread_id = __svcThreadNew(func, argument, attr);
}
return thread_id;
}
返回值是线程句柄。
三个属性分别是
func线程函数
参数指针,作为开始参数传递给线程函数
attr线程属性;NULL:默认值
Note的地方需要特别注意,比如这两个API都不能被中断回调函数调用(比如TIM溢出中断,接收中断等)
线程的挂起和恢复
void thread_User_App(void *argment)
{
uint8_t ucKeyCode; /* 按键代码 */
osStatus_t status;
while(1)
{
bsp_RunPer10ms(); /* 每隔10ms调用一次此函数 */
ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
if (ucKeyCode != KEY_NONE)
{
switch (ucKeyCode)
{
case KEY_DOWN_K1: /* K1键按下 */
printf("K1 按下 \r\n");
break;
case KEY_UP_K1: /* K1键弹起 */
printf("K1 弹起\r\n");
status = osThreadSuspend(threadID_LED); //挂起线程
if(osOK == status)
{
printf("threadID_LED Suspend Ok !\r\n");
}
else
{
printf("threadID_LED Suspend ERROR !\r\n");
}
break;
case KEY_DOWN_K2: /* K2键按下 */
printf("K2键按下\r\n");
break;
case KEY_UP_K2: /* K2键弹起 */
printf("K2键弹起\r\n");
break;
case KEY_DOWN_K3: /* K3键按下 */
printf("K3键按下\r\n");
break;
case KEY_UP_K3: /* K3键按下 */
printf("K3键弹起\r\n");
status = osThreadResume(threadID_LED);
if(osOK == status)
{
printf("(threadID_LED Resume Ok !\r\n"); //恢复线程
}
else
{
printf("(threadID_LED Resume ERROR !\r\n");
}
break;
default:
/* 其它的键值不处理 */
break;
}
}
osDelay(10);
}
}
void thread_LED_App(void *argment)
{
while(1)
{
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
printf("threadID_LED is Running !\r\n");
osDelay(500);
}
}
根据打印结果,按键K1和K3分别实现了对LED线程的挂起和恢复