Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
packages_软件包
从 LED 开始学习制作 RT-Thread 软件包
6.00
发布于 2020-07-08 17:16:49 浏览:1736
订阅该版
[tocm] ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/eef11f62992daa08b8b20e48e53d644a04b1b408.jpg) ## 准备工作 ### 环境搭建 - 下载 RT-Thread 源码 - 安装 ENV 工具 - 选择一个 BSP 包进行测试 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/33a64d4619e04471a0603516b3d807ab1921d5a2.png) ### 收集软件包的需求 根据您想制作的软件包,收集软件包的需求。 比如我们想做个控制 LED 闪烁的软件包,希望它有如下功能: - 控制 LED 亮或灭; - 控制 LED 闪烁时间; - 控制 LED 闪烁频率; - 控制 LED 闪烁次数; - ...... 同时,对于软件包的使用还有如下需求: - 支持任意多个 LED; - 接口简单,就像 `LOG_X` 一样,想在哪里触发 LED 动作,一行代码就能搞定。 这个阶段一定要点到即止,挑出最基本且重要的功能,然后进一步抽象。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/8cfff47fa190b5bb516c9411a726b3f14db6e0ac.gif) **别忘了,还要给软件包起个好听的名字!** 我们决定基于链表来实现,并给软件包起名 **littled**,是 Little LED Daemon 的缩写,意思是一个小巧的 LED 驱动服务程序。我们希望它像后台服务程序一样工作,从而使应用层的调用变得简单。 ### 创建远程代码仓库 在 GitHub 上创建一个名为 rtt-littled 的仓库,选择开源许可协议,添加 README.md 文件。OK! ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/3abf13f23f1f5bdeddd107d336d3bcc85110554e.png) ### 搭建本地软件包工程 将刚刚创建的远程仓库克隆到本地 ```shell git clone git@github.com:luhuadong/rtt-littled.git ``` 进入本地仓库,创建 3 个目录 ```shell cd rtt-littled mkdir src inc examples ``` 其中 src 目录存放源文件,inc 目录存放头文件,examples 目录存放示例代码。然后在各目录下创建相应的文件,并添加一个 SConscript 文件用于指导编译。最终的目录框架如下: ```shell ├── examples │ └── littled_sample.c ├── inc │ └── littled.h ├── src │ └── littled.c ├── LICENSE ├── README.md └── SConscript ``` ## 实现软件包功能 ### 软件架构设计 littled 软件包采用类似 C/S 的架构,littled 后台线程负责接收来自用户线程的请求,并进行解析和响应,如果接收到需要连续动作的请求,则会创建子任务线程进行处理,接着继续等待请求。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/36019d0c5224801133fcb79201302107752e68d7.png) littled 内部维护一个链表,用于记录 LED 设备信息,初始化时会将 LED 节点插入链表,从而实现支持任意多 LED 的需求。 ### 定义接口函数 #### 注册与注销 注册 LED 只需要提供引脚号和有效电平即可。 ```c int led_register(rt_base_t pin, rt_base_t active_logic); ``` 参数 pin 表示 LED 引脚号,参数 active_logic 表示使 LED 亮的电平逻辑值(PIN_HIGH 或 PIN_LOW)。注册成功返回一个大于 0 的 LED 描述符,注册失败返回小于 0 的错误码。 对于已注册的 LED,当不需要使用了,可以将其注销。 ```c void led_unregister(int ld); ``` 参数 ld 表示将要注销的 LED 描述符。 #### 设置 LED 模式 LED 模式包括常亮、熄灭、翻转、闪烁,定义 led_mode 函数将其全部涵盖。采用软件模拟 PWM 的方式控制 LED 闪烁。 ```c int led_mode(int ld, rt_uint32_t period, rt_uint32_t pulse, rt_uint32_t time, rt_uint32_t count); ``` 参数 ld 表示 LED 描述符,参数 period 表示周期时间,参数 pulse 表示脉冲宽度(高电平持续时间),参数 time 表示闪烁持续时间,参数 count 表示闪烁次数。 当 pulse = 0 时,LED 熄灭;当 pulse = period 时,LED 常亮。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/7d3bd62aac32c8c99b451dea334798412431e397.gif) ### 编写测试代码 实现接口函数之前,我们先把测试代码写好。这样有两个好处,一是更清楚我们想怎么使用它;二是后面可以一边实现接口函数一边测试,把功能刚好实现即可,避免过度开发,即测试驱动开发(TDD)。 ```c #define LED1_PIN GET_PIN(C, 7) static int littled_sample(void) { int led_test = led_register(LED1_PIN, PIN_HIGH); LED_ON(led_test); /* 常亮 */ rt_thread_mdelay(3000); LED_OFF(led_test); /* 熄灭 */ rt_thread_mdelay(3000); LED_BEEP(led_test); /* 闪烁三下 */ rt_thread_mdelay(5000); LED_BLINK(led_test); /* 持续闪烁 */ led_unregister(led_test); } #ifdef FINSH_USING_MSH MSH_CMD_EXPORT(littled_sample, Driver LED based on littled); #endif ``` 为了方便调用,预先定义了几个模式: ```c #define LED_ON(ld) led_mode(ld, 1, 1, 0, 0) #define LED_OFF(ld) led_mode(ld, 1, 0, 0, 0) #define LED_TOGGLE(ld) led_mode(ld, 0, 0, 0, 1) #define LED_BEEP(ld) led_mode(ld, DEFAULT_PERIOD, DEFAULT_PULSE, 0, BEEP_COUNT) #define LED_BELL(ld) led_mode(ld, DEFAULT_PERIOD, DEFAULT_PULSE, BELL_TIME, 0) #define LED_BLINK(ld) led_mode(ld, DEFAULT_PERIOD, DEFAULT_PULSE, 0, 0) #define LED_BLINK_FAST(ld) led_mode(ld, DEFAULT_PERIOD/2, DEFAULT_PULSE/2, 0, 0) #define LED_BLINK_SLOW(ld) led_mode(ld, DEFAULT_PERIOD*2, DEFAULT_PULSE*2, 0, 0) ``` ### 具体代码实现 由于篇幅限制,具体数据结构定义及函数实现,请看代码:
### 修改 SConscript 文件 littled 软件包的文件少,因此直接指定文件名就好啦 ```python from building import * Import('rtconfig') src = [] cwd = GetCurrentDir() # add littled src files. if GetDepend('PKG_USING_LITTLED'): src += Glob('src/littled.c') if GetDepend('PKG_USING_LITTLED_SAMPLE'): src += Glob('examples/littled_sample.c') # add littled include path. path = [cwd + '/inc'] # add src and include to group. group = DefineGroup('littled', src, depend = ['PKG_USING_LITTLED'], CPPPATH = path) Return('group') ``` 完成后可以将代码 commit 一下,push 到远程仓库,方便后续测试。 ## 测试 ### 生成软件包索引 RT-Thread 的 Env 工具为我们提供了自动生成软件包索引的向导功能。命令如下: ```shell pkgs --wizard ``` 大致流程如下图所示,输入 Package 名、版本号、类别、Git 仓库信息...... 即可。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/995ca8bcab8b7818985f01a5d35c5dbe4b1e2bb6.png) ### 修改软件包索引 上一步执行完毕,会生成一个 littled 目录,里面有两个文件,Kconfig 和 package.json,但还需要进一步加工才能用。 在 Kconfig 增加 littled 软件包相应的配置项,比如缺省的周期时间、脉冲宽度等等。 ```shell if PKG_USING_LITTLED config PKG_USING_LITTLED_PERIOD int "default pwm period (ms)" default 1000 config PKG_USING_LITTLED_PULSE int "default pwm pulse (ms)" default 500 config PKG_USING_LITTLED_BELL_TIME int "default bell time (ms)" default 50000 config PKG_USING_LITTLED_BEEP_COUNT int "default beep count" range 1 100 default 3 config PKG_USING_LITTLED_SAMPLE bool "Enable littled sample" default n ``` package.json 文件主要是修改 latest 版本信息。 ```shell { "version": "latest", "URL": "https://github.com/luhuadong/rtt-littled.git", "filename": "littled-latest.zip", "VER_SHA": "master" } ``` ### 本地测试软件包 将软件包索引添加到 env 的 packages 对应位置。 ```shell cp -r rtt-littled ~/.env/packages/packages/peripherals/ ``` 同时修改 peripherals 下的 Kconfig 文件,将 littled 的Kconfig 添加进去,不然 menuconfig 找不到。 ```shell source "$PKGS_DIR/packages/peripherals/littled/Kconfig" ``` 将软件包添加到工程,在 BSP 工程目录执行 `scons --menuconfig`,配置路径如下: ```shell RT-Thread online packages ---> peripheral libraries and drivers ---> [*] littled: Little LED Daemon for LED driver ---> ``` ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/b7b5e3d9cb5d1d67d767a1f019d66a3243700f0c.png) 保持配置,执行 `pkgs --update` 拉取软件包。如果拉取成功,说明软件包索引信息正确。 ### 编译、测试、调试、优化 软件包拉取成功,可以选上测试示例进行编译,编译成功下载到板子进行测试。如果有问题可以重复上述步骤修改代码、提交、测试,直到满足功能需求。 ## 发布 ### 发布软件包版本 littled 软件包通过测试,即可提交代码到 GitHub 远程仓库。 ```shell cd littled git add . git commit -m "v1.0.0" git push origin master ``` 同时,fork RT-Thread 的 packages 仓库并 clone 到本地。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/99b9a9ff47305e17aad8ff1ba84b3d83409dd54f.png) 为方便提交 PR,建议在 packages 本地仓库创建分支 ```shell git checkout -b develop ``` 然后将 littled 软件包索引目录复制到 peripherals 目录下,并把 peripherals/Kconfig 的修改更新过去。 ```shell git add . git commit -m "add littled" git push origin develop ``` ### 提交 Pull Request 完成上一步,在 GitHub 网页上找到对应的提交,可以看到 Pull Request 的提示。确认分支和提交信息无误后,即可向 RT-Thread 的 packages 仓库提交 PR。 之后就是等待审查,合并代码啦! ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/ea9ed1d50c14734790ae56496d84826e97a4d982.gif)
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
阿基米东
https://github.com/luhuadong
文章
7
回答
52
被采纳
3
关注TA
发私信
相关文章
1
更新软件包 没有自动下载软件包
2
点更新软件包后, 软件包并没有被下载
3
RTT加载软件包的机制是什么
4
mqtt软件包,不支持直接关闭?
5
sr04软件包排他性问题
6
有没有大神移植一个HX711称重芯片模块的软件包
7
【建议】软件包分类增加“算法”类
8
软件包ota_downloader的http_ota解析导致内存释放断言
9
RT-Thread Studio软件包
10
rc522 软件包 问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
19
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部