精华内容
下载资源
问答
  • 基于Stm32C8T6的标准外设库Rtthread操作系统移植,适合初学者,课程设计
  • 为了保证电池在充放电过程中的安全,针对目前电池管理系统存在可移植性差、不便于功能扩展等问题,提出一...系统采用国产嵌入式实时操作系统RTThread,并选用STM32作为主控制器芯片,使整个系统的监控、调试更加方便。
  • FreeModbus的从站模式+RT thread操作系统+STM32芯片,编译通过,并实测有效
  • 华大单片机移植RTThread操作系统

    千次阅读 多人点赞 2020-09-27 16:26:02
    华大单片机移植RTThread-国产操作系统 文章目录华大单片机移植RTThread-国产操作系统1.华大单片机型号选择2.RTThread源码下载2.1 .资料说明2.3.源码下载3.移植过程3.1.新建华大单片机最小系统工程模板,这里不展开...

    华大单片机移植RTThread-国产操作系统

    1.华大单片机型号选择

    1.由于工作目前有华大的HC32L13x系列的芯片和开发板,因此本文章的移植过程全部基于该型号的移植。我相信其他型号华大单片机也是类似。毕竟我就是通过stm32的例子移植成功的。

    2.RTThread源码下载

    2.1 .资料说明

    官网:https://www.rt-thread.org/document/site/ 这里有你需要的源码资料以及文档说明,非常重要建议反复阅读。

    野火的开发文档:我强烈推荐除了官网的文档说明外,这本由野火出的《RT-Thread 内核实现与应用开发实战—基于STM32》文章,具体内容可以直接到野火的论坛下载。都是免费开源的。野火的资料是我们嵌入式开发者和入门者领路人,当然正点原子也是!!!!

    2.3.源码下载

    1.华大的工程的源码就不提供了,大家手上应该还是有的。

    2.RTThread的已经集成在了Keil MDK,尽量安装新版本的MDK。

    3.移植过程

    3.1.新建华大单片机最小系统工程模板,这里不展开

    3.2.在Keil MDK加入Rtthread代码

    参考链接:https://www.rt-thread.org/document/site/tutorial/nano/nano-port-keil/an0039-nano-port-keil/#rt-thread-nano 官方的操作,我可能写的没官方好吧。。。
    在这里插入图片描述

    3.3添加rtthread源码到工程中

    在这里插入图片描述

    3.4 添加完成的样子

    在这里插入图片描述

    3.5 移植后需要修改部分东西才能让系统真正跑起来。。

    RT-Thread 会接管异常处理函数 HardFault_Handler() 和悬挂处理函数 PendSV_Handler(),这两个函数已由 RT-Thread 实现,所以需要删除工程里中断服务例程文件中的这两个函数,避免在编译时产生重复定义!
    在这里插入图片描述
    在这里插入图片描述

    其实,说白了,有几个文件是非常重要的,改来改去都是这几个文件,rtconfig.h这是配置文件,因此需要开启什么功能,都是在这里开启宏定义的。第二个文件,board.c主要放里面存放的是与硬件相关的初始化函数,比如我们的外设初始化不再放在main函数,而是放在 rt_hw_board_init() 中,具体看下面

    首先,在我们工程建立跟board.c对应的board.h文件,方便我们将头文件放到该文件中。。下面是我的头文件,参考下即可

    在这里插入图片描述

    然后将该board.c 函数 rt_hw_board_init() 修改成下面这样

    void rt_hw_board_init()
    {
        /* System Clock Update */
        //将原来的改成这两个,还有记得引入头文件
    	SystemInit(); //这个是system.hc3213x.c文件自带的
        SystemCoreClockUpdate();//这个是system.hc3213x.c文件自带的。
        
        /* System Tick Configuration */
        _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
    	
        	//这里开始放我们的外设初始化函数
    		App_Timer0PortCfg();
    		User_KeyInit();
    		Uart_PortInit();
    		App_Uart0Cfg();
    		/* 硬件 BSP 初始化统统放在这里,比如 LED,串口,LCD 等 */
    	
    	
        /* Call components board initial (use INIT_BOARD_EXPORT()) */
    #ifdef RT_USING_COMPONENTS_INIT
        rt_components_board_init();
    #endif
    
    #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
        rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
    #endif
    }
    

    至此,只要在main引入

    #include “board.h”

    #include “rtthread.h”

    创建几个任务线程就可以跑系统了啊。。。。。

    基本就可以在华大单片机运行我们的国产RTThread操作系统了。。。
    在这里插入图片描述
    在这里插入图片描述

    补张图:这是rtconfig.h的部分代码,大概就是开启对应的宏定义然后就可以实现对应的功能吧,目前我测试到事件而已啊。。。。然后邮箱,消息队列被工作任务耽搁了!!

    4.测试例子

    main.c 函数
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    5.最后一说:

    这是我自己仿照stm32的移植模式,移植的,中间由于stm32和华大不同也踩了不少坑。也是我第一次接触操作系统和移植。所以难免写的有点水。。。有问题可以评论提出,一起努力解决!!!加油!最后预告下,过不久应该也会出华大移植腾讯的操作系统Tencent OS 。。这个比较简单了。因为华大和腾讯有合作所以就直接有demo历程。。反正支持国产就完事了。。。

    展开全文
  • 基于RT-Thread操作系统在子敬电子ZJ-TEK系列开发板的软件开发包
  • 基于RT-Thread操作系统的开源BLE5.0(mynewt-nimble)在nordic平台上的应用
  • 正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS。 下面将delay.c函数移植到rt thread中,使用的bsp是rt thread stm32中的stm32f407-st-discovery开发板 ...

    正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS。

    下面将delay.c函数移植到rt thread中,使用的bsp是rt thread stm32中的stm32f407-st-discovery开发板

    已修改好的delay.c函数(适配HAL库)

    #include "delay.h"
    
    #define SYSTEM_SUPPORT_OS		1		//定义系统文件夹是否支持UCOS
    // 	 
    //如果使用rt-thread,则包括下面的头文件即可.
    #if SYSTEM_SUPPORT_OS
    #include "rtthread.h"				//支持OS时,使用 
    #endif
    //********************************************************************************
    //修改说明
    //2019-10-29
    //SeniorZhu1994 移植到RT-Thread 3.1.2(HAL库)
    // 
    
    static uint32_t fac_us=0;							//us延时倍乘数
    
    #if SYSTEM_SUPPORT_OS		
        static uint16_t fac_ms=0;				        //ms延时倍乘数,在os下,代表每个节拍的ms数
    #endif
    
    #if SYSTEM_SUPPORT_OS							//如果SYSTEM_SUPPORT_OS定义了,说明要支持OS了(不限于rt-thread).
    //当delay_us/delay_ms需要支持OS的时候需要三个与OS相关的宏定义和函数来支持
    //首先是3个宏定义:
    //delay_osrunning:用于表示OS当前是否正在运行,以决定是否可以使用相关函数
    //delay_ostickspersec:用于表示OS设定的时钟节拍,delay_init将根据这个参数来初始哈systick
    //delay_osintnesting:用于表示OS中断嵌套级别,因为中断里面不可以调度,delay_ms使用该参数来决定如何运行
    //然后是3个函数:
    //delay_osschedlock:用于锁定OS任务调度,禁止调度
    //delay_osschedunlock:用于解锁OS任务调度,重新开启调度
    //delay_ostimedly:用于OS延时,可以引起任务调度.
    
    
    //本例程仅作RT-Thread的支持,其他OS,请自行参考着移植
    //支持RT-Thread
    extern volatile rt_uint8_t rt_interrupt_nest;
    
    //在board.c文件的rt_hw_board_init()里面将其置为1
    uint8_t OSRunning=0;
    
    #ifdef 	RT_THREAD_PRIORITY_MAX					         //RT_THREAD_PRIORITY_MAX定义了,说明要支持RT-Thread	
    #define delay_osrunning		  OSRunning			       //OS是否运行标记,0,不运行;1,在运行
    #define delay_ostickspersec	RT_TICK_PER_SECOND	//OS时钟节拍,即每秒调度次数
    #define delay_osintnesting 	rt_interrupt_nest		//中断嵌套级别,即中断嵌套次数
    #endif
    
    //us级延时时,关闭任务调度(防止打断us级延迟)
    void delay_osschedlock(void)
    {
    #ifdef RT_THREAD_PRIORITY_MAX
    	 rt_enter_critical();
    #endif	
    }
    
    //us级延时时,恢复任务调度
    void delay_osschedunlock(void)
    {	
    #ifdef RT_THREAD_PRIORITY_MAX
    	  rt_exit_critical();
    #endif	
    }
    
    //调用OS自带的延时函数延时
    //ticks:延时的节拍数
    void delay_ostimedly(uint32_t ticks)
    {
    #ifdef RT_THREAD_PRIORITY_MAX
    	  rt_thread_delay(ticks);
    #endif	 
    }
    
    #endif
    			   
    //初始化延迟函数
    //当使用ucos的时候,此函数会初始化ucos的时钟节拍
    //SYSTICK的时钟固定为AHB时钟
    //SYSCLK:系统时钟频率
    void delay_init(uint8_t SYSCLK)
    {
    #if SYSTEM_SUPPORT_OS 						//如果需要支持OS.
    	uint32_t reload;
    #endif
        HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
    	fac_us=SYSCLK;						//不论是否使用OS,fac_us都需要使用
    #if SYSTEM_SUPPORT_OS 						//如果需要支持OS.
    	reload=SYSCLK;					    //每秒钟的计数次数 单位为K	   
    	reload*=1000000/delay_ostickspersec;	//根据delay_ostickspersec设定溢出时间
    											//reload为24位寄存器,最大值:16777216,在180M下,约合0.745s左右	
    	fac_ms=1000/delay_ostickspersec;		//代表OS可以延时的最少单位	   
    	SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启SYSTICK中断
    	SysTick->LOAD=reload; 					//每1/OS_TICKS_PER_SEC秒中断一次	
    	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
    #else
    #endif
    }								    
    
    #if SYSTEM_SUPPORT_OS 						//如果需要支持OS.
    //延时nus
    //nus:要延时的us数.	
    //nus:0~190887435(最大值即2^32/fac_us@fac_us=22.5)	    								   
    void delay_us(uint32_t nus)
    {		
    	uint32_t ticks;
    	uint32_t told,tnow,tcnt=0;
    	uint32_t reload=SysTick->LOAD;				//LOAD的值	    	 
    	ticks=nus*fac_us; 						//需要的节拍数 
    	delay_osschedlock();					//阻止OS调度,防止打断us延时
    	told=SysTick->VAL;        				//刚进入时的计数器值
    	while(1)
    	{
    		tnow=SysTick->VAL;	
    		if(tnow!=told)
    		{	    
    			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
    			else tcnt+=reload-tnow+told;	    
    			told=tnow;
    			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
    		}  
    	};
    	delay_osschedunlock();					//恢复OS调度											    
    }  
    //延时nms
    //nms:要延时的ms数
    //nms:0~65535
    void delay_ms(uint16_t nms)
    {	
    	if(delay_osrunning&&delay_osintnesting==0)//如果OS已经在跑了,并且不是在中断里面(中断里面不能任务调度)	    
    	{		 
    		if(nms>=fac_ms)						//延时的时间大于OS的最少时间周期 
    		{ 
       			delay_ostimedly(nms/fac_ms);	//OS延时
    		}
    		nms%=fac_ms;						//OS已经无法提供这么小的延时了,采用普通方式延时    
    	}
    	delay_us((uint32_t)(nms*1000));				//普通方式延时
    }
    #else  //不用ucos时
    
    //延时nus
    //nus为要延时的us数.	
    //nus:0~190887435(最大值即2^32/fac_us@fac_us=22.5)	 
    void delay_us(uint32_t nus)
    {		
    	uint32_t ticks;
    	uint32_t told,tnow,tcnt=0;
    	uint32_t reload=SysTick->LOAD;				//LOAD的值	    	 
    	ticks=nus*fac_us; 						//需要的节拍数 
    	told=SysTick->VAL;        				//刚进入时的计数器值
    	while(1)
    	{
    		tnow=SysTick->VAL;	
    		if(tnow!=told)
    		{	    
    			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
    			else tcnt+=reload-tnow+told;	    
    			told=tnow;
    			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
    		}  
    	};
    }
    
    //延时nms
    //nms:要延时的ms数
    void delay_ms(uint16_t nms)
    {
    	uint32_t i;
    	for(i=0;i<nms;i++) delay_us(1000);
    }
    #endif
    			 
    

     delay.h如下所示

    #ifndef __DELAY_H
    #define __DELAY_H 
    #include <stdint.h>
    #include <stm32f4xx.h>
    
    void delay_init(uint8_t SYSCLK);
    void delay_ms(uint16_t nms);
    void delay_us(uint32_t nus);
    void delay_ostimedly(uint32_t ticks);
    
    #endif
    
    

    在board.c中添加在drv_common.c中曾被弱定义的void rt_hw_board_init()

    #include "delay.h"
    
    /**
     * This function will initial STM32 board.
     */
     
    /* SysTick configuration */
    extern void rt_hw_systick_init(void);
    extern int rt_hw_usart_init(void);
    extern void delay_init(uint8_t SYSCLK);
    
    void rt_hw_board_init()
    {
    #ifdef SCB_EnableICache
        /* Enable I-Cache---------------------------------------------------------*/
        SCB_EnableICache();
    #endif
    
    #ifdef SCB_EnableDCache
        /* Enable D-Cache---------------------------------------------------------*/
        SCB_EnableDCache();
    #endif
    
        /* HAL_Init() function is called at the beginning of the program */
        HAL_Init();
    
        /* System clock initialization */
        SystemClock_Config();
        rt_hw_systick_init();
    	
        /* Heap initialization */
    #if defined(RT_USING_HEAP)
        rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
    #endif
    
        /* Pin driver initialization is open by default */
    #ifdef RT_USING_PIN
        rt_hw_pin_init();
    #endif
    
        /* USART driver initialization is open by default */
    #ifdef RT_USING_SERIAL
        rt_hw_usart_init();
    #endif
    
        /* Set the shell console output device */
    #ifdef RT_USING_CONSOLE
        rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
    #endif
    
        /* Board underlying hardware initialization */
    #ifdef RT_USING_COMPONENTS_INIT
        rt_components_board_init();
    #endif
    	delay_init(168);
    	extern uint8_t OSRunning;
    	
    	OSRunning=1;
    }

    main函数中有关delay的操作可以参考我的github代码:https://github.com/nicedayzhu/stm32f407-st-discovery-atk-delay

    编译运行,led正常闪烁。

    参考资料:

    展开全文
  • 快速搭建基于STM32的RT-Thread操作系统一什么是RT-Thread RT-Thread ,全称是 Real Time-Thread,是一款完全由国内团队开发维护的嵌入式实时多任务操作系统(RTOS)。允许多个任务同时运行并不意味着处理器在同一时刻...
    bbce012975d9e6c32a7ea63e44f3a93a.png

    快速搭建基于STM32的

    RT-Thread操作系统

    a1617be8863193d8a877fc8f62f35716.png什么是RT-Thread

           RT-Thread ,全称是 Real Time-Thread,是一款完全由国内团队开发维护的嵌入式实时多任务操作系统(RTOS)。允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务),给人造成多个任务在一个时刻同时运行的错觉。经过近 12 年的发展,如今已成一个功能强大、组件丰富的物联网操作系统

    b59f26fc929d4b8731623d611287b58d.png

    RT-Thread系统架构

    (图片来自RT-Thread官网 https://www.rt-thread.org/)

    为什么要搭建操作系统

    对于本科阶段以“8051系列单片机”作为核心课程的自动化相关专业学生工程师来说,单片机就是资源单调,处理能力弱,是一种任务单一、成本低的微型控制器。而大多本科生只有使用汇编语言开发单片机的经历,对操作系统应用于单片机过于陌生。

           很多人会有这样的疑问:“单片机这样的资源配置还能运行操作系统?跑得起来么?能保证实时性么?”这个问题源自于大家对当前MCU的发展RTOS对资源的消耗情况不够了解。

           做一个简单的数据对比:

    b1fbc5606a6ee311dc6b127d7b4ca32d.png

    F0单片机资源与RT-Thread配置要求对比

    STM32 F0系列是ST公司入门级MCU,STM32F030K6的1000片采购价格在¥4.00左右。可见目前成本最低、性能较弱的32位单片机都能够轻松应对操作系统的负荷。

          那么,抛开MCU的性能和成本不谈,我们到底为什么要使用操作系统呢?对于单片机工程师而言,最头疼的莫过于“甲方爸爸”和老板们无休止的修改意见。“嗯…这里效果不太好,再优化一下!”“那里加一个功能吧,应该很快就搞定了吧!”这样的声音总是余音绕梁,数日不绝。如果程序的功能相对简单,添加一个新的功能可能确实不会耗费多大精力。然而,当你的main函数中罗列了几百行代码、按照逻辑要求精心设计好了各个功能函数的执行序列时,对于程序的任何修改都会“牵一发而动全身”!这也正是现在的很多智能手机、手表甚至电动车等“互联网+”产品在升级固件解决bug之后带来新bug的一个重要原因。这个“锅”程序员该背还是要背,但时间紧、任务重,确实很难避免这种问题的发生。

    3fb6fd897a995554d77256cef22b54b6.gif

    无OS的main函数

    在采用“裸机”(无OS)架构运行单片机时,处理新加入的功能对于现有逻辑的影响会消耗工程师大量的精力。而对于MCU而言,运行延时函数就意味着处理器在“空转”,这些时间不仅没有执行任何有意义的代码,也在不断消耗着电能,无论对于MCU的资源还是能源的利用,都是极大的浪费。当然,佬级工程师会在项目初期根据需求规划出一个高效的“裸机”运行框架,通过MCU内部的定时器、中断等模块搭建一个简单的任务定时切换系统,避免形成冗长的main函数。这种方式会耗费一些精力进行框架设计和实现,而且也难以应付不断增长的甲方需求复杂逻辑。关键是其只适合于项目经验丰富的高手,初学者和小白只能望而却步

          现在,来看看RTOS能够给你带来什么吧!

    7dee8eb9ec316b5795e381522d39d29b.png

    RTOS中的任务(线程)架构

    这样是不是很清新?其实就是把每一个特定的任务分别放到了RTOS中建立的不同任务(也叫线程)中,设置好每一个任务的优先级、执行函数轮转周期,剩下的工作就可以交给调度器了!又有新加的功能?新建一个任务就好了!大家互相不干预!

    同时,我们还可以运用OS中的一些机制提高效率。比如,Task3的执行要建立在TaskN的结果之上,那我们就可以让Task3一直等待TaskN的结果,一旦结果发送过来,Task3立刻执行,就像博尔特在起跑线等待发令枪一样。而这些任务中涉及的sleep、wait等函数并不像“裸机”中的delay在空跑MCU,而是在Task1休眠100ms的过程中让调度器把MCU的使用权转交给其他就绪的任务。这样就保证了MCU时刻都在干正事,而不是空转!

         以上只是RTOS提高工作效率的冰山一角,RT-Thread内核中还提供了很多有趣的组件,具体使用和优点还是留给小伙伴们自己实际使用的时候去体会吧!

    3d09fea160178c4c0ea9a27111f097ba.png

    RT-Thread内核组件(未包含IoT相关扩展组件)

    为什么选择STM32

           STM32单片机是意法半导体(ST)公司出品的32位ARM Cortex内核微处理器(MCU)。该系列单片机产品线丰富,融高性能、实时性、数字信号处理、低功耗、低电压于一身,同时保持高集成度和开发简易的特点。

    5ce2951282117a320e790680773190b5.png

    STM32单片机产品线

           该系列产品使用广泛、库函数规范技术资料全面,具有丰富的官方第三方评估板以及软件支持,使得其不仅深受开发者青睐,同时适合初学者入门。RT-Thread公司为这些成熟的第三方开发板提供了丰富的例程、开发文档以及教学视频的支持,还与这些公司合作开发了定制的开发板,非常有利于初学者的学习,真正做到了“零基础”上手。

    9ab6a7a33c744d08a868b409f8b4d2ea.png

    ST官方评估板

    013814663151e2af8bfe83206069f77b.png

    畅销的第三方开发板

    为了更进一步提高开发者使用STM32单片机的效率,ST官方推出了STM32CubeMX图形化配置软件,可快速直观的生成单片机各个资源初始化以及参数配置的代码,用户可省去驱动代码的开发,直接编写应用程序即可。嵌入式开发常用的IED软件也基本都支持STM32单片机的开发。所以,STM32适合于以下人群选择:

    1)单片机初学者。理由:网上的教程和资源丰富,有大量高效开发工具可使用。

    2)以前没用过STM32,现在想在单片机上使用RTOS,对于单片机品牌无特殊要求的工程师。理由:性价比高,搭建RTOS方便,参考资料丰富。

          3)RTOS的开发者,想学习现有OS的机制。理由:目前来看,在STM32上搭建RTOS所耗费的精力是最小的。

    开发工具的准备

           由于STM32开发的生态系统已经非常完善,各类仿真器、IED软件、调试工具琳琅满目。工程师基本上可以使用自己目前惯用的一套软件工具进行RT-Thread 的开发。但是在这里还是列出了笔者认为最为精简、成本最低的一套开发环境:

    a9e73575016b1907cafb082453d4677d.png

    推荐开发工具组合

    STM32CubeMX软件:ST官方发布,图形化方式配置单片机各项资源和参数,并自动生成驱动程序和初始化函数。主要用于硬件功能配置和初始化函数生成。

    RT-Thread Studio软件RT-Thread官方发布,一站式的开发工具,集工程创建和管理,RT-Thread系统搭建和配置,用户程序代码编辑、下载和调试,以及SDK管理于一身,采用图形化方式配置系统、组件以及软件包。完全替代RT-Thread 系统的env配置工具,Keil、IAR等程序编辑工具,串口助手、超级终端等调试工具。

           J-LINK-OB V2调试器J-TAG仿真器+USB转串口模块。支持JTAG和SWD调试模式,占用一个USB口的情况下同时实现程序下载和串口调试。

    搭建RT-Thread系统的过程

          Step1:使用RT-Thread Studio软件创建RT-Thread项目。选择开发板类型(基于BSP)或芯片型号(基于芯片),RT-Thread版本(Latest为开发版,创建工程后可升级;V4.0.2为最新稳定版,不可升级;nano版为精简版,不可添加组件和功能包),控制台串口(串口指令及调试信息端口),调试器类型。

    2f8213eb57c5f3e5afe08243c3ca732f.gif

    RT-Thread Studio 创建工程

           经过以上几步操作,不到1分钟即可创建出一套搭载标准的RT-Thread系统的STM32工程,如果手上有开发板,直接编译下载即可实现一颗LED灯闪烁效果。同时,工程中包含了STM32单片机的PIN、UART、I2C、SPI的驱动程序,还标配了类似于Linux系统指令终端的串口Finsh模块。如果你的开发板可以通过串口连接电脑(串口转USB、串口转232等方式),可以尝试着在RT-Thread Studio上打开串口终端,开发板已经在定时的向电脑发送数据了!是不是很快?

    2c0d663a77d864a962ac87860262ad6b.png

    RT-Thread Studio自带的串口终端

           Step2:根据实际使用外设的需要,依照RT-Thread Studio工程文件夹中的drivers/board.h文件中相应外设配置的注释说明,打开外设的宏定义和端口映射,并在drivers/stm32xxxx_hal_config.h文件中打开相应模块的使能宏定义。

    7f596a9b8aca1e187da70088ec76eccf.png

    修改相应的头文件

           Step3:使用STM32CubeMX软件进行MCU的时钟以及外设资源的配置,并生成外设初始化函数。时钟配置是必选项,因为RT-Thread Studio创建的工程代码所使用的是MCU内部的HSI时钟,而实际应用大多采用外置的HSE时钟源如果用户需要使用其他外设,如PWM、ADC、RTC、DAC或Timer等功能,还需要使用STM32CubeMX依次进行配置并生成代码。最终将STM32CubeMX生成代码中的main.c的SystemClock_Config函数代码替换掉RT-Thread Studio工程中的同名函数。并将stm32xxxx_hal_msp.c中的函数复制到RT-Thread Studio工程中的drivers/board.c中,并参与工程编译。

    f7280208e2b9ef39db37482a96dab074.gif

    STM32CubeMX软件的图形化配置过程

           Step4:经过以上几个步骤,所有需要用到的外设就已经完成了配置和初始化。这就可以使用RT-Thread Studio开发你的程序啦!当然,不要忘了,我们的RT-Thread Studio还有在线软件包中心这个强大的资源库!这个资源库是直接链接到GitHub上的,可以先看看你要开发的功能是不是已经有人做过并进行了源码分享,如果有,就可以把功能包直接下载到你自己的工程,根据它的相关API函数说明实现你自己的功能!这样又能省下来很多宝贵的时间。

    c9539d5eccfd968201e5f09acc4855b7.png

    RT-Thread Studio软件的功能包图形化配置

           以上就是使用STM32搭建RT-Thread系统的全部过程,开始你的操作系统开发之旅吧!

    复制视频链接,观看完整的搭建过程,

    https://www.bilibili.com/video/BV1oi4y1b7TK/

    69bb6e87867fb405ca659790a50500d7.png ▼ 更多精彩推荐,请关注我们 ▼

    51a7df9bf4ea3e5f1ce141fa08881a43.gif90278879f0d758bf9bc7cfb7f6d055c5.gif

    展开全文
  • 4.RT-Thread_1.2.1为操作系统文件,添加了RTGUI和Modbus组件5.SDCard为正确运行demo时所需要的中文字库文件,必须原样编制到SD卡插入开发板v6.STM32F107板为出厂的例程:按钮+简易计算器。有2种编译环境工程:MDK与...
  • ENV介绍env 是 RT-Thread 推出的开发辅助工具,针对基于 RT-Thread 操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的 menuconfig 提供了简单易用的配置剪裁工具,可对内核、组件和...

    ENV介绍

    env 是 RT-Thread 推出的开发辅助工具,针对基于 RT-Thread 操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的 menuconfig 提供了简单易用的配置剪裁工具,可对内核、组件和软件包进行自由裁剪,使系统以搭积木的方式进行构建。

    env 工具包含了 RT-Thread 源代码开发编译环境和软件包管理系统。

    env工具下载安装

    从 RT-Thread 官网下载 env 工具。地址:https://www.rt-thread.org/page/download.html。

    在电脑上装好 git,git 的下载地址为 https://git-scm.com/downloads ,根据向导正确安装 git,并将 git添加到系统环境变量。软件包管理功能需要 git 的支持。

    注意在工作环境中,所有的路径都不可以有中文字符或者空格。

    通过env移植MQTT客户端

    打开 env 控制台

    RT-Thread 软件包环境主要以命令行控制台为主,同时以字符型界面来进行辅助,使得尽量减少修改配置文件的方式即可搭建好 RT-Thread 开发环境的方式。

    打开env控制台有两种方式:

    • 方法一:点击 env 目录下可执行文件进入 env 目录,可以运行本目录下的 env.exe ,如果打开失败可以尝试使用 env.bat 。

    • 方法二:在文件夹中通过右键菜单打开 env 控制台env ,可以根据下图的步骤操作,就可以在任意文件夹下通过右键菜单来启动 env 控制台:

      0f851a5b90c1e7c00ca03e54ad9d46bc.png
      Add_Env_To_Right-click_Menu

    打开env并更新软件包列表

    scons 是 RT-Thread 使用的编译构建工具,可以使用 scons 相关命令来编译 RT-Thread 。

    • 第一步:下载rt-thread的源码,可以在github或者gitee下载:

      • github

        git clone https://github.com/RT-Thread/rt-thread.git
      • gitee

        git clone https://gitee.com/RT-Thread/rt-thread.git
    • 第二步:切换到 bsp 根目录:打开控制台后,可以在命令行模式下使用 cd 命令切换到你想要配置的 bsp 根目录中。例如工程目录为 H:\jiejieTop\rt-thread\bsp\stm32\stm32f429-fire-challenger,或者直接到这个目录下右键打开env:

      230531b3b7ba18b0bdbce00d714415d8.png
      mqtt-rtt-001
    • 第二步:更新软件包列表,随着 package 系统的不断壮大,会有越来越多的软件包加入进来,所以本地看到 menuconfig 中的软件包列表可能会与服务器 不同步 。在env环境中使用 pkgs --upgrade 命令即可解决该问题,这个命令不仅会对本地的包信息进行更新同步,还会对 env 的功能脚本进行升级,建议定期使用,或者在 env\packages\packages 目录下手动更新,然后切换最新分支即可。

      f675c6927ad6028bbd4aadf9ed8b496a.png
      mqtt-rtt-002
      d2125c24358d56a7580f79ae62caae44.png
      mqtt-rtt-003

    移植MQTT客户端

    • 第一步:在env环境中运行 menuconfig 命令进入可视化配置界面,在Hardware Drivers Config → Onboard Peripheral Drivers路径下使能以太网驱动:

      4121862bd3146247954b48078c25f758.png
      mqtt-rtt-004
    • 第二步:在RT-Thread Components → Network → Network interface device路径下使能使能网络接口:

      5e430848c5c8f6e2a9aaf3af217d4d4b.png
      mqtt-rtt-005
    • 第三步:在RT-Thread online packages → IoT - internet of things路径下选择kawaii-mqtt软件包:

      5174ea72daa48e4191eac2f5cc15add0.png
      mqtt-rtt-006
    • 第四步:按下回车,进入kawaii-mqtt软件包的配置页面,可以随意配置信息,我们勾选 enable test 即可,这一步操作会将测试代码添加到工程中:

      6ae9e933744ba79d942729892ee4b763.png
      mqtt-rtt-007
    • 第五步:在退出的时候会进行下载软件包,将kawaii-mqtt软件包下载到本地,并且将其添加到工程中,然后你可以通过scons --target=mdk5命令生成keil工程,当然也可以不用。

      a20b98c0af71740af212d7ea1666310b.png
      mqtt-rtt-008
    • 第六步:打开keil工程,因为我们勾选了 enable test ,此时工程中存在测试代码,我们需要间本身的main.c文件的例程注释掉,然后再进行编译,没有问题。

      36d896e8ab28aedd79c2ef78b0f91041.png
      mqtt-rtt-009
    • 第七步:下载到开发板上,观察现象。

    导出独立的MQTT客户端工程

    在env中,可以通过scons --dist命令来导出工程代码,形成一个独立的demo,因为处于rt-thread工程中,整个代码实在是太庞大了,我们只需要导出我们用到的代码即可:

    fd3511aa49bcf67d06b3ea2b114a95b0.png
    mqtt-rtt-010
    a441a14434773b66e521dc6231b085a6.png
    mqtt-rtt-011

    整个工程就移植完毕。

    欢迎来B站学习:https://www.bilibili.com/video/BV1KZ4y1p7FA

    素质三连!!!

    展开全文
  • rt-thread操作系统API

    2018-07-08 14:05:15
    介绍rt-thread操作系统的系统移植、内核裁剪、API使用等
  • RT Thread实时操作系统的开发文档,包括RT-Thread+15天快速入门文档、rtthread_manual.zh及RT_thread实时操作系统编程指南_0.3.0文档,方便使用
  • 本文主要介绍RT Thread操作系统在cortex-m3内核上的移植接口文件,通过本篇博客你将深入了解RTOS操作系统是怎么通过触发软中断实现任务切换的,怎么实现内核异常信息的打印功能。 2.移植的接口文件 RT-Thread操作...
  • RT-Thread操作系统资料,包含有内核代码详解、一起学RT-Thread等经典教程,更包含大量平台移植代码,历经数月收集,现拿出与各位分享,让你能够快速开始Rt-Thread系统的研发和学习,后续会持续更新。。。
  • RT-Thread操作系统实例

    2012-02-21 14:34:12
    STM32F103VCT5单片机上的RT-Thread操作系统移植实例 ,供参考
  • RT-Thread操作系统

    千次阅读 2018-09-26 20:40:17
    一、RT-Thread与UCOS的简单比较 任务或线程调度 RT-Thread可选优先级抢占式调度,256/32/8个优先级,线程数不限。相同优先级线程时间片轮转调度。支持动态创建/销毁线程。 Ucos优先级抢占式调度。不允许相同优先级...
  • RT-Thread操作系统的μC/ OS-III兼容层 让基于μC/ OS-III开发的应用层无感地迁移到RT-Thread操作系统 中文| 英语 [目录] 0前排提示 本文包含图片,允许在中国大陆互联网环境,访问github时, readme.md(本文件)的...
  • RT-Thread操作系统的μC/ OS-II兼容层 让基于μC/ OS-II开发的应用层无感地迁移到RT-Thread操作系统 中文| 英语 [目录] 0前排提示 本文包含图片,允许在中国大陆互联网环境,访问github时, readme.md(本文件)的...
  • RT-Thread 操作系统---STM32F103 网络音乐
  • 为您提供rt-thread物联网操作系统下载,RT-Thread诞生于2006年,是一款以开源、中立、社区化发展起来的物联网操作系统RT-Thread主要采用 C 语言编写,浅显易懂,且具有方便移植的特性(可快速移植到多种主流 MCU ...
  • 为您提供rt-thread物联网操作系统下载,RT-Thread诞生于2006年,是一款以开源、中立、社区化发展起来的物联网操作系统RT-Thread主要采用 C 语言编写,浅显易懂,且具有方便移植的特性(可快速移植到多种主流 MCU ...
  • RT-Thread实时操作系统

    2015-05-27 14:19:57
    RT-ThreadRTOS是一款来自中国的开源实时操作系统,由RT-Thread工作室的专业开发人员开发、维护。
  • RT-thread:国产的嵌入式操作系统,与其他RTOS操作系统的主要区别:不仅仅是一个rtos内核,而是包含网络,文件系统,gui界面等组件的中间件平台,具有极强的扩展性。 支持的编译工具:IAR gcc keil 1.开发环境准备 2....
  • 如果还不知道,这么使用STM32CubeMx工具添加RT-Thread操作系统组件,请移步到《基于 STM32CubeMX 添加 RT-Thread 操作系统组件(一)- 详细介绍操作步骤》文章阅读。好了,喝杯茶先^_^,继续前行。上一篇介绍关于...
  • 小熊派开发板使用RT-Thread操作系统 RT-Thread软件包使用
  • RT-Thread 嵌入式操作系统中文指导手册
  • RT-Thread 操作系统线程创建过程详解

    千次阅读 2019-04-06 14:49:09
    RT-Thread 操作系统的线程当中,一共有两种,一是静态线程,二是动态线程 接下来通过RT-Thread 源码来讲解线程是如何创建的,以及这两种线程的区别: 静态线程的创建 首先贴出RT-Thread 有关静态线程创建的源码: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,555
精华内容 622
关键字:

rtthread操作系统