搜索
bottom↓
回复: 29

[交流][拍砖]新版驱动接口风格调查(三):信号系统

[复制链接]

出0入296汤圆

发表于 2013-11-16 10:52:26 | 显示全部楼层 |阅读模式
本帖最后由 Gorgon_Meducer 于 2014-5-20 16:16 编辑


说在前面的话

这次是关于中断系统的接口……默默等待房产……

解释下:现在的格式是这样的,

  1. SIGNAL_CFG(
  2.     SINGLE(<中断向量:SIGNAL0..SIGNAL31>, <信号源:手动信号 / 外设信号>, <信号用途:触发中断 / 触发外设功能>,
  3.      <信号源的检测方式:上升沿,下降沿,双边沿,高电平,低电平,每xx次才触发一次>|<是否产生中断,其它属性>),
  4.     ...
  5. )
复制代码
我关心的是对用户来说,这种方式是否灵活,易用。
比如,你可以吐槽我的例子比较渣,但是你立即就知道,并且有自己的欲望去实现一个自己的例子,关键就是你立即就知道如何自己去做




这是新版本编码规范的一个范例代码,包含对应的驱动模型和接口规范,我希望在不提供进一步解说的情况下听听大家
的意见,并提供以下信息:
1、第一眼给你的感受,是喜欢 恐惧 还是 茫然无措
2、顺次阅读代码后,代码要表达的意思你是否已经了解大概,表意是否清晰
3、有什么你觉得疑惑的地方?
4、有什么改进意见?
5、任何批评意见都是非常欢迎的

如果可能,希望大家能在回帖中描述下你理解的代码的行为。

这个库的目标就是要让代码使用起来简单,不仅仅要屏蔽底层的寄存器操作,还要做到功能和意义一目了然
参与的人,即便自觉是菜鸟,也不用觉得自己水平不够之类的,因为你们就是最终的用户,你们是最有发言权的!
非常感谢大家的参与。


P.S: 这个库将是未来一个实质性的半导体产品的系统库。




范例一:USART数据接收完成中断


  1.     SIGNAL_CFG(
  2.         //! 一旦USART0的接收缓冲区中有数据(Data Available),就产生中断,并复位TIMER0
  3.         SINGLE( SIGNAL0, USE_SIGNAL_USART0_RX_FIFO_DAVL, TO_TRIGGER(INTERRUPT_REQUEST , TIMER0_RESET), EVERY_TIME ),

  4.         //! 如果很久没有发生USART0的接收事件,导致TIMER0溢出了,就认为发生了接收超时,触发中断处理程序
  5.         SINGLE( SIGNAL1, USE_SIGNAL_TIMER0_OVF, TO_TRIGGER(INTERRUPT_REQUEST), EVERY_TIME),
  6.     );

  7.     ISR(SIGNAL0_vect)
  8.     {
  9.         //! Signal0 的中断处理程序,当USART的接收缓冲区中存在数据时,该中断被触发
  10.     }

  11.     ISR(SIGNAL1_vect)
  12.     {
  13.         //! Signal1 的中断处理程序, 定时器0的溢出事件触发,表示USART通信超时,用TIMER0的TOP值设置超时范围
  14.     }

复制代码

范例二:用DMA从USART接收数据

