搜索
bottom↓
回复: 36

【分享】一点驱动函数的思路

  [复制链接]

出0入0汤圆

发表于 2017-9-22 17:23:27 | 显示全部楼层 |阅读模式
本帖最后由 heianshaonian 于 2017-9-22 18:14 编辑

一点驱动函数的思路,参考linux驱动,rt-thread驱动的一些想法,当然他们的驱动都采用init、write、read、ctrl的模式,和周立功的《面向AMetal框架与接口的编程(上)》,还参考了cube的一个帖子,认为这样的便于扩展,同样的业务代码量增加不少,但感觉这样会有利于维护和可移植性。写这个希望获得一些建议和意见。

一、ledDev

led驱动。

1. 介绍

ledDev句柄

  1. typedef enum
  2. {
  3.     LED0_OUT = 0,
  4.     LED1_OUT,

  5.     LED_MAX_OUT,

  6. }ledDev_id_t;

  7. typedef struct
  8. {
  9.     ledDev_err_t (*led_set)      (void *ledDev, uint8_t state);
  10.     ledDev_err_t (*led_get)      (void *ledDev, uint8_t *status);
  11.     ledDev_err_t (*led_on)       (void *ledDev);
  12.     ledDev_err_t (*led_off)      (void *ledDev);
  13.     ledDev_err_t (*led_toggle)   (void *ledDev);

  14. } ledDev_fun_t;

  15. typedef struct
  16. {
  17.     ledDev_fun_t g_ledDev_fun;
  18.     ledDev_id_t g_ledDev_id;

  19. }ledDev_t;
复制代码

定义了ledDev驱动的调用函数和id,led接口很多,使用这个识别,初始化需要给id赋值。为了方便排错,做id的时候最好从1开始(我这里还没做)。驱动函数中 *void ledDev 就是 ledDev_t 实例的一个指针,利用它函数获得它的ID号。

句柄注册

  1. ledDev_err_t ledDev_regist(ledDev_t *p_ledDev,ledDev_id_t g_ledDev_id)
  2. {
  3.     p_ledDev->g_ledDev_id = g_ledDev_id;
  4.     p_ledDev->g_ledDev_fun.led_set = bsp_led_set;
  5.     p_ledDev->g_ledDev_fun.led_get = bsp_led_get;
  6.     p_ledDev->g_ledDev_fun.led_on = bsp_led_on;
  7.     p_ledDev->g_ledDev_fun.led_off = bsp_led_off;
  8.     p_ledDev->g_ledDev_fun.led_toggle = bsp_led_toggle;

  9.     if(EID_LED_NOERR != bsp_led_init(p_ledDev))
  10.     {
  11.         return EID_LED_PARAM;
  12.     }
  13.    
  14.     bsp_led_off(p_ledDev);

  15.     return ledDev_getRegState(p_ledDev);
  16. }
复制代码

句柄注册首先对句柄的参数和调用函数进行初始化,然后初始化硬件。 函数包括设置,获取,置位,复位,翻转,没有把初始化放进来。

2. 使用方法

定义句柄

  1. ledDev_t led0;
复制代码


注册句柄

  1. if(EID_LED_NOERR != ledDev_regist(&led0,LED0_OUT))
  2. {
  3.   return false;
  4. }
复制代码

LED0_OUT是led驱动端口号

调用

  1. led0.g_ledDev_fun.led_on(&led0);
  2. delay_ms(1000);
  3. led0.g_ledDev_fun.led_off(&led0);
复制代码


demo: dev/demo/app_led/user/main.c

3.下载
GitHub: dev-master
本站:   
readmePDF文件:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入42汤圆

发表于 2017-9-22 17:36:54 | 显示全部楼层
这个LED的驱动是不是应该写成单例的形式,只能有一个句柄?

出100入101汤圆

发表于 2017-9-22 17:47:40 | 显示全部楼层
单片机的话,单独的模块,注意多使用宏,就可以了

