【发布时间】:2020-06-18 14:03:53
【问题描述】:
我正在尝试在 IAR Workbench IDE 中使用 STM32 F401RE MCU 上的 FreeRTOS 打开和关闭 LED。
LED 属于 STM32 核板。有两个任务一个打开 Led,另一个任务关闭同一个 Led。
代码如下:
主要代码:
SemaphoreHandle_t xMutex;
int main()
{
if ( xMutex == NULL )
{
xMutex = xSemaphoreCreateMutex();
if ( ( xMutex ) != NULL )
xSemaphoreGive( ( xMutex ) );
}
xTaskCreate(LedOn, "Led On", 100, NULL, 1, NULL);
xTaskCreate(LedOff, "Led Off", 100, NULL, 1, NULL);
vTaskStartScheduler();
while(1){}
}
任务:
void LedOn(void *argument)
{
for(;;)
{
xSemaphoreTake( xMutex, ( TickType_t )5000 ) ;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
vTaskDelay(5000);
xSemaphoreGive(xMutex);
}
}
void LedOff(void *argument)
{
for(;;)
{
xSemaphoreTake( xMutex, ( TickType_t )5000 ) ;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
vTaskDelay(5000);
xSemaphoreGive(xMutex);
}
}
我的意思是:
Led on task负责开启Led 5s
Led off 任务负责 5s 开启 Led
所以这会一直持续到断电
我的问题是:
在初始情况下,LED 保持亮起 5 秒,然后 LED 保持亮起 5 秒,在两次切换 LED 保持亮起后,它仅适用于两次上下文切换。
当我在两次切换后调试时,断点不会命中任务
经过一番尝试,我想我找到了答案:
每个任务都应该有它的延迟时间,所以我们需要添加一个延迟时间才能让任务继续其操作,但我认为我在 xTakeSemaphore 和 xGiveSemaphore 方法之间添加了延迟时间,是互斥体延迟时间,它说明资源应该如何被锁定而不是任务延迟时间。
解决办法是:
void LedOn(void *argument)
{
for(;;)
{
if(xSemaphoreTake(xMutex, portMAX_DELAY)== pdTRUE)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
vTaskDelay(pdMS_TO_TICKS(5000));
xSemaphoreGive(xMutex);
vTaskDelay(pdMS_TO_TICKS(5000));
}
}
}
void LedOff(void *argument)
{
for(;;)
{
if( xSemaphoreTake( xMutex, portMAX_DELAY)== pdTRUE)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
vTaskDelay(pdMS_TO_TICKS(5000));
xSemaphoreGive(xMutex);
vTaskDelay(pdMS_TO_TICKS(5000));
}
}
}
【问题讨论】:
标签: c synchronization mutex stm32 freertos