在STM32F407VET6里将触摸液晶屏中断接到 PC5。
已经开启 EXTI [9:5] 中断,用cubeMX生成代码,并且勾选了调用 HAL 中断处理函数。
已经定义事件标志;动态内存分配与静态内存分配两种方式测试均失败。
FreeRTOS 配置项:`xEventGroupSetBitFromISR`已启用。
我的目的是触摸中断触发时置位一个事件标志。
随后唤醒正在使用`osEventFlagsWait()`等待的处理线程。
从返回值上看,中断里面的函数调用本身是执行成功的。
调试跟踪显示 touchEventHandle 指向的堆地址和 FreeRTOS 所分配的位置是一致的。
这一组 Set / Get 例程在线程内部调用时工作正常。我已经做了单步调试跟踪,但仍然找不出为什么运行出错。Set 函数会深入执行跟队列相关的底层代码。难道事件标志位底层是使用队列实现的吗?而 Get 例程看起来逻辑更简单,并没有用到队列。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == Touch_INT_Pin)
{
uint32_t flags = 0x00;
extern osEventFlagsId_t touchEventHandle;
flags = osEventFlagsSet(touchEventHandle, 0x01);
// ^ returns 0x01, as expected.
flags = osEventFlagsGet(touchEventHandle);
// ^ returns 0x00, but should be 0x01
}
}
|
|