请教关于FREERTOS中断处理信号量的问题

2019-07-20 04:32发布

本帖最后由 sheepsleepin414 于 2018-12-17 17:23 编辑

请问在中断服务函数中使用                osSemaphoreRelease(xSemaphore12);  这个函数,
然后代码中用        if(xSemaphoreTake(xSemaphore12, (300 /portTICK_PERIOD_MS)) == pdTRUE)  这个判断
是否会出现中断之后反应时间比较长的现象?
(同事留给我维护的代码,FREERTOS刚入门,求大神帮助)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
正点原子
1楼-- · 2019-07-20 05:29
帮顶
HCHDaLeiGe
2楼-- · 2019-07-20 10:11
 精彩回答 2  元偷偷看……
sheepsleepin414
3楼-- · 2019-07-20 13:18
HCHDaLeiGe 发表于 2018-12-18 09:11
中断里操作freertos的函数会进断言,  osSemaphoreRelease(xSemaphore12) 这个函数是怎么实现的?
if(xSe ...

这个函数是ST封装的:
/**
* @brief Release a Semaphore token
* @param  semaphore_id  semaphore object referenced with ef osSemaphore.
* @retval  status code that indicates the execution status of the function.
* @note   MUST REMAIN UNCHANGED:  osSemaphoreRelease shall be consistent in every CMSIS-RTOS.
*/
osStatus osSemaphoreRelease (osSemaphoreId semaphore_id)
{
  osStatus result = osOK;
  portBASE_TYPE taskWoken = pdFALSE;
  
  
  if (inHandlerMode()) {
    if (xSemaphoreGiveFromISR(semaphore_id, &taskWoken) != pdTRUE) {
      return osErrorOS;
    }
    portEND_SWITCHING_ISR(taskWoken);
  }
  else {
    if (xSemaphoreGive(semaphore_id) != pdTRUE) {
      result = osErrorOS;
    }
  }
  
  return result;
}
HCHDaLeiGe
4楼-- · 2019-07-20 15:31
sheepsleepin414 发表于 2018-12-18 09:51
这个函数是ST封装的:
/**
* @brief Release a Semaphore token

噢,可能我们俩的代码版本不同,我的freertos里没有这个函数的封装。取得信号量反应时间长建议查一下具体时间,另外再调查一下任务调度顺序
sheepsleepin414
5楼-- · 2019-07-20 17:14
 精彩回答 2  元偷偷看……
HCHDaLeiGe
6楼-- · 2019-07-20 21:44
sheepsleepin414 发表于 2018-12-18 10:07
同事说反应时间有18微秒,不符合产品的要求,这个18微秒是否合理呢?

这个要看你们的工程有几个任务,怎么调度的,都会影响到响应时间

一周热门 更多>