RT-Thread

RT-Thread学习记录14 软件定时器的使用

心已入冬 提交于 2020-08-10 05:40:18
以下为看视频笔记.......... 软件定时器是由操作系统提供的一:类系统接口,它构建在硬件定时器基础之上(系统滴答定时器)。软件定时器使系统能够提供不受数目限制的定时器服务。 RT-Thread操作系统提供的软件定时器,以系统节拍(OS Tick)的时间长度为定时单位,提供了基于系统节拍整数倍的定时能力,即定时数值是OSTick的整数倍。例如一个OS Tick是10ms,那么上层软件定时器只能提供10ms,20ms,, 100ms等时间精度的定时服务,而不能定时为15ms、25ms、35ms等。 当软件定时器所设定的定时时间到了后,会调用用户设置的定时器timeout回调函数,用户需要定时运行的程序会在回调函数中得到处理。 2. 定时模式 HARDTIMER模式 HARD_ _TIMER 模式的定时器超时函数在中断上下文环境中执行,此模式在定时器初始化时指定。在中断上下文环境中执行时,对于超时函数的要求与中断服务例程的要求相同:执行时间应该尽量短,执行时不应导致当前,上”下文挂起。HARD_ TIMER 模式是RT-Thread软件定时器的默认方式。 SOFTTIMER模式 SOFTTIMER模式的定时器超时函数在系统的timer线程的线程上下文中执行。通过宏定义RT_USING_TIMER_SOFT 来决定是否启用该模式。当启用SOFTTIMER模式后

RT-Thread学习记录10 线程的优先级翻转

最后都变了- 提交于 2020-08-09 14:41:24
以下为看视频笔记.......... 1.优先级翻转 使用信号量会导致的另一个潜在问题是线程优先级翻转问题。所谓线程优先级翻转,即当一个高优先级线程试图通过某种互斥IPC对象机制访问兵享资源时,.如果该IPC对象已被-低优先级的线程所持有,而这个低优先级线程在运行过程中可能又被其它- -些中等优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞的情况。优先级翻转会造成高优先级线程的实时性得不到保证。{图中M代表共享资源,A,B,C代表线程} 2. 优先级继承 在RT-Thread中,通过互斥量的优先级继承算法,可以有效的解决优先级翻转问题。 优先级继承是指提高某个占有某种共享资源的低优先级线程的优先级,使之与所有等待该资源的线程中优先级最高的那个线程的优先级相等,从而得到更快的执行然后释放共享资源,而 当这个低优先级线程释放该资源时,优先级重新回到初始设定值。 继承优先级的线程避免了系统共享资源被任何中间优先级的线程抢占。 3. 优先级翻转示例 在priority_inversion.c代码中。 优先级翻转现象提醒编程人员对共享资源进行互斥访问的代码段应尽量短。 来源: oschina 链接: https://my.oschina.net/u/4381446/blog/4310287

RT-Thread学习记录8 生产者消费者问题

拈花ヽ惹草 提交于 2020-08-05 08:25:54
以下为看视频笔记.......... 1.生产者消费者问题模型 生产者消费者问题是一个经典的、多线程同步问题。 有两个线程: - -个生产者线程和一个消费者线程。两个线程共享-个初始为空、固定大小为n的缓存区。. 生产者的工作是“生产”-段数据,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待,如此反复; 同时,只有缓冲区非空时,消费者才能从中取出数据,- 次消费- -段数据, 否则必须等待,如此反复。 问题的核心是: 1.1 要保证不让生产者在缓存还是满的时候仍然要向内写数据; 1.2 不让消费者试图从空的缓存中取出数据。 2. 生产者消费者问题本质 解决生产者消费者问题实际上是要解决线程间互斥关系问题(指的是共享资源)同步关系问题(线程的步调) 由于缓冲区是临界资源,它一个时刻只允许-一个生产者放入消息,或者--个消费者从中取出消息,所以这里我们需要解决一个互斥访问的问题。 同时生产者和消费者又是一- 个相互协作的关系,只有生产者生产之后,消费者才能消费,所以我们还需要解决一个同步的问题。 二值信号量指的是value值为0或1,实现共享资源的互斥。首先把value值初始化为1, 生产者线程访问共享资源时,他先获取二值信号量的值,因为value初始化为1,生产者可以操作共享资源;当这时候消费者线程去获取共享资源时,此时value值被生产者赋值为0了

RT-Thread学习记录12 邮箱的使用

