用UCOS在中断中发送信号量,总是不行

[复制链接]
7205|2
 楼主| aoshi0603 发表于 2011-6-1 09:53 | 显示全部楼层 |阅读模式
在中断里放上OSSemPost ()发送信号量后,程序运正就不正常了, 明显的不对就是OSTimeDlyHMSM()都无效了, 任务执行频繁,还请高手指点一二。

我用的是STM32F103VE,架的是UCOS系统, 原来键了两个任务,一个是LCD显示,一个是键键处理,运行的没有错。后来加了I2C任务,配合I2C中断读取外部ADC芯片数据,只要是在I2C中断中加入OSSemPos
  1. void I2C2_EV_IRQHandler(void)
  2. {
  3. OS_CPU_SR cpu_sr;

  4. OS_ENTER_CRITICAL();
  5. OSIntNesting++;
  6. OS_EXIT_CRITICAL();

  7. switch (I2C_GetLastEvent(I2C2))
  8. {
  9. case I2C_EVENT_MASTER_MODE_SELECT: /* EV5 */

  10. OSSemPost (I2CAckSem);

  11. // Master Receiver -------------------------------------------------
  12. // Send slave Address for read
  13. I2C_Send7bitAddress(I2C2, LTC2453_ADDR, I2C_Direction_Receiver);
  14. break;

  15. // Master Receiver -------------------------------------------------------
  16. // Test on I2C2 EV6 and clear them /* EV6 */
  17. case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:

  18. // ENABLE I2C2 acknowledgement
  19. I2C_AcknowledgeConfig(I2C2, ENABLE);
  20. break;

  21. // Test on I2C2 EV7 and clear it
  22. case I2C_EVENT_MASTER_BYTE_RECEIVED: /* EV7 */

  23. // Store I2C1 received data
  24. ADCValueUnion.ADCR[ CycDec1(7, I2CPortStruct.ADC_Channel) ][I2CPortStruct.Rx1_Idx--] = I2C_ReceiveData(I2C2);
  25. // Disable ACK and send I2C1 STOP condition before receiving the last data
  26. if(I2CPortStruct.Rx1_Idx == 0)
  27. {
  28. // Disable I2C2 acknowledgement
  29. I2C_AcknowledgeConfig(I2C2, DISABLE);
  30. // Send I2C2 STOP Condition
  31. I2C_GenerateSTOP(I2C2, ENABLE);
  32. }
  33. else OSSemPost (I2CReceiveSem);

  34. break;

  35. case I2C_EVENT_SLAVE_ACK_FAILURE: /* EV3_2 */

  36. I2C_GenerateSTOP(I2C2, ENABLE);
  37. break;

  38. default: break;
  39. }

  40. OSIntExit();
  41. }
t ()就不对。弄了好几天了,实在不行了上来求教。

在I2C中断中加入OSSemPost ()的位置是/* EV5 */,查看是否起始位发送成功。接收这个信号量的是处理I2C的任务。
coreduo 发表于 2011-6-8 21:21 | 显示全部楼层
ucos中断发post sem,确认是可以用的
 楼主| aoshi0603 发表于 2011-6-27 08:29 | 显示全部楼层
问题差不多解决了, 中断里发送了两个信号量, 第一个不能用, 第二个可以用;
分析第一个发信号量不能用的原因可能是其执行的时间过长了, EV5中断是I2C起始位发送成功中断, 接着要执行语句I2C_Send7bitAddress(I2C2, LTC2453_ADDR, I2C_Direction_Receiver);发送地址, 如果中间加入发送信号量, 会延误I2C发送地址, 因为I2C是同步方式, 一旦延误了I2C时钟,就会出现I2C不好用的现象。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

113

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部