硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2211|回复: 7
收起左侧

[RL-RTX] F429外部中断中发送,isr_evt_set 接收线程无反应

[复制链接]

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2018-4-18 13:08:02 | 显示全部楼层 |阅读模式
不知道什么原因,我在外部中断GPIOI口 PI11线的中断服务函数
void EXTI15_10_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line11) != RESET)
        {
                EXTI_ClearITPendingBit(EXTI_Line11);
                isr_evt_set(EVENT_ISR_NRF,handleTaskCmdProcess); //发送信号量,
        }
}

信号量宏定义
#define EVENT_ISR_URT1                (1<<0)
#define EVENT_ISR_NRF                (1<<1)
#define EVENT_ISR_URT2                (1<<2)
#define EVENT_ISR        (EVENT_ISR_URT1|EVENT_ISR_URT2|EVENT_ISR_NRF)

接收线程
__task void taskCmdProcess(void)
{
     uint16_t event_isr=0;
     while(1)
     {
           os_evt_wait_or(EVENT_ISR,0xFFFF);
           event_isr=os_evt_get();
           switch(event_isr)
           {
                case EVENT_ISR_NRF:
               //收到信号量处理数据
                break;
           }
     }
}
实际测试在中断服务函数中下断点 事能正常进入中断的,但是似乎isr_evt_set没有起作用,也就是说,我在taskCmdProcess函数中没有等到该信号量,看手册发现有这样一段话:
Note
  • You can call the isr_evt_set function only from the IRQ interrupt service routine. You cannot call it from the FIQ interrupt service routine.
  • When the isr_evt_set function is called too frequently, it forces too many tick timer interrupts and the task manager task scheduler is executed most of the time. It might happen that two isr_evt_set functions for the same task are called before the task gets a chance to run from one of the event waiting functions (os_evt_wait_). Of course one event is lost because event flags are not counting objects


不知道是不是 F429 的外部中断时属于FIQ类型的,加入是的话,我想从外部中断中给线程发送信号量该怎么做呢,求遇到类似问题的前辈指点下呀

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2018-4-18 13:10:37 | 显示全部楼层
如果没猜错的话,你的EXTI中断没有正确使能。你调试状态,在中断里面打个断点,然后全速运行,看看仅中断了没。
回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2018-4-18 13:14:34 | 显示全部楼层
如描述中所说的,在中断中下了断点的,是能正常进去的,而且,还在另外两个串口中也调用了isr_evt_set 串口中是能等到信号量的,测试时候我把两外部中断的信号量跟串口对调了一下,发现NRF这个能收到,然鹅URT1那个放到外部中断里的信号量还是收不到,应该是能证明,isr_evt_set在外部中断里调用时不起作用的了吧,
回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2018-4-18 13:19:15 | 显示全部楼层
安富莱的RTX教程中也有这么用的,
无标题.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2018-4-18 14:43:50 | 显示全部楼层
没问题,只要是中断就可以调用,看这个例子里面我做的SD卡插拔检测就是用的这个。
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1



EXTI中断及其配置:
  1. /*--------------------------- SD_Link_EXTIConfig ---------------------------------------*/

  2. void SD_Link_EXTIConfig(void)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         EXTI_InitTypeDef EXTI_InitStructure;
  6.         NVIC_InitTypeDef NVIC_InitStructure;

  7.         /* 安富莱STM32-V6开发板使用PE2作为中断输入口, 下降沿表示中断信号
  8.            未插入SD卡的时,PE2引脚是高电平,插入后,PE2引脚是低电平。
  9.         */
  10.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

  12.         /* 配置中断引脚是输入 */
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  14.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  15.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  17.         GPIO_Init(GPIOE, &GPIO_InitStructure);

  18.         /* 配置外部中断线连接到相应引脚 */
  19.         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);

  20.         /* 配置外部中断线 */
  21.         EXTI_InitStructure.EXTI_Line = EXTI_Line2;
  22.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  23.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
  24.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  25.         EXTI_Init(&EXTI_InitStructure);

  26.         /* 使能中断通道 */
  27.         NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
  28.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  29.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  30.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  31.         NVIC_Init(&NVIC_InitStructure);
  32. }

  33. /*--------------------------- EXTI2_IRQHandler ---------------------------------------*/
  34. void EXTI2_IRQHandler(void)
  35. {
  36.         if (EXTI_GetITStatus(EXTI_Line2) != RESET)
  37.         {
  38.                 EXTI->IMR&=~(1<<2);         /* 关闭中断 */
  39.                 if(HandlePinDetectStart)
  40.                 {
  41.                         isr_evt_set(SDDetectBIT_0, HandlePinDetectStart);
  42.                 }
  43.                
  44.                 /* 清中断挂起位 */
  45.                 EXTI_ClearITPendingBit(EXTI_Line2);
  46.         }
  47. }
复制代码



任务:

  1.     while(1)
  2.     {
  3.                 /*
  4.                         1. 无限等待SD卡插拔状态变化。
  5.                     2. 无限等待网线插拔状态变化,暂未放在这个任务实现。
  6.                 */
  7.                 if(os_evt_wait_or(PinDetect_ALL, usMaxBlockTime) == OS_R_EVT)
  8.                 {
  9.                         xResult = os_evt_get ();
  10.                
  11.                         switch (xResult)
  12.                         {
  13.                                 case SDDetectBIT_0:
  14.                                     /* 设置一段延迟时间,滤除插拔SD卡时造成的抖动, 拔出过程误差较大,这里等待100ms再检测 */
  15.                                         os_dly_wait(100);
  16.                                         if((GPIOE->IDR & (1 << 2)))
  17.                                         {
  18.                                                 UnmountSD(); /* 卸载SD卡 */
  19.                                                 WM_SendMessageNoPara(hWinStatus, MSG_SDPlugOut);
  20.                                         }
  21.                                         else
  22.                                         {
  23.                                                 MountSD();  /* 挂载SD卡 */
  24.                                                 WM_SendMessageNoPara(hWinStatus, MSG_SDPlugIn);
  25.                                         }
  26.                                         EXTI->IMR |= (1<<2); /* 使能中断  */
  27.                                         break;
  28.                                        
  29.                                 /* 其他值不处理 */
  30.                                 default:                     
  31.                                         break;
  32.                         }       
  33.                 }
  34.     }
复制代码



回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2018-4-18 21:34:05 | 显示全部楼层
多谢版主,倾力解答,问题已经解决了,是NRF24L01  RxMode()函数调用是在 taskCmdProcess线程创建之前调用造成的,因为我的一个终端一直在发射数据,导致进了一次中断之后没有及时清除 NRF24L01的中断寄存器造成的,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2018-4-19 02:28:09 | 显示全部楼层
吻云浩 发表于 2018-4-18 21:34
多谢版主,倾力解答,问题已经解决了,是NRF24L01  RxMode()函数调用是在 taskCmdProcess线程创建之前调用 ...

回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2018-5-25 21:21:20 | 显示全部楼层
handleTaskCmdProcess 还没初始化
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 08:14 , Processed in 0.185145 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表