末鹿安然 提交于 2020-08-04 23:59:17
以下为看视频笔记.......... 1. 邮箱的工作机制 RT-Thread操作系统的邮箱用于线程间通信(邮箱具有数据交互功能,但互斥量、信号量等IPC没有数据交互功能),特点是开销比较低,效率较高。邮箱中的每一封邮件只能容纳 固定的4字节内容 (针对32位处理系统,指针的大小即为4个字节,所以一封邮件恰好能够容纳一个指针)。 线程或中断服务例程把一封4 字节长度的邮件发送到邮箱中,而其他需要的线程可以从邮箱中接收这些邮件并进行处理。“ 2. 邮箱控制块 在RT-Thread中,邮箱控制块是操作系统用于管理邮箱的-一个数据结构。 struct rt_ mailbox { struct rt_ipc_object parent;/**< inherit from ipc_ object */ rt_uint32_t *msg_pool;/**< start address of message buffer */ rt_uint16_t size; /*< size of message pool */ rt_uint16_t entry;/**< index of messages in msg_ pool,邮件的数目 */ rt_uint16_t in_offset;/**< input offset of the message buffer */ rt_uint16_t

RT-Thread Studio 使用笔记(二):如何使用SPI设备

只愿长相守 提交于 2020-07-28 13:09:15
写在最前 使用RT-Thread Studio开发环境开发STM32单片机程序,与MDK使用env有一定的差别,对于刚开始使用的程序员来说,主要是找不到配置选项在哪里,上一篇介绍了TIM设备的使用方法,这篇介绍SPI的使用方法,流程与TIM类似。 大致总结为以下几个步骤: 在RT-thread settings中使能对应的驱动框架 在stm32f4xx_hal_conf.h中使能对应的模块(HAL_XX_MODULE_ENABLED) 在board.h中启用外设类型对应的宏定义板级支持,通道号以及IO口等参数(BSP_USING_XX) 使用STM32CubMx生成对应的初始化代码,并考入board.c中(HAL_XX_MspInit) 进行应用层设备初始化,使用设备 使用SPI设备示例 在RT-thread settings中使能对应的驱动框架,使能SPI。 在stm32f4xx_hal_conf.h中使能对应的模块(HAL_XX_MODULE_ENABLED) 在board.h中启用外设类型对应的宏定义板级支持,通道号以及IO口等参数(BSP_USING_XX) 使用STM32CubMx生成对应的初始化代码,并考入board.c中(HAL_XX_MspInit) 进行应用层设备初始化,使用设备(W5100S为例) /*******************************

熊谱翔:变化的RT-Thread,不变的初心

寵の児 提交于 2020-07-28 08:06:34
前段时间有爆出了某大佬的OS和RT-Thread很像,所以画了这么张图,同时也发在社交媒体上:"Roadmap or history of RT-Thread? No matter what RT-Thread is, it's alway there. Hope RT-Thread is a locomotive, lead us all to the future." 提到RT-Thread的发展路线,其实是被很多社区小伙伴关心的:RT-Thread到底会走向何方? 初心出发 由于个人兴趣及项目需求动手写了一个RTOS,在2006年初发布了RT-Thread的第一个内核版本并开源,一开始纯粹以工程师的角度去做,当时有个看似遥远的目标是能做成一个开放式,嵌入式系统领域的Linux。 然而接下来几年RT-Thread这个项目进入了一个艰难时期,因为仅仅只是一个RTOS内核很难得到关注,期间凭借个人兴趣不断去做不同平台移植,完善功能。期间也做过一些社区活动,很多时候就是一些爱好者在汉堡王、KFC这类地方AA制聚会交流,记得最惨淡的时候聚会只有两个人(包括自己)。 长时间的坚持和付出,RT-Thread开始有了些支持者,然后不断有开发者加入进来贡献代码和完善。ARM Cortex M3的出现,让开源的RT-Thread走上了新的阶段,此时的RT-Thread已不再只是一个实时内核了

【STM32F4】【银杏科技ARM+FPGA】iCore3移植RT-Thread--RTC

血红的双手。 提交于 2020-07-28 07:27:14
RTC(Real-Time Clock)实时时钟可以提供精确的实时时间,可以提供时钟日历的功能。目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。iCore3 RTC外加电池供电,为了在主电源掉电时还可以工作。RT-Thread的RTC设备为操作系统的时间系统提供了基础服务,面对越来越多的loT场景,RTC已经成为了产品的标配。 一、 使能RTC ,选择时钟源 1.1 我们打开../BSP/STM32/STM32F407_gingko_iCore3/board/CubeMX_Config来进行RTC使能配置,其他参数不予更改。配置完成后点击CREATE CODE。 1.2 CubeMX生成工程后,只保留红色方框内的文件,其他的两个文件夹可以删除掉。 1.13复制刚生成的src文件夹main.c文件夹中的函数SystemClock_Config(void)到board.c。这里内核初始化时要调用该函数进行时钟配置。 二、 打修改Kconfig 文件,在menu “On-chip Peripheral Drivers” 下增加RTC 选项 2.1打开../BSP/STM32/STM32F407_gingko_iCore3/board/Kconfig: 2.2点击保存,打开Env工具,输入menuconfig命令,使能RTC: 2.3保存退出,输入scons --target

飞凌iMXRT系列-iMXRT1052经验分享-iMXRT1052产品解决方案合集

|▌冷眼眸甩不掉的悲伤 提交于 2020-07-27 11:32:39
FET1052-C核心板基于 NXP 公司 i.MX RT1052 跨界处理器设计,搭载 ARM Cortex -M7 内核,集微控制器的低功耗、易用性与应用处理器的高性能、高扩展性于一体。主频 528MHz,SRAM 512 KB(TCM),SDRAM 16MB/32MB,QSPI-Nor Flash 4MB/16MB 。工业级核心板,运行温宽 -40℃~85℃;体积小巧仅31*43mm,采用0.8mm间距连接器;引脚数 量160PIN,CPU全功能引出,可配置出124个GPIO;引出UART、Ethernet、USB、CAN 、 PWM、ADC、LCD、CAMERA等丰富外设功能;支持uCLinux、裸机、FreeRTOS、RT-Thread多种系统。 研发课堂丨飞凌iMXRT1052开发板使用IAP在线升级APP的操作方法: https://www.forlinx.com/article_view_418.html 为什么选择i.MXRT1052进行开发设计?: https://www.forlinx.com/article_view_408.html i.MX RT系列外置Flash加密为您的产品安全保驾护航: https://www.forlinx.com/article_view_346.html 基于FET1052-C的四轴飞行器的方案: https://www

RT-Thread Studio 使用笔记(一):如何使用TIM定时器

心已入冬 提交于 2020-07-25 01:55:47
使用RT-Studio开发环境开发STM32单片机程序,与之前使用env有一定的区别,包括文件目录结构,配置方法等,下面介绍一下如何使用硬件定时器。 1. 在rt-thread settings中使能硬件定时器框架并保存,如下图所示: 2. 在board.h中使用宏定义#define BSP_USING_TIM以及定义使用的定时器通道,比如#define BSP_USING_TIM2 3. 根据要使用的定时器,修改 tim_config.h ,增加或修改TIM2_CONFIG宏定义: 4. 使能stm32f4xx_hal_conf.h中的#define HAL_TIM_MODULE_ENABLED 5.最后,可以在应用程序中直接使用定时器,参考代码如下: /**********************************函数描述*********************************** * 创建人: 侍任伟 * 创建时间: 2020.03.28 * 功能描述: 定时器超时回调函数 * 入口参数: * 函数返回: *****************************************************************************/ static rt_err_t timeout_cb(rt_device_t dev, rt

RT-Thread学习记录6 临界区保护

人走茶凉 提交于 2020-07-24 03:23:24
以下为看视频笔记.......... 1.临界区概念 临界资源是指一次仅允许一一个线程访问的共享资源。它可以是一个具体的硬件设备(如打印机等),也可以是一个变量、一个缓冲区。 不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它们进行访问 每个线程中的访问(操作)临界资源的那段代码称为临界区(Critiacl Section),我们每一次只允许一个线程进入临界区。 /* 程序的目的先把全局变量value值加到10000,在赋值为500.注意顺序。 演示全局变量value为临界区资源,两个线程访问变量value。 */ uint32_t value = 0; //一个变量为临界资源 void thread1_entry(void *para) //线程1 访问全局变量value,进行加价操作 { uint32_t i=0; for(i=0;i<10000;i++) { rt_kprintf("%d\\r\rn",value); value++; } } void thread2_entry(void *para) //线程2 访问全局变量value进行值的改写 { rt_thread_delay(50); value = 500; } 为了以上value值能够先加到10000后在赋值为500,每次操作我们要有临界区保护操作。 2. 临界区保护 RT