![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
RTX5
文章平均质量分 74
Wallace Zhang
目标:
有朝一日,自己能独立完成一个机器人。
博客初衷:
将学习到的知识分享给大家,一起学习,同时自己又能再一次提高对知识的理解(费曼定理)
爱好:
喜欢手冲黑咖啡。
展开
-
嵌入式实时操作系统RTX5快速入门 (完结)
一、前言在实际工作上使用过ucosIII与FreeRTOS,对它们俩的API都较为熟悉,那么当有新的项目时,直接二选一就好了。为什么非得去折腾另一款新的RTOS(RTX5)?原因是使用RTOS会影响系统的执行效率(ISR切换线程,线程切换线程都需要时间)。但是,RTX5在这方面做得不错,这是我非得去折腾一个新的RTOS的原因。RTX5的简单介绍可以查看安富莱的总结:第3章 RTX5操作系统介绍非得折腾去RTX5的理由:实时性强。以低的中断延迟执行高速实时操作(对于M3/M4/M7内核可以实现零中断延原创 2021-06-09 23:01:16 · 21456 阅读 · 14 评论 -
RTX5 | 内存池04 - 共享内存用于线程之间的通讯(阻塞方式)- 使用信号量
文章目录一、前言二、实验目的三、代码3.1、main.h3.2、main.c四、Debug4.1、System Analyzer4.2、Debug (printf) Viewer一、前言RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)上一个实验演示了线程B周期性轮询共享内存(内含ringbuffer算法)里是否有新的消息读取,大部分时间都是没有新消息可以读取,没有新消息时,线程B就没必要运行了。这一次实验需要用到信号量,信号量让线程B进入阻塞态,信号量又可以让线程B有机会进入运原创 2021-07-08 19:55:30 · 1244 阅读 · 2 评论 -
RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)
文章目录一、前言怎样防止内存溢出?二、实验目的三、代码3.1、main.h3.2、main.c四、Debug4.1、Debug (printf) Viewer4.2、修改一下程序:线程B不从ringbuffer读取数据,线程A不断往ringbuffer写入数据一、前言正如官方介绍所说,共享内存是线程与线程(或ISR)之间通讯的一种基本的模型。而且,当线程与线程之间的通讯使用共享内存时,相比消息队列有更高的通讯效率,更复杂的通讯结构。有了共享内存之后,并不是说消息队列毫无用处之地了。消息队列使用起来简原创 2021-07-08 19:43:56 · 1959 阅读 · 7 评论 -
STM32F103+CubeMX-Keil上移植RTX5实时系统
一、前言入门STM32嵌入式开发,STM32F103估计是大家的首选。当年我自学STM32嵌入式开发时,使用的就是正点原子的STM32F103战舰板子。STM32F103使用的是Cortex-M3架构,相比STM32F407(Cortex-M4)与STM32H743(Cortex-M7)来说较为简单,所以STM32F103更适合入门。本博文介绍如何在STM32F103上完成RTX5的移植。我使用的Keil版本:一定要使用最新的CMSIS软件包。下载地址:https://www.keil.com/原创 2021-06-30 06:37:16 · 5311 阅读 · 12 评论 -
RTX5 | 内存池02 - 剩下几个API
文章目录一、前言二、实验目的三、API3.1、osMemoryPoolGetCapacity3.2、osMemoryPoolGetBlockSize3.3、osMemoryPoolGetCount3.4、osMemoryPoolGetSpace3.5、osMemoryPoolDelete四、代码4.1、main.h4.2、main.c五、Event Recorder调试5.1、Debug(printf) Viewer一、前言内存池剩下几个重要的API做一下实验,看看使用的效果。STM32工程:链接原创 2021-06-24 22:09:15 · 965 阅读 · 1 评论 -
RTX5 | 内存池01 - 内存池的使用
文章目录一、前言二、实验目的三、API3.1、osMemoryPoolAttr_t3.2、osMemoryPoolNew3.3、osMemoryPoolAlloc3.4、osMemoryPoolFree四、代码4.1、main.h4.2、main.c五、Event Recorder调试5.1、RTX RTOS一、前言内存池(Memory Pools)是线程安全的,固定大小的内存块。它们比动态堆栈分配内存操作更加快,且没有内存碎片化问题。因为线程安全,它们能够被线程与ISR同样地访问。一个内存池能看被原创 2021-06-24 22:01:49 · 3195 阅读 · 5 评论 -
RTX5 | 互斥量01 - 互斥量的使用
文章目录一、前言二、实验目的三、API3.1、osMutexAttr_t3.2、osMutexNew3.3、osMutexAcquire3.4、osMutexGetOwner3.5、osMutexRelease四、代码4.1、main.h4.2、main.c五、Event Recorder调试5.1、System Analyzer5.2、RTX RTOS5.3、Debug (printf) Viewer一、前言互斥量通常在各种各样的操作系统上用于资源管理。MCU上的很多资源能被复用,但是,在同一个时刻原创 2021-06-23 19:24:10 · 3073 阅读 · 4 评论 -
RTX5 | 信号量01 - 信号量的使用
文章目录一、前言二、实验目的三、API3.1、osSemaphoreAttr_t3.2、osSemaphoreNew3.3、osSemaphoreAcquire3.4、osSemaphoreRelease3.5、osSemaphoreGetCount四、代码4.1、main.h4.2、main.c五、Event Recorder调试5.1、线程A每隔1S时间运行一次5.1、按下按键KEY0,获取全部信号量5.2、按下按键KEY1,释放信号量一、前言信号量常用于管理和保护对共享资源的访问,信号量跟互斥量原创 2021-06-23 19:17:36 · 4802 阅读 · 3 评论 -
RTX5 | 配置文件RTX_Config.h(三)
文章目录一、前言二、Timer Configuration2.1、Object specific Memory allocation(对象特定的内存分配)2.2、Timer Thread Priority(软件定时器的优先级)2.3、Timer Thread Stack size[bytes]2.4、Timer Thread TrustZone Module Identifier2.5、Timer Callback Queue entries(定时器回调消息队列)三、其他RTX5对象的配置一、前言上一原创 2021-06-22 20:58:45 · 1736 阅读 · 1 评论 -
RTX5 | 软件定时器02 - 创建一个软件定时器(连续运行)
文章目录一、前言二、实验目的三、API3.1、osTimerNew3.2、osTimerStart四、代码4.1、main.h4.2、main.c五、Event Recorder调试5.1、RTX RTOS5.2、Debug (printf) Viewer一、前言RTX5跟其他RTOS一样,提供软件定时器的功能,定时器可分为单次运行与周期运行。当定时器的计数时间到,执行一遍回调函数。连续运行模式的软件定时器被API函数osTimerStart,osTimerStop控制。软件定时器被创建后,使用osT原创 2021-06-22 20:51:41 · 2793 阅读 · 11 评论 -
RTX5 | 软件定时器01 - 创建一个软件定时器(单次运行)
文章目录一、前言二、实验目的三、API3.1、osTimerNew3.2、osTimerStart四、代码4.1、main.h4.2、main.c五、Event Recorder调试5.1、查看线程的信息与定时器的信息5.2、查看打印信息一、前言RTX5跟其他RTOS一样,提供软件定时器的功能,定时器可分为单次运行与周期运行。当定时器的计数时间到,执行一遍回调函数。二、实验目的创建一个单次运行的定时器,然后每隔300ms通过osTimerStart()激活定时器运行一次。三、API3.1、原创 2021-06-21 20:58:11 · 2684 阅读 · 4 评论 -
STM32F407+CubeMX+Keil上移植RTX5实时系统
文章目录一、前言二、CubeMX2.1、RCC 与 Clock Configuration2.2、SYS2.3、GPIO2.4、Project Manager三、Keil3.1、Target3.2、Output3.3、C/C++(AC6)3.4、Debug3.5、模板代码(main.c)3.6、开始移植RTX53.6、隔离Device上的文件四、代码4.1、main.h4.2、main.c五、DEBUG5.1、RTX RTOS六、细节补充6.1、移植Event Recorder调试工具一、前言STM3原创 2021-06-21 20:31:16 · 3922 阅读 · 10 评论 -
RTX5 | 事件标志组04 - 线程同步(逻辑与)
文章目录一、前言二、实验目的三、API3.1、osEventFlagsWait四、代码4.1、main.h4.2、main.c五、Event Recorder5.1、分别长按按键KEY0,KEY1,KEY2一、前言上一节学习了使用逻辑或同步线程,接下来学习使用逻辑与同步线程。STM32工程:链接:https://pan.baidu.com/s/1wKWtdPEHyn1NBTc97DRb5A提取码:hmeo二、实验目的分别长按KEY0,KEY1,KEY2后同步线程A。三、API3.1、原创 2021-06-17 23:56:42 · 1195 阅读 · 5 评论 -
RTX5 | 事件标志组03 - 线程同步(逻辑或)
一、前言事件标志组是独自存在的,线程标志组只是线程的一部分。事件标志组的使用方法与线程标志组的使用方法一样,学会使用线程标志组就等于学会使用事件标志组,反之亦然。当线程退出之后,其线程标志组就会消失。创建线程就等于创建了一个线程标志组,它们是一块的。事件标志组需要单独创建,所以事件标志组需要额外占用内存池的内存。那为什么需要事件标志组?全部用线程标志组不就好了吗?通过一个事件标志组,一个线程可以同步多个线程。1个事件标志组里有32个事件位,每1个事件位同步1个线程的话,那么1个事件标志组最大能同步32原创 2021-06-16 08:01:39 · 1662 阅读 · 0 评论 -
RTX5 | 配置文件RTX_Config.h(二)
文章目录一、前言二、Thread Configuration2.1、Object specific Memory allocation(对象特定的内存分配)2.1.1、Number of user Threads(用户线程的数量)2.1.2、Number of user Threads with default Stack size(使用默认堆栈大小的用户线程的数量)2.1.3、Total Stack size[bytes] for user Threads with user-provided Stack原创 2021-06-15 21:33:29 · 2440 阅读 · 0 评论 -
RTX5 | 时间延时
文章目录一、前言二、API2.1、osDelay()2.2、osDelayUntil()一、前言RTX5提供两个延时API函数:相对延时osDelay(uin32_t ticks)绝对延时osDelayUntil(uint32_t ticks)无论哪一种时间延迟方式都难以避免线程被延时执行。当各个线程的优先级不一样时,RTX5执行可剥夺型线程管理。某个线程的延时时间到达时,很有可能有其他更高优先级的线程处于就绪态,或者产生ISR中断回调处理,此时线程就会被推迟执行。线程被推迟的时间肯定会波动原创 2021-06-15 21:21:34 · 6253 阅读 · 0 评论 -
RTX5 | STM32H743+CubeMX+RTX5+两路FDCAN驱动+CANopen协议
一、前言百度网盘:链接:https://pan.baidu.com/s/1NEccCy1S-Z5FhcInQOTzfA提取码:fddgRTX5 | STM32H743+CubeMX+RTX5+两路FDCAN模板在上一个模板的基础上,增加CANopen协议。二、实验目的在FDCAN1上初始化了一个CANopen从站对象。FDCAN2暂时只是普通的CANBUS。三、代码3.1、main.c简单介绍一下重点代码。线程thread_FDCAN1_Unpack_App。(将接收到的CAN报文提原创 2021-06-10 20:14:13 · 1384 阅读 · 0 评论 -
RTX5 | STM32H743+CubeMX+RTX5+两路FDCAN模板
百度网盘:链接:https://pan.baidu.com/s/15dy_YsLAaNDRZ7rPNUmtlA提取码:0xm9测试硬件:CubeMX的版本:6.2.1HAL库版本:STM32Cube_FW_H7_V1.9.0Keil版本:5.31RTX5版本:5.5.2两路FDCAN的配置:FDCAN1与FDCAN2同时工作FDCAN的工作模式为普通CAN(可以跑CANopen协议)每路FDCAN有32个接收FIFO每路FDCAN有32个发送FIFO通讯波特率:1M接收中断+原创 2021-06-10 20:09:31 · 1537 阅读 · 0 评论 -
RTX5 | 配置文件RTX_Config.h(一)
文章目录一、前言一、前言**使用RTX5开发项目之前,一定要先把RTX5系统配置文件RTX_Config.h弄明白。**在学习RTX5的配置文件后,我认为RTX5的系统配置文件比FreeRTOS与ucosIII的系统配置文件都要简单。我在STM32F103与STM32H743都移植了RTX5,配置文件使用默认配置也能正常工作(FreeRTOS在移植后需要认真配置中断相关的配置,不然会让中断回调函数卡死整个RTOS系统)。所以,System Configuration使用默认配置也能正常体验RTX5系统。原创 2021-06-09 21:31:46 · 4845 阅读 · 10 评论 -
RTX5 | 消息队列06 - (实战技巧)FDCAN接收中断ISR同步线程
文章目录一、前言二、实验目的三、代码3.1、main.h3.2、main.c3.3、bsp_fdcan.c四、调试4.1、CAN盒子4.2、Event Recorder一、前言FDCAN接收中断+消息队列实现线程同步非常实用,在实际工作中必须掌握。近半年都在使用STM32做CANopen相关的开发工作,之前使用FreeRTOS设计了一个CANopen主站,这个CANopen主站控制16个伺服电机(CANopen从站)。FreeRTOS的消息队列+FDCAN接收中断+线程编写程序控制一堆电机真的非常实用。原创 2021-06-08 22:59:06 · 1764 阅读 · 1 评论 -
RTX5 | 消息队列05 - 获取剩余空间,清空消息队列,删除消息队列
文章目录一、前言二、实验目的三、API3.1、osMessageQueueGetSpace3.2、osMessageQueueReset3.3、osMessageQueueDelete四、代码4.1、main.h4.2、stm32f1xxit.c4.3、main.c五、Event Recorder调试5.1、长按按钮KEY0,获取消息队列的剩余空间5.2、长按按钮KEY1,清空消息队列。长按按钮KEY2,删除消息队列。一、前言继续学习消息队列的API函数。获取剩余空间osMessageQueueGe原创 2021-06-08 08:01:31 · 1797 阅读 · 0 评论 -
RTX5 | 消息队列04 - (实战技巧)串口中断回调函数ISR同步线程
文章目录一、前言二、实验目的三、API3.2、osMessageQueueGet四、代码4.1、main.h4.2、stm32f1xx.it.c4.3、main.c五、Event Recorder调试5.1、使用串口助手发送字符给单片机一、前言在实际的项目上,消息队列主要用于线程同步。所谓线程同步就是一个线程或者ISR中断往某个消息队列发送一个消息后,触发调度器将另外一个线程(等待这个消息队列的线程)马上从阻塞态切换至运行态,读取消息与解析消息。线程标志组与事件标志组也可以用于线程同步,但是它们传递的消原创 2021-06-07 22:22:18 · 2478 阅读 · 9 评论 -
RTX5 | 消息队列03 - 获取消息队列里消息的数量,并一次性提取出来
文章目录一、前言二、实验目的三、API3.1、osMessageQueueGetCount四、代码4.1、main.h4.2、main.c五、Event Recorder调试5.1、长按按键KEY1,往消息队列里压入变量put_Uart与变量put_Uart2的值。5.2、长按按键KEY2,将消息队列里的所有消息取出来(一次性取出来)。一、前言通过上一次的学习,学会使用消息队列的两个必须学会使用的API函数。RTX5 | 消息队列02 - 放入与取出消息今天学习另外一个在实际项目开发中可能用到的API原创 2021-06-07 21:01:59 · 1967 阅读 · 0 评论 -
RTX5 | 事件标志组02 - 置位事件标志组,并获取事件标志组的值
文章目录一、前言二、实验目的三、API3.1、osEventFlagsSet3.2、osEventFlagsGet四、代码4.1、main.h4.2、main.c五、Event Recorder调试5.1、长按按键KEY1,将事件标志组event_Flags1的flag0置1,并获取当前事件标志组event_Flags的值5.2、长按按键KEY2,将事件标志组event_Flags1的flag1,flag2,flag3同时置1,并获取当前事件标志组event_Flags的值5.3、接着,长按KEY1或KEY原创 2021-06-03 23:06:42 · 1495 阅读 · 2 评论 -
RTX5 | 事件标志组01 - 创建事件标志组
文章目录一、前言二、实验目的三、API3.1、osEventFlagsAttr_t3.2、osEventFlagsNew四、代码4.1、main.h4.2、main.c五、Event Recorder调试一、前言事件标志组与线程标志组都是用于线程同步,本质就是线程与线程之间的通讯。只是通讯结束后,接收方的线程会从阻塞态变成准备态(或者直接变成运行态),其实就是触发了调度器。STM32工程:链接:https://pan.baidu.com/s/1Q4zLiEfyDLJRjtY9OXCAuw提取码:原创 2021-06-03 20:49:24 · 1915 阅读 · 0 评论 -
RTX5 | 线程标志组02 - 获取线程标志与清除线程标志
文章目录一、前言二、实验目的三、API3.1、osThreadFlagsClear3.2、osThreadFlagsGet四、代码4.1、main.h4.2、main.c五、Event Recorder调试5.1、长按按键KEY15.2、长按按键KEY2六、细节补充6.1、osThreadFlagsGet不会阻塞当前线程,osThreadFlagsWait可以阻塞当前线程,也可以设置超时,也可以不阻塞。一、前言跟线程标志相关的API还有两个,分别是osThreadFlagsClear与osThreadF原创 2021-06-02 23:05:34 · 1514 阅读 · 4 评论 -
RTX5 | 线程标志组01 - 线程同步
文章目录一、前言二、实验目的三、API3.1、osThreadFlagsSet3.2、osThreadFlagsWait四、代码4.1、main.h4.2、main.c五、Event Recorder调试5.1、长按按键KEY1与长按按键KEY25.2、线程同步的效果5.3、将线程同步的地方放大一、前言线程标志(Thread Flags)与事件标志(Event Flags)的作用一样,都是用于线程与线程之间通讯。线程标志与事件标志的区别是事件标志跟线程没有直接关系,所以事件标志需要创建之后才能使用的。线原创 2021-06-02 20:39:49 · 2708 阅读 · 0 评论 -
RTX5 | 消息队列02 - 放入与取出消息
文章目录一、前言二、实验目的三、API3.1、osMessageQueuePut3.2、osMessageQueueGet四、代码4.1、main.h4.2、main.c五、DEBUG5.1、长按按键KEY1,将变量放入消息队列5.2、长按按键KEY2,从消息队列取出消息一、前言在RTOS里,消息队列与线程一样都是非常重要的功能。在实际项目上,线程与消息队列都肯定要使用。最常用的案例是串口中断回调函数将收到的字符放入消息队列,待串口中断回调函数结束后,线程立即从该消息队列里获取字符,接着按照通讯协议解释原创 2021-06-01 22:38:13 · 4848 阅读 · 3 评论 -
RTX5 | 消息队列01 - 创建消息队列
文章目录一、前言二、实验的目的三、API3.1、osMessageQueueId_t3.2、osMessageQueueAttr_t3.3、osMessageQueueNew四、代码4.1、main.h4.2、main.c五、RTX RTOS调试程序一、前言在RTOS里,消息队列与线程一样都是非常重要的功能。在实际项目上,线程与消息队列肯定会使用。最常用的案例是串口中断回调函数将收到的字符放入消息队列,待串口中断回调函数结束后,线程立即从该消息队列里获取字符,接着按照通讯协议解释字符。中断回调函数必原创 2021-06-01 22:29:54 · 3102 阅读 · 0 评论 -
RTX5 | 线程管理05 - 线程挂起osThreadSuspend与线程恢复osThreadResume
文章目录一、前言二、API三、实验目的四、代码4.1、main.h4.2、main.c五、Event Recorder调试一、前言osThreadSuspend可以让线程A挂起,线程A保持在BLOCKED状态,直到其他线程使用osThreadResume唤起线程A。如果其他线程的优先级低于线程A,那么唤起的瞬间就会上下文切换至线程A,就是说线程A马上运行。STM32工程:链接:https://pan.baidu.com/s/1feg2Q4CIhfPwnRZtbWDFLw提取码:0sl4二、AP原创 2021-06-01 22:13:16 · 2896 阅读 · 0 评论 -
RTX5 | 线程管理04 - 线程加入osThreadJoin
文章目录一、前言二、实验目的三、API四、代码4.1、main.h4.2、main.c五、Event Recorder调试一、前言当线程的属性成员attr_bits为osThreadJoinable时,在线程里调用osThreadExit,线程从RUNNING(运行态)进入INACTIVE/TERMINATED(终止态)。处于终于态的线程不能被调度器进行调度。然而,在某些条件下,用户又需要将线程返回至运行态,能被调度器进行调度。此时,使用API函数osThreadJoin+osThreadNew可以让线原创 2021-06-01 22:05:29 · 1740 阅读 · 0 评论 -
RTX5 | 线程管理03 - 线程退出osThreadExit
文章目录一、前言二、实验的目的三、API四、代码4.1、main.h4.2、main.c五、Event Recorder调试六、细节补充6.1、线程属性成员attr_bits = osThreadDetached时,调用osThreadExit6.2、线程属性成员attr_bits = osThreadJoinable时,调用osThreadExit一、前言在实际项目上,有的线程只运行一次需要自动退出,有的线程当达到某些条件时也需要自动退出,并释放堆栈的内存。为满足这个需求,RTX5提供了一个API函数原创 2021-06-01 21:56:50 · 2993 阅读 · 4 评论 -
RTX5 | 线程管理02 - 创建线程(动态堆栈方式)
文章目录一、前言二、代码main.hmain.c三、DEBUG四、细节补充4.1、跟控制块方式不一样,可以在RTX RTOS观察到线程的信息4.2、RAM相当富裕时,建议使用静态堆栈(全局变量)方式创建线程4.3、RAM比较吃紧时,使用动态堆栈方式创建线程一、前言继续学习使用动态堆栈方式创建RTX5线程,分别是LED线程与Start线程。LED线程用于翻转两个LED,Start线程用于创建其他线程,并printf一些信息出来。动态堆栈方式创建线程,线程所占的内存统一由RTX5分配。跟静态堆栈方式不一样原创 2021-05-31 21:54:37 · 2757 阅读 · 1 评论 -
STM32H743+Cube-Keil上移植RTX5实时系统
文章目录一、前言二、CubeMX2.1、RCC 与 Clock Configuration2.2、SYS2.3、GPIO2.4、DEBUG2.5、Project Manager三、Keil3.1、Target3.2、Output3.3、模板代码(main.c)3.4、开始移植RTX5四、代码4.1、main.h4.2、main.c一、前言在CM内核上,RTX5好像已经无敌了。为此,学习如何在STM32H743上完成RTX5的移植。我使用的Keil版本:一定要使用最新的CMSIS软件包。下载地址:h原创 2021-05-26 20:14:35 · 1859 阅读 · 10 评论 -
RTX5 | 线程管理01 - 创建线程(静态堆栈方式)
文章目录一、前言二、代码2.1、main.h2.1、main.c三、DEBUG四、细节补充4.1、使用静态堆栈方式创建的线程不占用RTX5内存池的内存![在这里插入图片描述](https://img-blog.csdnimg.cn/20210527233256628.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,siz原创 2021-05-27 23:33:52 · 4893 阅读 · 5 评论