学习笔记|驱动设计、实现异步日志等过程中你该注意哪些?

大家好,今天分享一篇学习营小伙伴的学习笔记。

前言

本期学习营的主要目标是以空气质量分析仪原型为项目掌握 RT-Thread 的运用。需要实现的功能为:采集空气质量(如温湿度、pm2.5、甲醛)数据,打印数据,根据需要设置 LED 报警灯,按键切换数据类型。完成以上功能将使用到如下知识点:STM32 BSP 制作、线程创建、Env 的使用、外设的使用、写传感器驱动、任务间通信的 IPC 的使用。

第一周任务简析:

第一周: 1、把BSP 跑起来 2、实现按键模块 3、实现报警模块 4、实现温湿度传感器驱动

本周任务重点及难点为:
1)创建一个适合你自己开发板的BSP。所谓BSP即板级支持包,对于任何的OS都绕不过它,因为他是屏蔽底层硬件细节使得上层应用软件可以运行于多个平台的桥梁。而RT-Thread BSP的设计积极开放,相对于其他RTOS都要便捷。通过对照官网给的文档便能创建一个可用的BSP是其最大的亮点。本次训练营的同学按照官网手册基本都完成了该步骤,说明其完全具有开放性及可能性。

2)第一次设计基于RT-Thread的驱动程序及温湿度传感器驱动。每款RTOS的驱动设计都有其所谓的框架,按照框架来,驱动设计问题不大。设计第一个驱动时,应当有意识的注意到这一点,多写几个驱动就能掌握其套路。可能遇见的困难就在于我们调试每款不能的传感器时要遵照手册来操作他,往往我们会由于时序、操作步骤、硬件连接而导致无法正确读数。这应该就是写驱动真正困难之处。

3)按键模块及LED报警模块相对容易,按照官网文档及例程便能设计出来,因此再次不必多言。要说的可能就是赞一下官网的文档写的太牛逼了,很细很清晰。而且是中文的哦,中国人做的RTOS嘛,^_^ 

查看详细作业情况请至RT-Thread论坛:

https://www.rt-thread.org/qa/thread-421579-1-1.html

第二周任务简析:

本周写驱动是基于RT-Thread的外设进行,所以首先要知道你的传感器是什么外设,然后再去看外设文档,学会使用 rtt 外设,之后写传感器驱动。

第二周:1、完成温湿度应用模块,创建温湿度测量线程。2、编写PM2.5 传感器驱动,创建PM2.5测量线程。3、编写甲醛传感器的驱动,创建甲醛测量线程(选做)

本周任务重点为:
1)学习如何在RT-Thread创建线程。在裸机程序中,多个功能模块一般都是以轮询的方式顺序执行的,也可以通过中断的方式进行切换。但在RTOS中,有线程的概念及应用,使得多个功能模块可以并行执行。这一点和裸机的顺序执行有很大的区别,在编程做项目时应当适应。