出0入0汤圆

 楼主| 发表于 2017-9-22 18:03:26 | 显示全部楼层
liyang121316 发表于 2017-9-22 17:36
这个LED的驱动是不是应该写成单例的形式,只能有一个句柄?

可以有多个,id不同,你看demo就是两个句柄led0和led1

出0入0汤圆

发表于 2017-9-22 18:43:45 来自手机 | 显示全部楼层
不错。继续,

出0入0汤圆

发表于 2017-9-23 00:06:28 来自手机 | 显示全部楼层
这种封装思想挺好的,方便管理,有用武之地

出0入0汤圆

发表于 2017-9-23 00:38:37 来自手机 | 显示全部楼层
那本书是周立功新书吗?能否发我一份

出0入10汤圆

发表于 2017-9-23 14:12:27 | 显示全部楼层
这跟面向对象有什么分别吗?

出0入0汤圆

 楼主| 发表于 2017-9-23 20:23:39 | 显示全部楼层
higeo 发表于 2017-9-23 00:38
那本书是周立功新书吗?能否发我一份

http://bbs.elecfans.com/jishu_1272886_1_1.html

出0入0汤圆

 楼主| 发表于 2017-9-23 20:25:52 | 显示全部楼层
10xjzheng 发表于 2017-9-23 14:12
这跟面向对象有什么分别吗?

就是面向对象的思想。心血来潮,尝试写一写,听取一些意见。

出0入0汤圆

 楼主| 发表于 2017-9-23 20:27:04 | 显示全部楼层

谢谢鼓励

出0入0汤圆

 楼主| 发表于 2017-9-23 20:32:05 | 显示全部楼层
凌晨一点 发表于 2017-9-23 00:06
这种封装思想挺好的,方便管理,有用武之地

一个项目好比金字塔模型,是由积木搭起来,一层层搭,降低模块层级间依赖,移植只需把底层的积木给替换掉。

出0入12汤圆

发表于 2017-9-24 22:21:07 来自手机 | 显示全部楼层
led0.g_ledDev_fun.led_on(&led0); 想个方法把参数去掉吧。这个参数虽然是必要的,但"看"起来是多余的。

出0入0汤圆

发表于 2017-9-24 22:36:33 来自手机 | 显示全部楼层
ad,pwm,spi,iic等等,楼主都封装了吗?是个大工程。

出0入0汤圆

发表于 2017-9-24 22:52:23 | 显示全部楼层
楼主 不错啊, 拒绝平庸代码  

led0.g_ledDev_fun.led_on(&led0);
led0 的实体都有了,  再传入是有点多余了,

出0入0汤圆

发表于 2017-9-24 23:18:01 | 显示全部楼层
lz你咋不用cpp来写?这么简单的东西还搞这么复杂……

出0入0汤圆

发表于 2017-9-24 23:30:49 | 显示全部楼层
不错 学习

出10入0汤圆

发表于 2017-9-25 07:55:36 来自手机 | 显示全部楼层
大部分外设,周立功针对lpc824都有封装,值得学习

出0入0汤圆

 楼主| 发表于 2017-9-25 09:06:10 | 显示全部楼层
kv2004 发表于 2017-9-24 22:21
led0.g_ledDev_fun.led_on(&led0); 想个方法把参数去掉吧。这个参数虽然是必要的,但"看"起来是多余的。 ...

方法肯定有的,你看linux和rt-thread的设备驱动,就知道了。
他们注册用一个名字,并将设备放入链表中,
然后
dev = find_dev(name)
write(dev,...);
read(dev,...);



出0入0汤圆

 楼主| 发表于 2017-9-25 09:10:03 | 显示全部楼层
Excellence 发表于 2017-9-24 22:36
ad,pwm,spi,iic等等,楼主都封装了吗?是个大工程。

