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

    文章

    6713

    浏览量

    123164
  • 软件框架
    +关注

    关注

    0

    文章

    21

    浏览量

    9856
  • RT-Thread
    +关注

    关注

    31

    文章

    1266

    浏览量

    39881
收藏 人收藏

    评论

    相关推荐

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

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

    基于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的编程手册,用于指导在RT-Thread实时操作系统环境下如何进行编 程。
    发表于 11-26 16:16 0次下载

    RT Thread操作系统教程及资料

    ## RT-Thread 简介 ## RT-Thread RTOS是一款来自中国的开源实时操作系统, 由国内一些专业开发人员开发、维护。 它不仅仅是一款高效、稳定的实时核心,也是一套
    发表于 05-11 14:54 2次下载

    RT-Thread软件包定义和使用

    RT-Thread软件包是运行于RT-Thread物联网操作系统平台上,面向不同应用领域的通用软件组件 。
    的头像 发表于 05-21 11:29 1w次阅读
    <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 2651次阅读

    国民技术携手RT-Thread共同推进MCU与RT-Thread操作系统广泛适配

    日前,国民技术股份有限公司与知名物联网操作系统厂商睿赛德科技(RT-Thread)签署会员合作协议,正式成为RT-Thread高级会员。国民技术将基于通用MCU和RT-Thread物联
    的头像 发表于 12-16 09:56 2342次阅读

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

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

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

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

    浅析RT-Thread设备驱动框架

    RT-Thread 设备框架属于组件和服务层,是基于 RT-Thread 内核之上的上层软件。设备框架是针对某一类外设,抽象出来的一套统一的
    的头像 发表于 08-07 15:39 1889次阅读

    基于 RT-Thread 的 RoboMaster 电控框架(一)

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

    新书发布——《实时操作系统应用技术:RT-Thread与ARM编程实践》

    RT-Thread又一本新书《实时操作系统应用技术——基于RT-Thread与ARM的编程实践》发布,标志着RT-Thread生态和实时操作系统
    的头像 发表于 05-11 08:35 708次阅读
    新书发布——《实时<b class='flag-5'>操作系统</b>应用技术:<b class='flag-5'>RT-Thread</b>与ARM编程实践》