在裸机中,也是会涉及到功能划分。但是在裸机中,一般功能之间的代码是这样实现的:
 1void main(void)
 2{
 3xx_init();
 4XXX_init();
 5...
 6while(1)
 7{
 8do_somthing0();
 9delay(10);
10在RT-Thread中会将三个功能函数变成3个独立的互不干扰的线程趋势线相应的功能:
11do_somthing1();
12do_somthing2();
13...
14}

在RT-Thread中会将三个功能函数变成3个独立的互不干扰的线程趋势线相应的功能:
 1//main.c
 2void main(void)
 3{
 4xx_init();
 5XXX_init();
 6}
 7//可在其他.c文件创建线程、启动线程
 8thread0 = rt_thread_create(“thread0”, do_somthing0, ,,);
 9rt_thread_startup(rt_thread_t thread0);
10thread1 = rt_thread_create(“thread1”, do_somthing1, ,,);
11rt_thread_startup(rt_thread_t thread1);
12thread2 = rt_thread_create(“thread2”, do_somthing2, ,,);
13rt_thread_startup(rt_thread_t thread2);
在rt-thread中创建线程本身比较容易,只要参照官网文档即可完成。创建线程示例如下:

https://www.rt-thread.org/document/site/programming-manual/thread/thread/#_16(请将以上链接复制至外部浏览器打开)

这个例子创建一个动态线程初始化一个静态线程,一个线程在运行完毕后自动被系统删除,另一个线程一直打印计数。
本周任务难点为:
2)PM2.5 传感器驱动程序的设计
之所以把PM2.5 传感器驱动程序的设计作为难点是因为在写驱动时要严格按照手册进行。每换一种类型的传感器都要先仔细学习其手册。本设计中涉及到的传感器为GP2Y1014AU粉尘传感器。
工作原理:GP2Y1014AU粉尘传感器是夏普开发的一款光学灰尘监测传感器模块,在其中间有一个大洞,空气可以自由流过,它里面邻角位置放着红外发光二极管和光电晶体管,红外发光二极管定向发送红外,当空气中有微粒阻碍红外时,红外线发送漫反射,光电晶体管接收到红外,所以信号输出引脚电压发送变化。
硬件连接:需要连接1个150欧的电阻,和1个220μF的电容,具体位置如图所示。

640?wx_fmt=png

通过上图可以得到的信息是ILED这里给低电平才能导通这个红外管。另外整个脉冲的时间也有要求,高电平时间为0.32ms,整个周期为10ms。这在程序中都要有所体现。且注意10ms的延时选用的延时函数要注意用那种可以任务切换的。检测周期为10ms,红外从发射到接收需要一定时间,那么在什么时候检测才是有效的呢?这个要看说明书中的输出信号图,如下图所示,将采样时间设置为0.28ms可以得到一个稳定值。

640?wx_fmt=png

查看详细作业情况请至RT-Thread论坛:

https://www.rt-thread.org/qa/thread-421705-1-1.html

第三周任务简析:


第三周:1、实现异步日志(熟悉 IPC:邮箱的使用) 2、系统跑起来(熟悉 IPC:事件集的使用)3、在论坛提交作业(分享学习心得、提问题均可)
本周任务重点及难点为:
本周任务本质是实现如何进行进程间的同步及进程间的通信。进程间的同步也好进程间的通信也好都用多种方式,本次只是分别使用了其中一种,如线程间的同步使用的是事件集,线程间的通信使用的是邮箱。那些其他线程间的同步及通信在之后的学习、项目中也应当学习使用,并比较各自的优缺点及适用场景。
1)实现异步日志
这里谈一下本任务使用邮箱传递信息时大家可能会碰到的一个难点即消息的定义。这个消息的结构体定义需要我们自行设计,根据作业的要求进行设计。作业要求:mylog() 的参数至少有两个 mylog(char* tag, void* data) ,tag 表示数据类型(如 temp),data 表示数据大小。也就是打印线程解析数据时,一要能分析出是什么传感器,二要能得出该传感器的测量值。其实这个进行合理化设计还是不太容易的,为了早点交作业我是粗略的进行了一个设计。
1struct mylog_msg
2{
3                char *tag;
4                int *data;
5};

在mylog函数中我是这样使用的:

1void mylog(char *tag, int *data)
2{
3                static struct mylog_msg mb_data_send;
4                mb_data_send.tag = tag;
5                mb_data_send.data = data;
6                rt_mb_send(&mb, (rt_ubase_t)&mb_data_send);
7                /延时1000ms */
8                rt_thread_mdelay(1000);
9}
这样设计其实也有不少问题,杨老师在作业中要求的其实是void *data,但在实际写代码的过程中碰到一些问题,暂时没法解决所以就偷懒先改成了这样,以后有空再研究了。在论坛中看到有一个小伙伴是用strcpy、strcat进行的拼接,还有一个小伙伴直接把把两个参数直接打包在一起,使得mylog就只有一个参数。可谓八仙过海各显神通。
2)事件集的使用
老师在布置作业时用在线的 plant uml 画的uml 图。简单的概括起来就是: 1.按键控制传感器是否采集数据2.采集数据后判断是否超出阈值,此时抛出几个事件3.采集数据后由打印线程打印数据

查看详细作业情况请至RT-Thread论坛:

https://www.rt-thread.org/qa/thread-421809-1-1.html

总结

通过本次学习,我学习到了很多RT-Thread的知识,并把以前自己关于C语言、操作系统、STM32单片机的相关知识也复习了一下。总得来说收获很多,但是由于受时间的制约,我肯定我自己并没有扎扎实实的把用到的知识都熟练掌握,因此在之后会每周抽几个小时来继续复习已经学过的知识。每天不在乎学太多,只要每天都在学,那么总体就是往前进的。另外我觉得选择RT-Thread这款RTOS来学习应用,这个大方向是对了。以前做项目用过rtems,自学过tinyos和freertos,总是学完用完就扔,但这次应该不会了,方向应该是对了。因为RT-Thread简单易用支持多,文档详细,组件、软件包也不少。
大的方向对了,下面就是怎么干。现在通过这次入门训练营已经踏进RT-Thread的大门,下面就是领略RT-Thread的一路风景。这个肯定不是短时间能做完的。后续大概计划是:
(1)系统学习官方中必要的文档,内核、组件、软件包。
(2)写各种接口的传感器驱动。
(3)学习网络应用相关的内容。把自己的传感器数据提交到云服务器。
(4)考虑是否挑战一下RT-Thread的认证。
很高兴自己能找到方向,并步入RT-Thread的大门。RT-Thread学习之路还很长,千万不用着急,也不能着急!每天进步一点点就好。祝大家都学有收获,祝RT-Thread越来越好,用的人越来越多。

看到这里,你是不是也想参加学习营体验一下呢~机会来啦

640?wx_fmt=jpeg

第3期:RT-Thread实战入门学习营报名

本期学习营目标: 掌握RTOS在实际工程中的应用

面向群体:面向裸机转RTOS用户(你应该有很好的嵌入式基础)、刚开始学习RTOS的小白、学了RT-Thread内核但不知道怎么用的

学习方式: 线上学习实现功能:空气质量检测仪:采集空气质量数据,打印到串口终端,根据需要设置LED报警灯,按键切换数据类型。涉及到知识点: 线程、ipc、任务划分、外设使用自备硬件:STM32控制板(型号不限,必备)+温湿度传感器(必备)+PM2.5传感器(必备)+甲醛传感器(选配)+报警LED灯(板载)+按键(板载 )+ 其他合适传感器(选配)

*新增 挑战周硬件准备:花式点灯硬件准备,如多条灯带或 点阵模块,建议充分发挥下想象力想下想做的花式点灯效果<如音乐频谱、花式呼吸灯,要求用到RTOS内核功能>(必备)

640?wx_fmt=png

报名流程:扫码报名?信息审核?发放入营通知

参与学员:

请确保已阅读以上内容,然后再填写报名。

END

RT-Thread线上活动

1、【RT-Thread能力认证考试12月——RCEA】经过第一次考试的验证,

能力认证官网链接:https://www.rt-thread.org/page/rac.html(在外部浏览器打开)

640?wx_fmt=jpeg

立即报名

#题外话# 喜欢RT-Thread不要忘了在GitHub上留下你的640?wx_fmt=pngSTAR640?wx_fmt=png哦,你的star对我们来说非常重要!链接地址:https://github.com/RT-Thread/rt-thread

你可以添加微信18917005679为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群

640?wx_fmt=jpeg

RT-Thread

长按二维码,关注我们

640?wx_fmt=png
看这里,求赞!求转发!
640?wx_fmt=gif

640?wx_fmt=gif点击阅读原文进入GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值