打印
[STM32F1]

stm32f103+freeRTOS中中断里释放信号量问题

[复制链接]
6798|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用CUBE生成的工程文件,在外部中断里释放信号量,使等待的任务A运行。外部中断优先级是8

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __GPIOC_CLK_ENABLE();
  __GPIOA_CLK_ENABLE();
  __GPIOB_CLK_ENABLE();

  /*Configure GPIO pins : PC0 PC1 PC2 PC3 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PA1 */
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI1_IRQn, 8, 0);
  HAL_NVIC_EnableIRQ(EXTI1_IRQn);

}

FreeRTOSConfig.h里的优先级配置是这样的
#ifdef __NVIC_PRIO_BITS
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
#define configPRIO_BITS         __NVIC_PRIO_BITS
#else
#define configPRIO_BITS         4
#endif

/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   15

/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

/* Interrupt priorities used by the kernel port layer itself.  These are generic
to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY                 ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY         ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )


外部中断函数内容是
/**
  * @brief  EXTI line detection callback
  * @param GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_PIN_1)
  {
    osSemaphoreRelease(myBinarySem01Handle);
  }
}



任务A函数
/* StartDefaultTask function */
void StartDefaultTask(void const * argument)
{

  /* USER CODE BEGIN 5 */
  int32_t res = os_status_reserved;

  AD1232Init();
  /* Infinite loop */
  for(;;)
  {
    //osDelay(1);
    res = osSemaphoreWait(myBinarySem01Handle,osWaitForever);
    if(res == osOK)
    {
      AD_Value = ReadSensor();
    }
  }
  /* USER CODE END 5 */
}

现在中断能进去释放信号量,但一直都到不了AD_Value = ReadSensor();这一步,我这样写的对不对?麻烦看看我哪里出错了!

ads1232.rar

1.54 MB

工程文件

沙发
犹豫的大三|  楼主 | 2015-12-28 15:00 | 只看该作者
现在网上的FreeRTOS的资料没有uCOS的多,在网上没有找到什么有用的信息。有没有用过FreeRTOS的?

使用特权

评论回复
板凳
犹豫的大三|  楼主 | 2015-12-28 15:05 | 只看该作者
我之前试过在中断里释放队列也是不行,任务A一直处在等待状态,但是如果在另一个任务B里释放队列的话,则任务A与任务B完成了同步。但是为什么在中断里就不行。
configLIBRARY_LOWEST_INTERRUPT_PRIORITY   和configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 没有设置错啊?

使用特权

评论回复
地板
稳稳の幸福| | 2015-12-28 16:21 | 只看该作者
FreeRTOS的资料没有uCOS的多,我也是只接触过ucOS,不清楚最近搞的很火MBED OS到底是不是个OS。

使用特权

评论回复
5
犹豫的大三|  楼主 | 2015-12-29 08:54 | 只看该作者
稳稳の幸福 发表于 2015-12-28 16:21
FreeRTOS的资料没有uCOS的多,我也是只接触过ucOS,不清楚最近搞的很火MBED OS到底是不是个OS。 ...

我怎么感觉它很像个线上的编译器,没有看出OS的苗头

使用特权

评论回复
6
犹豫的大三|  楼主 | 2015-12-29 20:28 | 只看该作者
二姨家没有人用freeRTOS?还是我发错板块了?这个问题以后有时间再研究吧,还是用回UCOSIII了。话说UCOSIII的中断处理是个什么机制?所有的中断服务函数都要进临界区,某某值加加,出临界区?

使用特权

评论回复
7
lefeng| | 2015-12-29 22:18 | 只看该作者
参考一下吧

无标题.png (95.76 KB )

无标题.png

使用特权

评论回复
8
lwsn| | 2015-12-29 22:41 | 只看该作者
相对来说UCOSIII用的人应该比较多,资料也多

使用特权

评论回复
9
稳稳の幸福| | 2015-12-30 00:00 | 只看该作者
犹豫的大三 发表于 2015-12-29 08:54
我怎么感觉它很像个线上的编译器,没有看出OS的苗头

是的,OS还没有做出来呢,听说还在研发中,只给了个框架的在线编译器。

使用特权

评论回复
10
犹豫的大三|  楼主 | 2015-12-30 08:44 | 只看该作者

这和中断服务有什么关系?

使用特权

评论回复
11
Ketose| | 2015-12-30 13:36 | 只看该作者
osSemaphoreRelease 能在中断里调用吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

494

帖子

9

粉丝