这是直接用DMA的例子,当USART0的缓冲区中有数据可用的时候,自动触发DMA进行搬运


  1. #define USART0_RX_BUFFER_SIZE           256

  2. static uint8_t s_chUSARTBuffer[USART0_RX_BUFFER_SIZE];

  3. static void start_usart_dma_transfer(void)
  4. {
  5.     DMA_CHN_CFG(
  6.         DMA_CHANNEL0,                           //!< 使用DMA的通道0
  7.         DMA_CHN_BURST_TRANSFER |                //!< 分多次完成数据传输
  8.         DMA_CHN_BURST_SIZE_1,                   //!< 每次传输一个数据(数据类型由DMA_TSF_CFG指定)
  9.         
  10.         //! 配置一次传输
  11.         DMA_TSF_CFG (
  12.             DMA_TSF_MODE_PERIPHRAL_TO_MEMORY,   //!< 从外设到内存的搬运方式
  13.             DMA_TSF_DATA_BITS_BYTE,             //!< 每次搬运的数据类型是字节           
  14.             &GSP_USART0.RBR_THR_DLL.RBR.Value,  //!< 源地址
  15.             s_chUSARTBuffer                     //!< 目标地址
  16.         )
  17.     );
  18. }

  19. void app_init(void)
  20. {
  21.     ...
  22.     SIGNAL_CFG(
  23.         //! 一旦USART0的接收缓冲区中有数据(Data Available),就触发DMA通道0从USART版运数据
  24.         SINGLE( SIGNAL0, USE_SIGNAL_USART0_RX_FIFO_DAVL, TO_TRIGGER(DMA0_CHN0_TSF), EVERY_TIME ),

  25.         //! 当DMA完成指定数量数据的搬运后,触发中断,由中断来配置下一次的DMA
  26.         SINGLE( SIGNAL1, USE_DMA_CHN0_FINAL_TSF, TO_TRIGGER(INTERRUPT_REQUEST), EVERY_TIME),
  27.     );

  28.     //! 配置USART0
  29.     USART_CFG(
  30.         USART0,
  31.         USART_8_BIT_LENGTH  |       //!< 8数据位
  32.         USART_1_STOPBIT     |       //!< 1停止位
  33.         USART_NO_PARITY,            //!< 无校验
  34.         9600                        //!< 9600波特率
  35.     );

  36.     //! 配置DMA进行USART的数据传输
  37.     start_usart_dma_transfer();
  38.     ...
  39. }

  40. ISR(SIGNAL1_vect)
  41. {
  42.     //! 配置下一次DMA传输
  43.     start_usart_dma_transfer();
  44. }

复制代码

范例三:外中断


  1.     SELECT_PIN_SIGNAL_SOURCE(PIN_CHN0, PA6);
  2.     SELECT_PIN_SIGNAL_SOURCE(PIN_CHN1, PA7);
  3.     SELECT_PORT_GROUP_SIGNAL_SOURCE(PORT_GROUP_CHN0, PB0_MSK | PB1_MSK | PB2_MSK | PB3_MSK)

  4.     SIGNAL_CFG(
  5.         //! 在PA6的第61个上升沿产生一个中断
  6.         SINGLE(SIGNAL0, USE_SIGNAL_PIN_CHN0, TO_TRIGGER(INTERRUPT_REQUEST), ON_RAISING_EDGE | EVERY_61_TIME),

  7.         //! 在PA7每保持低电平32个系统周期,产生一个中断
  8.         SINGLE(SIGNAL1, USE_SIGNAL_PIN_CHN1, TO_TRIGGER(INTERRUPT_REQUEST), ON_LOW_LEVEL | EVERY_32_TIME),

  9.         //! PB0, PB1, PB2, PB3 任何一个引脚的双边沿产生一个中断
  10.         SINGLE(SIGNAL2, USE_SIGNAL_PORT_GROUP_CHN0, TO_TRIGGER(INTERRUPT_REQUEST), ON_BOTH_EDGE},
  11.     )

  12.     ISR(SIGNAL0_vect)
  13.     {
  14.         //! Signal0 的中断处理程序,
  15.     }

  16.     ISR(SIGNAL1_vect)
  17.     {
  18.         //! Signal1 的中断处理程序,
  19.     }

  20.     ISR(SIGNAL2_vect)
  21.     {
  22.         //! Signal2 的中断处理程序,
  23.     }

复制代码

出0入296汤圆

 楼主| 发表于 2013-11-16 10:58:49 | 显示全部楼层
占位……

出100入85汤圆

发表于 2013-11-16 12:40:55 | 显示全部楼层
最近也想做个类似的系统,正好看看中断怎么封装

出0入0汤圆

发表于 2013-11-16 13:00:26 来自手机 | 显示全部楼层
学习一下      

出0入0汤圆

发表于 2013-11-16 13:47:57 来自手机 | 显示全部楼层
为什么手机神马代码也看不到

出0入0汤圆

发表于 2013-11-16 18:11:20 | 显示全部楼层
zhexuejia 发表于 2013-11-16 13:47
为什么手机神马代码也看不到

切换到电脑版就可以看到了

出0入0汤圆

