我正在尝试学习免费的实时操作系统。如何让任务在运行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){
}
}发布于 2016-02-14 05:23:47
不清楚你想要做什么,或者什么不能像你想要的那样工作。您建议同时使用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. */
<a href="http://www.freertos.org/a00126.html">vTaskDelete</a>( NULL );
}https://stackoverflow.com/questions/35379424
复制相似问题