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

2019-12-22 13:48发布

本帖最后由 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
本站:    dev-master.zip (2.23 MB, 下载次数: 32) 2017-9-22 17:22 上传 点击文件名下载附件
readmePDF文件: dev.pdf (279.14 KB, 下载次数: 51) 2017-9-22 17:23 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
36条回答
Excellence
1楼-- · 2019-12-24 02:24
ad,pwm,spi,iic等等,楼主都封装了吗?是个大工程。
郭震2009
2楼-- · 2019-12-24 06:00
楼主 不错啊, 拒绝平庸代码  

led0.g_ledDev_fun.led_on(&led0);
led0 的实体都有了,  再传入是有点多余了,
haffman1
3楼-- · 2019-12-24 07:37
lz你咋不用cpp来写?这么简单的东西还搞这么复杂……
wzbwzb
4楼-- · 2019-12-24 09:05
 精彩回答 2  元偷偷看……
chenhaimeng123
5楼-- · 2019-12-24 09:08
大部分外设,周立功针对lpc824都有封装,值得学习
heianshaonian
6楼-- · 2019-12-24 13:17
kv2004 发表于 2017-9-24 22:21
led0.g_ledDev_fun.led_on(&led0); 想个方法把参数去掉吧。这个参数虽然是必要的,但"看"起来是多余的。 ...

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



一周热门 更多>