发表于 2013-11-16 18:30:56 | 显示全部楼层
这样写,能看懂。
只要所有库的书写和变量命名保持一致就可以。

出0入0汤圆

发表于 2013-11-16 22:41:17 | 显示全部楼层
SIGNAL_CFG(
        //! 使用USART0接收完成事件产生中断,因为USART有16字节的FIFO,所以我们配置该事件每8次才触发一次中断
        { SIGNAL0, USE_USART0_RX_CPL, TO_GENERATE_INTERRUPT, EVERY_8_TIMES, ENABLE_INTERRUPT },

        //! 用USART0接收完成事件来复位定时器到0
        { SIGNAL1, USE_USART0_RX_CPL, TO_TRIGGER_TIMER0_RESET},

        //! 用定时器0的溢出事件来产生中断,这个中断实际上表示很久没有发生通信了,是一个通信超时中断
        { SIGNAL2, USE_TIMER0_OVF, TO_GENERATE_INTERRUPT, EVERY_TIME, ENABLE_INTERRUPT},
    )
----------------------------------------------------------------------------------------------------------------------------------------------------
这一段看不懂;
不知道信号和中断有啥关系,中断不是硬件本身的属性吗?中断向量在单片机的地址也都是固定的吧?信号是楼主自定义的数据结构吧?这两个有必然的联系吗?

    ISR(SIGNAL0)
    {
        //! Signal0 的中断处理程序,每8个USART0接收完成事件触发一次
    }
----------------------------------------------------------------------------------------------------------------------------------------------------
这个如果是中断处理程序我觉得并不够明确,如果不看前面一段,只看通过括号里的SIGNAL0并不能知道是啥中断,还要考函数里的注释才能知道,还不如用一个有意义的函数名表示来的清晰,我是菜鸟,理解的比较浅,吐槽完毕。另外第21行是不是应该改成Signal2?

出0入296汤圆

 楼主| 发表于 2013-11-16 23:00:25 | 显示全部楼层
