完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
RT-Thread 框架,实用抽象的设备,可以对一些外设、进行【】,这样驱动驱动与上层应用也可以提高连接性。
默认情况下,RT 流水灯是通过一个通用流水灯控制一个线程控制的 BSP 直接的。 这里使用rt_device的方法,把led注册成一个led设备,通过device的API接口进行控制 学习rt_device 提供了更全面的通用接口,可以实现对设备的初始化、读写、控制,当然,如果外部设备配置设备,可以添加额外的设备,也就是可以自己的设备,继承 rt_device。 rt_device 主要的操作如下: /* common device interface */ rt_err_t (*init) (rt_device_t dev); rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag); rt_err_t (*close) (rt_device_t dev); rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size); rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size); rt_err_t (*control)(rt_device_t dev, int cmd, void *args); 可以通过自定义的cmd,利用设备的控制,来实现对设备的管理,如开关、配置等操作 LED改为Device设备 验证平台:NUCLEO-L476RG开发板(STM32L476RG) LED:PA5,高亮:低灭 抽象在软件设计中很有用,使用rt_device上框架后,你会发现,应用层可以与解耦,应用程序只需要通过一个设备名称来访问控制设备,通过标准的设备api来操作设备,不用就是上层如果直接控制应用程序的动力,改变之后。 动态的好处就是,上层不需要改变或改变最小的改变。 注册设备的代码如下: led_dev.c: led设备注册 #include "led_dev.h" #include "board.h" #define LED1_DEVICE_NAME "led1" /* defined the LED0 pin: PA5 */ #define LED0_PIN GET_PIN(A, 5) static struct rt_device _led_dev; static rt_err_t _led_init(rt_device_t dev) { rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); return RT_EOK; } static rt_err_t _led_open(rt_device_t dev, rt_uint16_t oflag) { if (dev == RT_NULL) return -RT_ERROR; return RT_EOK; } static rt_err_t _led_close(rt_device_t dev) { if (dev == RT_NULL) return -RT_ERROR; return RT_EOK; } static rt_err_t _led_control(rt_device_t dev, int cmd, void *args) { if (dev == RT_NULL) return -RT_ERROR; switch (cmd) { case LED_CTRL_CMD_POWER_ON: rt_pin_write(LED0_PIN, PIN_HIGH); break; case LED_CTRL_CMD_POWER_OFF: rt_pin_write(LED0_PIN, PIN_LOW); break; default: break; } return RT_EOK; } #ifdef RT_USING_DEVICE_OPS const static struct rt_device_ops led_dev_ops = { _led_init, _led_open, _led_close, RT_NULL, RT_NULL, _led_control }; #endif static int led1_device_register(const char *name, void *user_data) { _led_dev.type = RT_Device_Class_Miscellaneous; _led_dev.rx_indicate = RT_NULL; _led_dev.tx_complete = RT_NULL; #ifdef RT_USING_DEVICE_OPS _led_dev.ops = &led_dev_ops; #else _led_dev.init = _led_init; _led_dev.open = _led_open; _led_dev.close = _led_close; _led_dev.read = RT_NULL; _led_dev.write = RT_NULL; _led_dev.control = _led_control; #endif _led_dev.user_data = user_data; /* register a character device */ rt_device_register(&_led_dev, name, RT_DEVICE_FLAG_RDWR); return 0; } int led1_device_init(void) { return led1_device_register(LED1_DEVICE_NAME, RT_NULL); } led_dev.h #ifndef __LED_DEV_H__ #define __LED_DEV_H__ #include #include #define LED_CTRL_CMD_POWER_OFF 0x00 #define LED_CTRL_CMD_POWER_ON 0x01 int led1_device_init(void); #endif led1_app.c : led 设备应用接口 #include "led1_app.h" #ifndef LED1_DEVICE_NAME #define LED1_DEVICE_NAME "led1" #endif static rt_device_t led1_dev = RT_NULL; static rt_device_t get_led1_dev(void) { if (led1_dev != RT_NULL) return led1_dev; led1_dev = rt_device_find(LED1_DEVICE_NAME); return led1_dev; } static rt_err_t led1_open(void) { rt_device_t dev = get_led1_dev(); if (dev == RT_NULL) return -RT_ERROR; return rt_device_open(dev, RT_DEVICE_FLAG_RDWR); } rt_err_t led_grn_init(void) { led1_device_init(); return led1_open(); } rt_err_t led_grn_power_on(void) { rt_device_t dev = get_led1_dev(); if (dev == RT_NULL) return -RT_ERROR; return rt_device_control(dev, LED_CTRL_CMD_POWER_ON, RT_NULL); } rt_err_t led_grn_power_off(void) { rt_device_t dev = get_led1_dev(); if (dev == RT_NULL) return -RT_ERROR; return rt_device_control(dev, LED_CTRL_CMD_POWER_OFF, RT_NULL); } led1_app.h #ifndef __LED1_APP_H__ #define __LED1_APP_H__ #include "led_dev.h" rt_err_t led_grn_init(void); rt_err_t led_grn_power_on(void); rt_err_t led_grn_power_off(void); #endif main.c 初始化与功能验证 #include #include #include #include "drv_gpio.h" #include "key.h" #include "pms.h" #include "led1_app.h" int main(void) { key_gpio_init(); led_grn_init(); pms_task_init(); rt_thread_mdelay(1000); #ifdef RT_USING_PM rt_pm_module_delay_sleep(PM_POWER_ID, 10000); //rt_pm_module_release(PM_POWER_ID, PM_SLEEP_MODE_NONE); #endif while (1) { led_grn_power_on(); /* LED ON */ rt_thread_mdelay(500); led_grn_power_off(); /* LED OFF */ rt_thread_mdelay(500); } } 运行效果 msh > | / - RT - Thread Operating System / | 4.1.0 build Jan 16 2022 18:19:43 2006 - 2021 Copyright by rt-thread team [D/key] key_gpio_init. [D/key] PIN_KEY0=45 msh > msh > msh > msh >list_device device type ref count -------- -------------------- ---------- led1 Miscellaneous Device 1 /* 注册的设备 */ uart2 Character Device 2 pin Miscellaneous Device 0 msh > 心得 注意rt_device设备,操作前先:init或open 使用设备发现的方式有点复杂,可以直接控制来的方式,但是很容易发现,但很方便 使用设备的方式,很容易对其他外设的控制,如喇叭、电机等 只是控制一个 LED,确实有点浪费,通过修改可以控制一组LED 小结 学习掌握的使用,了解使用的目的是为了上架设备的驱动力的解耦连接。 了解抽象在软件设计中的作用。 |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
883 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
3025 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1409 浏览 0 评论
2039 浏览 0 评论
1574 浏览 0 评论
75139 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 16:25 , Processed in 0.505504 second(s), Total 39, Slave 32 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号