我正在尝试学习freeRTOS。如何让任务跑完 2 秒就睡觉了?我尝试使用vTaskSuspend()
立即停止任务,我也尝试v taskDelay(2000)
,但它也不起作用。
我想在调用快速闪烁任务 2 秒后使其休眠并运行正常的闪烁任务。
void resourse(const TickType_t xFrequency)
{
TickType_t xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
while(1)
{
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
vTaskDelayUntil( &xLastWakeTime, xFrequency);
}
}
xSemaphoreHandle botton_one = 0;
void botton(void* r)
{
while(1)
{
if(xSemaphoreTake(botton_one, 1))
{
HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
xSemaphoreGive(botton_one);
}
vTaskDelay(1);
}
}
void normal_blinking(void* r)
{
while(1)
{
if(xSemaphoreTake(botton_one, 1))
{
resourse(500);
xSemaphoreGive(botton_one);
}
}
}
void fast_blinking(void* s)
{
while(1){
if((HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin))== 0)
{
xSemaphoreTake(botton_one, 1);
resourse(50);
xSemaphoreGive(botton_one);
}
vTaskDelay(2000);
vTaskSuspend(NULL);
}
}
int main(void)
{
TaskHandle_t xHandle;
botton_one = xSemaphoreCreateMutex();
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
xTaskCreate(botton, (const char*)"task_1", 1024, 0, 3, 0);
xTaskCreate(normal_blinking, (const char*)"task_2", 1024, 0, 2,0);
xTaskCreate(fast_blinking, (const char*)"task_3", 1024, 0, 1,0);
vTaskStartScheduler();
while (1){
}
}
不清楚你想做什么,或者什么没有按照你想要的方式工作。 您建议同时使用 vTaskSuspend(( 和 vTaskDelay((,但它们用于不同的事情。
如果调用 vTaskDelay((,则任务将在您指定的任何时间段内进入"已阻止"状态(不再作为可以实际执行的任务使用(,然后在该时间段后自动离开"已阻止"状态。
如果调用 vTaskSuspend((,则任务将进入"挂起"状态,并且永远不会再次运行,除非另一个任务或中断调用 vTaskResume((。
您是否只想让任务运行两秒钟,然后再也不会运行? 在这种情况下,您可以执行一些简单操作,例如:
void mytask( void *pv )
{
TickType_t xTimeOnEntering = xTaskGetTickCount();
while( xTaskGetTickCount() - xTimeOnEntering < pdMS_TO_TICKS( 2000 ) )
{
/* Run your code here. */
}
/* Two seconds of execution is up, delete the task. */
vTaskDelete( NULL );
}