【发布时间】:2019-12-27 17:13:12
【问题描述】:
我正在使用 esp32 在 freeRTOS 中使用 Mutex。在一些文档中,我已经阅读了互斥锁保证所有权,这意味着如果一个线程(我们将其命名为 task_A)锁定了一个关键资源(获取令牌),其他线程(task_B 和 task_C)将保持在等待模式,等待该资源被解锁由锁定它的同一线程(即task_A)。我试图通过设置其他任务(task_B 和 task_C)在开始做任何事情之前提供一个令牌来证明这一点,然后它会尝试从互斥锁持有者那里获取一个令牌,这令人惊讶地工作而没有显示任何错误的孩子. 好吧,我用来验证或显示事情如何工作的方法我创建了一个显示函数,它读取每个任务发布(设置和清除)的事件(当它处于等待模式时,如果它正在工作,它会设置等待位,它将设置工作咬起来等等......,你明白了)。以及一个简单的 printf(),以防 take 或 give 函数出错(xSemaphoreTake != true 和 xSemaphoreGive != true)。
我无法使用调试模式,因为我没有任何类型的微控制器调试器。
这是我正在尝试做的一个示例: 我创建了许多任务,每个任务都会调用这个函数,但在不同的时间使用不同的设置。
void vVirtualResource(int taskId, int runTime_ms){
int delay_tick = 10;
int currentTime_tick = 0;
int stopTime_tick = runTime_ms/portTICK_PERIOD_MS;
if(xSemaphoreGive(xMutex)!=true){
printf("Something wrong in giving first mutex's token in task id: %d\n", taskId);
}
while(xSemaphoreTake(xMutex, 10000/portTICK_PERIOD_MS) != true){
vTaskDelay(1000/portTICK_PERIOD_MS);
}
// notify that the task with <<task id>> is currently running and using this resource
switch (taskId)
{
case 1:
xEventGroupClearBits(xMutexEvent, EVENTMASK_MUTEXTSK1);
xEventGroupSetBits(xMutexEvent, EVENTRUN_MUTEXTSK1);
break;
case 2:
xEventGroupClearBits(xMutexEvent, EVENTMASK_MUTEXTSK2);
xEventGroupSetBits(xMutexEvent, EVENTRUN_MUTEXTSK2);
break;
case 3:
xEventGroupClearBits(xMutexEvent, EVENTMASK_MUTEXTSK3);
xEventGroupSetBits(xMutexEvent, EVENTRUN_MUTEXTSK3);
break;
default:
break;
}
// start running the resource
while(currentTime_tick<stopTime_tick){
vTaskDelay(delay_tick);
currentTime_tick += delay_tick;
}
// gives back the token
if(xSemaphoreGive(xMutex)!=true){
printf("Something wrong in giving mutex's token in task id: %d\n", taskId);
}
}
您会注意到,第一次在处理器中开始运行的第一个任务将打印出第一条错误消息,因为在互斥锁持有者中仍有令牌时它无法提供令牌,这是正常的,所以我忽略了它。
希望有人可以向我解释互斥锁如何使用 freeRTOS 中的代码保证所有权。首先,我没有使用第一个 xSemaphoreGive 函数,它运行良好。但这并不意味着它可以保证任何事情。或者我编码不正确。
谢谢。
【问题讨论】: