0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于RT-Thread操作系统软件框架设计思路

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-07-07 10:09 次阅读

项目中使用到rt—thread就会涉及到对操作系统的一个软件框架的搭建过程思路,这里拿已经完成城的项目做一些分享,希望对读者有些启发。

项目要求:读取温湿度,串口打印,数据定时发送,lcd显示,平台上传,按键设置,SD 卡存储等

系统涉及到的硬件由以下几部分组成:

1.交互输入部分:按键

2. 输出部分:TFTLCD屏幕显示,SD卡存储,led灯报警

3. 传感器采集:DHT11温湿度采集

4. 通讯部分:串口,wifi模块

5. 计时部分:RTC时钟计时

在这里插入图片描述硬件连接示意图

根据硬件的连接与系统要求实现的功能来看:

1.首先要做的就是根据硬件电路写好底层驱动(HAL)

2.进行函数的划分与封装,将应用层需要的函数封装好

3.进行中断函数的撰写与封装(可以将该这一步与第2步同时进行)

4.由于中断的优先级比任何的线程优先级都要高因此需要统筹线程与中断的关系

5.继续线程的规划,线程优先级定义及应用层函数的撰写

软件程序结构:

在这里插入图片描述

项目系统要求定期发送数据到平台,其中在定时器超函数中周期性采集温湿度信息,并发送消息队列到处理缓存传感器信息的线程和超温处理线程,同时发布采集到一次传感器的事件。

超温处理线程接收消息判断是否超过温度,wifi模块通过串口2将温湿度信息发送给wifi模块,由wifi模块实时上传到服务器。同时串口温度上传任务同时接收定时器发送的事件和PC机通过串口1发送的获取温度标志所触发的事件。当采集到传感器信息且上位机要求获取温湿度信息的事情同时发生时,通过串口1向PC发送温湿度信息。由于SD卡存储缓慢,所以由温湿度信息缓存线程在内存池中申请内存,并将获取到的温湿度信息缓存到内存中,同时更新LCD曲线绘制的历史温湿度信息缓存。

LCD处理线程处理IO口中断发送过来的标志信息,并据此显示相应的菜单,温度湿度信息,显示所设定采样频率与阈值的情况等。

SD卡存储任务作为后台任务,从缓存存储温湿度信息的内存中读取温湿度信息,并通过FATFS文件系统将相应的温湿度信息存入SD卡,同时根据每片内存的头部时间信息以及定时器采样频率推算本片内存中其他数据的时间信息,并将采样时间一起保存到SD卡中。在存储完一片内存片后,释放该内存到内存池之中。流程图如下所示:

在这里插入图片描述

代码部分这里贴出主函数中的基本逻辑框架:

int main(void)
{	
    
  /***********************挂载SD卡并打开文件*******************************/
	while(SD_Init())//检测不到SD卡
	{
		LCD_ShowString(30,150,200,16,16,"SD Card Error!");				
		LCD_ShowString(50,150,200,16,16,"Please Check! ");
	}
  
  //*****************消息队列创建	*****************************************/
  //申请内存池
	//初始化控制块
    rt_mp_init(&tem_mp, "temmp", &temmempool[0], sizeof(temmempool), mem_slice);
	  rt_mp_init(&hum_mp, "hummp", &hummempool[0], sizeof(hummempool), mem_slice);
	    rt_err_t result2;
    /* 初始化消息队列 */
    result= rt_mq_init(& mq_DHT11_tem,
                        " mq_DHT11_tem",
                        &msg_DHT11_pool_tem[0],               /* msg_pool */
                        sizeof(tem),                          /* 每个消息的大小*/
                        sizeof(msg_DHT11_pool_tem),                     /* msg_pool大小*/
                        RT_IPC_FLAG_FIFO); 
    result2 = rt_mq_init(& mq_DHT11_hum,
                        " mq_DHT11_hum",
                        &msg_DHT11_pool_hum[0],               /* msg_pool */
                        sizeof(hum),                          /* 每个消息的大小*/
                        sizeof(msg_DHT11_pool_hum),                     /* msg_pool大小*/
                        RT_IPC_FLAG_FIFO); 
   
	//定时器线程
    /* DHT11 TIMER */		
    DH11_timer = rt_timer_create("DHT11_get", timeout1,
                             RT_NULL, samp_freq,
                             RT_TIMER_FLAG_PERIODIC);
    /* 启动*/
    if (DH11_timer  != RT_NULL) 
			  flag=rt_timer_start(DH11_timer );	
	  if(flag==RT_EOK)
			 rt_kprintf("DH11_timer start successfull\n");	

	//***********************事件处理线程*******************************************/
		uart_deal_event =                          /* 线程控制块指针 */
    rt_thread_create( "usart_deal_event",              /* 线程名字 */
                      uart_deal_thread_entry,   /* 线程入口函数 */
                      RT_NULL,             /* 线程入口函数参数 */
                      256,                 /* 线程栈大小 */
                      2,                   /* 线程的优先级 */
                      20);                 /* 线程时间片 */
                   
    /* 启动线程,开启调度 */
    if (uart_deal_event != RT_NULL)
        rt_thread_startup(uart_deal_event);
    else
         rt_kprintf("led_thread_creat_error");
		
////*******************创建内存任务线程***********************************************************//
   for (j = 0; j < 48; j++) ptr[j] = RT_NULL;

    //创建线程
    recevDHT11 = rt_thread_create("recevDHT11", recevDHT11_entry, RT_NULL,
                            512,
                            4 ,20);
		
    if (recevDHT11 != RT_NULL)
         rt_thread_startup(recevDHT11);

//*******************创建释放内存堆写入SD卡线程***********************************************************//	
    thread_mp_release = rt_thread_create("thread_mp_release", thread_mp_release_entry, RT_NULL,
                            1024,
                            4, 20);
    if (thread_mp_release != RT_NULL)
        rt_thread_startup(thread_mp_release);
		
///*******************创LCD 显示绘图线程***********************************************************//	
		lcd_show= rt_thread_create("lcd_showwave", lcd_show_entry, RT_NULL,
                            512,
                            3, 30);
    if (lcd_show != RT_NULL)
         rt_thread_startup(lcd_show );
//*******************超温处理线程的创建***********************************************************//			
		
		over_temhum = rt_thread_create("over_temhum ", overtem_entry, RT_NULL,
                            256,
                            1, 20);
    if (lcd_show != RT_NULL)
         rt_thread_startup(over_temhum  );		
//*******************wifi线程创建***********************************************************//			
		
		wifi= rt_thread_create("wifi ", wifi_entry, RT_NULL,
                            128,
                            2, 20);
    if (wifi != RT_NULL)
         rt_thread_startup(wifi);	
  
     
//*************测试wifi模块************************************************************************//
}


审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6288

    浏览量

    121887
  • 软件框架
    +关注

    关注

    0

    文章

    21

    浏览量

    9767
  • RT-Thread
    +关注

    关注

    31

    文章

    1149

    浏览量

    38900
收藏 人收藏

    评论

    相关推荐

    如何对RT-Thread内核有基本的了解?

    RT-Thread 的时钟管理以时钟节拍为基础,时钟节拍是 RT-Thread 操作系统中最小的时钟单位。
    的头像 发表于 07-19 10:12 6792次阅读
     如何对<b class='flag-5'>RT-Thread</b>内核有基本的了解?

    基于RT-Thread的RoboMaster电控框架设

    由于 RT-Thread 稳定高效的内核,丰富的文档教程,积极活跃的社区氛围,以及设备驱动框架、Kconfig、Scons、日志系统、海量的软件包……很难不选择
    发表于 09-06 15:21 410次阅读

    RT-Thread (嵌入式实时操作系统)简介

    RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。RT-Thread 提供了开放的软件
    发表于 05-14 09:56

    RT-Thread嵌入式实时多线程操作系统软件是怎样组成的

    RT-Thread是什么?RT-Thread嵌入式实时多线程操作系统软件是怎样组成的?
    发表于 02-28 07:32

    基于RT-Thread操作系统衍生rt-smart实时操作系统简介

    1、rt-smart 实时操作系统简介RT-Thread Smart(简称 rt-smart)嵌入式实时操作系统是基于
    发表于 06-22 17:56

    【原创精选】RT-Thread征文精选技术文章合集

    基于RT-Thread操作系统软件框架设思路RTthread线程启动详解
    发表于 07-26 14:56

    RT-Thread操作系统有哪些优势?

    软件包和SDK,扩展系统功能 开发者说,RT-Thread是最简洁,优雅的开源操作系统之一,简单易用。 RT-Thread 主要采用 C 语
    发表于 06-28 08:16

    RT-Thread编程指南

    RT-Thread编程指南——RT-Thread开发组(2015-03-31)。RT-Thread做为国内有较大影响力的开源实时操作系统,本文是RT
    发表于 11-26 16:06 0次下载

    RT-Thread软件包定义和使用

    RT-Thread软件包是运行于RT-Thread物联网操作系统平台上,面向不同应用领域的通用软件组件 。
    的头像 发表于 05-21 11:29 9674次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>软件</b>包定义和使用

    RT-Thread Smart微内核操作系统发布!

    9月1日,由上海睿赛德电子科技有限公司举办的RT-Thread Smart微内核操作系统发布会于北京圆满落幕,发布会以见微为主题,邀请到中国工程院院士、产业专家、高校教授及行业从业人员100余位莅临
    的头像 发表于 09-09 10:49 2420次阅读

    RT-Thread定义一款新形态操作系统——混合微内核操作系统

    RT-Thread Smart开源混合微内核操作系统横空出世,替换智能设备中的Linux! 来源:嵌入式资讯 随着嵌入式系统软件开发复杂度的不断攀升,嵌入式操作系统越来越多地被应用于
    的头像 发表于 09-10 15:04 3384次阅读

    RT-Thread实时操作系统安装向导

    、简易开发、超低功耗、高安全性的物联网操作系统RT-Thread 拥有良好的软件生态,支持市面上所有主流的编译工具如 GCC、Keil、IAR 等,工具链完善、友好,支持各类标准接口。
    发表于 04-02 09:43 6次下载

    RT-Thread操作系统已经成功部署至芯驰E3

    近日,国内领先的车规芯片企业芯驰科技与国内领先的车载RTOS(实时操作系统)企业睿赛德科技(RT-Thread)共同宣布:RT-Thread操作系统全面支持芯驰科技E3系列 MCU芯片
    的头像 发表于 09-09 09:15 939次阅读

    RT-Thread操作系统的FreeRTOS兼容层

    的兼容项目中。 1 概述 这是一个针对RT-Thread国产操作系统的FreeRTOS操作系统兼容层,可以让原有基于FreeRTOS操作系统的项目快速、无感地迁移到
    的头像 发表于 01-14 00:55 1226次阅读

    RT-Thread荣获“最具影响力IoT操作系统奖”

    2024年3月30日,第十一届开源操作系统年度技术会议(OS2ATC)在西郊宾馆举办!RT-Thread作为国内领先的开源操作系统斩获了“最具影响力IoT操作系统奖”。该奖项是对
    的头像 发表于 04-12 08:37 121次阅读
    <b class='flag-5'>RT-Thread</b>荣获“最具影响力IoT<b class='flag-5'>操作系统</b>奖”