查看: 4704|回复: 1

指出资料教程7 interrupt的错误(欢迎指正讨论)

[复制链接]
  • TA的每日心情
    奋斗
    2014-5-7 09:37
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-1-23 16:54:21 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 chen1834 于 2014-1-23 17:01 编辑

    按照给的资料中7interrupt(独家秘方——Task,Event以及Interrupt)那篇的方法进行验证,同样的代码是无法正常工作的。
    例程中开启了RX,TX,ERROR三个中断源,中断服务程序(ISR)中对接收中断进行了处理。主函数中依然使用了simple_uart.c中提供的API,如:simple_uart_put(),该函数中有while语句等待EVENTS_TXDRDY置为1(程序就会死在这里)。
    例程的作者可能理解为当发送完成后,即使进入中断,但无任何操作,中断结束后就可以跳出while循环,但事实是EVENTS_TXDRDY在中断中没有被置0的话,会一直成为中断源,导致跳出中断后就再次进入中断,程序无法继续。(亦或者是例程的作者没有用simple_uart.c中提供的发送API,而是另外自己写的函数。那么建议应该在文档中说明清楚。)

    使用中断来处理UART发送时,必须在ISR程序中清除任何可能的中断源。这应该是一个很常规的做法。也就是说如果开启了三个中断源,那么ISR中应当对三个中断源都做清除处理。例如:
    void UART0_IRQHandler(void)
    {
    ......
    // Handle reception
    if (NRF_UART0->EVENTS_RXDRDY != 0)
    {
    ......
    // Clear UART RX event flag
    NRF_UART0->EVENTS_RXDRDY = 0;
    }
    //Handle Transmission
    if (NRF_UART0->EVENTS_TXDRDY != 0)
    {
    ......
    // Clear UART TX event flag
    NRF_UART0->EVENTS_TXDRDY = 0;
    }
    //Handle Error
    if (NRF_UART0->EVENTS_ERRRDY != 0)
    {
    ......
    // Clear UART error event flag
    NRF_UART0->EVENTS_ERRRDY = 0;
    }
    }

    如果要继续使用 simple_uart.c中提供的API函数,如:simple_uart_put(),那么就别开TX中断源。



    回复

    使用道具 举报

  • TA的每日心情
    开心
    2014-7-1 16:17
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2014-1-23 19:52:02 | 显示全部楼层
    围观                                    
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-20 04:49 , Processed in 0.110840 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.