sbk100 发表于 2013-11-16 22:41
SIGNAL_CFG(
        //! 使用USART0接收完成事件产生中断,因为USART有16字节的FIFO,所以我们配置该事件 ...

SIGNAL不是一个数据结构,是一个硬件概念,SIGNAL可以用来产生中断,也可以用来直接触发
外设的动作而不经过内核的干预。我的这个系统中,中断向量表是用户自己定义的,可以选择任
何自己感兴趣的信号来产生中断,所以中断处理程序是以Signal为单位的。

出0入0汤圆

发表于 2013-11-17 15:04:40 | 显示全部楼层
Gorgon_Meducer 发表于 2013-11-16 23:00
SIGNAL不是一个数据结构,是一个硬件概念,SIGNAL可以用来产生中断,也可以用来直接触发
外设的动作而不 ...

上面仁兄抓了个虫子:  范例一第21行,注释Signal1应该改成Signal2.

出0入0汤圆

发表于 2013-11-17 16:40:46 来自手机 | 显示全部楼层
什么是“默默等待房产”?

出0入296汤圆

 楼主| 发表于 2013-11-17 23:25:20 | 显示全部楼层
catwill 发表于 2013-11-17 16:40
什么是“默默等待房产”?

砖头数量多到可以盖房子啊

出0入296汤圆

 楼主| 发表于 2013-11-17 23:28:23 | 显示全部楼层
yiming988 发表于 2013-11-17 15:04
上面仁兄抓了个虫子:  范例一第21行,注释Signal1应该改成Signal2.

谢谢提醒,已经更正

出0入0汤圆

发表于 2013-11-18 13:00:38 | 显示全部楼层
无槽可吐肿么办?

出0入0汤圆

发表于 2013-11-18 15:15:24 | 显示全部楼层
竟然看懂了 。。。。

出0入296汤圆

 楼主| 发表于 2013-11-18 15:18:26 | 显示全部楼层
zhexuejia 发表于 2013-11-18 15:15
竟然看懂了 。。。。

要的就是这个效果哈

出0入0汤圆

发表于 2014-5-18 20:51:15 | 显示全部楼层
老帖了,表示也看懂了,感觉封装以后,考虑东西就清晰了,因为很多底层不需要关心。可能我的比喻不恰当,就好像Arduino把底层封装好,只有一个setup和一个loop似的。

出0入0汤圆

发表于 2014-5-18 22:17:50 | 显示全部楼层
我也看懂了,很开心,可以不用关心很多底层的配置,造福于民啊!

出0入296汤圆

 楼主| 发表于 2014-5-18 22:52:49 | 显示全部楼层
didadida 发表于 2014-5-18 20:51
老帖了,表示也看懂了,感觉封装以后,考虑东西就清晰了,因为很多底层不需要关心。可能我的比喻不恰当,就 ...

这个接口又更新了,更简单,更强大。明天(周一)我来更新这个帖子。

出0入296汤圆

 楼主| 发表于 2014-5-19 14:15:21 | 显示全部楼层
更新了SIGNAL系统的范例。

出0入0汤圆

发表于 2014-5-19 14:22:02 | 显示全部楼层
MARK......................

出0入0汤圆

发表于 2014-5-19 14:56:38 | 显示全部楼层
居然看懂了!
这么写的好处就是可以十分简洁明了地配置中断,同时也使得逻辑十分直接。用户只需要要知道自己想干什么,不需要知道具体实现的细节。配置过程直接描述了行为。


出0入0汤圆

发表于 2014-5-19 15:04:18 | 显示全部楼层
本帖最后由 dongfo 于 2014-5-19 15:21 编辑

但是,往往这样写了,也就意味着用户需要知道配置函数里面那些参数的意义,和使用范围。
看懂了容易,用起来的时候需要熟知命名规则。
正确的配置方法看起来会很和谐,如果用户想要自己配置的时候,可能会出现一些参数之间的组合,没有示例,也不知道具体的寄存器配置动作,就不知道这样是否可行。
还有就是,这样直接由用户指定中断向量的方式确很方便。但是好像没有提及中断优先级。

出0入296汤圆

 楼主| 发表于 2014-5-19 15:59:41 | 显示全部楼层
dongfo 发表于 2014-5-19 15:04
但是,往往这样写了,也就意味着用户需要知道配置函数里面那些参数的意义,和使用范围。
看懂了容易,用起 ...

我的理解是:这类代码都必须是代码生成器提供的,我应该有责任提供一套好用的图形化代码配置工具。
这类代码的生成应该是代码生成器来产生,产生的代码应该做到容易读懂。

同时,必要的说明文档来给用户提供培训也是必须的。你觉得呢?

中断优先级的问题其实是ARM的NVIC统一配置的,不过你提醒的对,我应该提供一个统一的配置接口。

出0入0汤圆

发表于 2014-5-19 20:03:10 | 显示全部楼层
向楼主致敬

出0入0汤圆

发表于 2014-5-19 22:54:21 | 显示全部楼层
Gorgon_Meducer 发表于 2014-5-19 15:59
我的理解是:这类代码都必须是代码生成器提供的,我应该有责任提供一套好用的图形化代码配置工具。
这类 ...

哈哈,最低的门槛,给“最懒”的用户。让一个只有十分有限知识基础的用户用上复杂的处理器。让世界更美很重要,让世界变简单也很重要----懒人自白。
是的图形界面,培训文档很重要。
这种写法比STM32的固件库人性化,STM32库函数很多,相互之间关联不是那么明显。
初学者往往会觉得使用库函数太复杂,和直接用寄存器相比没有太大的优势。如果没有示例,往往用户还是会直接去看手册,根据手册自己配置。

出0入296汤圆

 楼主| 发表于 2014-5-19 23:20:51 | 显示全部楼层
dongfo 发表于 2014-5-19 22:54
哈哈,最低的门槛,给“最懒”的用户。让一个只有十分有限知识基础的用户用上复杂的处理器。让世界更美很 ...

我会努力的

出0入0汤圆

发表于 2014-5-20 13:28:57 | 显示全部楼层
                 
mark up

出0入0汤圆

发表于 2014-12-1 19:22:30 | 显示全部楼层
默默等待房产 崩盘??

出0入0汤圆

发表于 2014-12-1 19:33:13 | 显示全部楼层
表示看不懂 太高升了!!!!!!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 14:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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