还没有,也是最近学习才写的,非常浩瀚的工程,一起学习咯

出0入0汤圆

 楼主| 发表于 2017-9-25 09:17:22 | 显示全部楼层
haffman1 发表于 2017-9-24 23:18
lz你咋不用cpp来写?这么简单的东西还搞这么复杂……

这个本来就是面向对象的思想,不会cpp,底层大多都还是用c写,实现是复杂了点,本来几句就可以搞定的。

出0入0汤圆

 楼主| 发表于 2017-9-25 09:18:37 | 显示全部楼层
mainbp 发表于 2017-9-25 07:55
大部分外设,周立功针对lpc824都有封装,值得学习

对啊,我也是看了有感而写的点,思考下自己编码思路是否正确, 能搞到一份源码就安逸了。

出0入0汤圆

 楼主| 发表于 2017-9-25 09:20:02 | 显示全部楼层
郭震2009 发表于 2017-9-24 22:52
楼主 不错啊, 拒绝平庸代码  

led0.g_ledDev_fun.led_on(&led0);

是的,暂时还搞不定,如果要搞定这个,要加很多东西,还不如直接使用rt-thread,他这个封装得特别好.

出0入0汤圆

发表于 2017-9-25 09:33:14 | 显示全部楼层
这就叫面向接口编程。

出0入42汤圆

发表于 2017-9-25 09:40:24 | 显示全部楼层
heianshaonian 发表于 2017-9-22 18:03
可以有多个,id不同,你看demo就是两个句柄led0和led1

那你这两个不同的LED的ID对应的硬件一样吗,你注册的时候没有失败的情况吗?

出0入0汤圆

发表于 2017-9-25 09:45:52 | 显示全部楼层
赞赞赞~~~

出0入0汤圆

发表于 2017-9-25 10:52:38 | 显示全部楼层
mainbp 发表于 2017-9-25 07:55
大部分外设,周立功针对lpc824都有封装,值得学习

老周的源码公开吗?
以前LPC213X的芯片,老周写的封装,太绕。

出0入0汤圆

发表于 2017-9-25 12:54:49 | 显示全部楼层
一直这么干的,从未整理过,看来得找个时间这整理一下了。
奈何琐事太多。



出0入0汤圆

发表于 2017-9-25 13:58:27 来自手机 | 显示全部楼层
mainbp 发表于 2017-9-25 07:55
大部分外设,周立功针对lpc824都有封装,值得学习

有代码吗?学习一下

出10入0汤圆

发表于 2017-9-25 18:22:55 | 显示全部楼层
需要的可以看一下;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2017-9-25 23:51:16 | 显示全部楼层
mainbp 发表于 2017-9-25 18:22
需要的可以看一下;

这波很关键

出0入0汤圆

发表于 2017-9-26 07:06:24 | 显示全部楼层
本帖最后由 armku 于 2017-9-26 09:12 编辑

OutputPort led0(PB0);
led0=1;//开灯
led0=false;//关灯
led0=!led0;//灯电平取反

c++11

出0入0汤圆

 楼主| 发表于 2017-9-26 10:58:11 | 显示全部楼层
armku 发表于 2017-9-26 07:06
OutputPort led0(PB0);
led0=1;//开灯
led0=false;//关灯

从可移植性来讲,还是C是主流,但是可以给它整一种C++的思想

出0入17汤圆

发表于 2017-9-29 00:57:49 来自手机 | 显示全部楼层
这样驱动太复杂。可以看看ebox代码。

出0入0汤圆

发表于 2017-9-29 01:46:26 来自手机 | 显示全部楼层
如果平台固定,资源强大,改版很少,做长期开发,这样写很容易复用。如果小单片机,追求运行速度和开发速度,这样写不太不是最优选择。一直对此有纠结

出0入0汤圆

发表于 2017-9-29 10:12:35 | 显示全部楼层
有点面向对像的意思

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-6-2 02:30

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

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