
RT_Thread
文章平均质量分 65
RT_Thread操作系统
PWRJOY
如对某些文章有见解/困惑,欢迎互相交流进步。
展开
-
RT_Thread_使用FAL组件配置stm32f407片上flash读写
先看下struct fal_flash_dev的具体成员,有flash设备名字、flash起始地址、flash大小、块大小(执行擦除时的最小颗粒)、操作函数(init、read、write、erase)、写操作最小颗粒度;size_t len;第一部分:宏定义各扇区的起始地址第二部分:读、写、擦除第三部分:使用了FAL之后的FLASH设备定义以及对于的读、写、擦除操作函数。原创 2023-12-07 16:58:25 · 2713 阅读 · 1 评论 -
RT_Thread_修改为外部晶振及验证
根据实际外部晶振的频率去定义,使用的是8MHz;原创 2023-12-07 10:59:24 · 400 阅读 · 0 评论 -
RT_Thread_msh_系统msh命令、使用msh时过滤ulog日志、添加msh命令(不带/带参)
clear是清屏、version是打印内核版本、list会列出关于系统的各种信息、ps列出线程信息、free是查看内存使用、pin是控制GPIO、reboot重启系统;因为使用ulog功能,所以就会打印出很多日志信息,但是使用msh的时候又不希望这些信息刷屏,所以可以临时过滤日志方便交互、或者终端开启滚动锁定。调试过程中遇到msh不能使用,理解msh也是一个线程,有自己的优先级20,高优先级的线程(比如main是10)如果一直执行,就会阻塞msh。原创 2023-11-30 14:41:03 · 2463 阅读 · 0 评论 -
RTT_探索ulog组件的使用1(全局静态日志等级、模块静态日志等级、过滤模块日志(打开/关闭/动态日志等级)、同一个文件输出多个模块日志、不在rtt studio如何显示彩色日志)
比如,执行下面这条命令后,模块module1的日志等级会临时变为WARNING,这里所说的临时是相对于宏定义中的日志等级,下面5会提供一个实验。前期开发,比较细致的信息可以使用Debug等级去输出,后面调试完毕提高日志级别就可以了,此时不要堆积大量信息,保留关键性环节的执行。不能使用LOG_X这个API,改为ulog_x,x=e/w/i/d,就可以自定义输出日志的模块名称。还发现一个优点,输出日志保存到文件,MobaXterm会自动去掉关于颜色的信息。在不同的开发阶段,想要输出的信息是不同的。原创 2023-11-29 14:46:10 · 662 阅读 · 0 评论 -
RT_Thread_内核包版本与芯片包版本不一致的编译报错排查
Ctrl+H,在工程中直接搜索“RT_WEAK”试试看,这个操作不一定成功,因为不知道改动成什么了,如果“RT_WEAK”搜不到我可能会尝试搜索“weak”。可以看到内核中使用的是小写的rt_weak,但是芯片SDK使用的是大写的RT_WEAK,这就是错误的原因。直接将报错的RT_WEAK改为小写的rt_weak或者再加一个宏定义,#define RT_WEAK rt_weak。原创 2023-11-28 14:42:15 · 2249 阅读 · 9 评论 -
RTT_0.96寸OLED_IIC驱动
1、前言emm,这种应用跟rtt没多大关系,iic驱动也就是用到了其中的rt_i2c_transfer,不过还是写一下吧。oled就是挺常见的,0.96寸,128*64的屏,用IIC接口驱动。就算是从淘宝买的屏,商家也会有资料,各平台的例程,打开stm32的例程作为移植到现在代码的参考。下面是如何向OLED写命令、写数据的代码、初始化OLED、某个位置显示字符串、显示整数、小数;如果要画点、画线这样涉及到某个像素点的,还需要1M的缓存,[128][8]去保存当前屏幕的数据,更新这个数原创 2022-05-01 15:56:48 · 1265 阅读 · 0 评论 -
RTT_IIC_读写AT24C02
1、根据board.h步骤配置IIC1.1、打开RT-Thread Settings里的模拟IIC去RT-Thread Settings里找到模拟iic,打开,然后保存,就配置好了;1.2、打开"BSP_USING_I2Cx"宏定义图中I2C1和I2C2都打开了,实际用的是I2C2;1.3、根据实际的GPIO配置IIC的SCL和SDA引脚根据硬件来连,PB8是SCL,PB9是SDA;2、at24cxx软件包2.1、安装软件包打开RT-Thread Settings原创 2022-04-29 12:39:12 · 1690 阅读 · 3 评论 -
RT_Thread_线程自带的定时器
作用在某些需要等待的时候,会启动这个定时器,定时器的创建在xxxx时候,启动定时器,下面是如何启动定时器的代码然后在systick里有检查定时器超时如果定时器超时了,如何链接到线程定时器的超时函数...原创 2022-04-25 23:06:07 · 1223 阅读 · 0 评论 -
RT_Thread_邮箱中的环形缓冲区
1、环形缓冲区一种数据结构,适用于固定的缓冲区大小、数据先进先出的场合。所谓环形,是指用完最后一个数据再用第一个数据,首尾相连。两个指针:读偏移地址、写偏移地址; 一个整型:计数数据量,用于检测缓冲区是满或空;2、邮箱中的环形缓冲区的操作2.1、邮箱结构体邮箱结构体中,entry就是邮箱中的数据量,in_offset是写邮箱的偏移地址,out_offset是读邮箱的偏移地址;struct rt_mailbox{ struct rt_ipc_object paren原创 2022-04-23 20:06:19 · 796 阅读 · 0 评论 -
RT_Thread内部机制——消息队列
1、消息队列分为?1.1、空闲消息队列由链表msg_queue_free来指示;1.2、数据消息队列队头是链表msg_queue_head,队尾是链表msg_queue_tail;2、消息队列如何读写数据?2.1、写从msg_queue_free拿一个消息块来放数据,msg_queue_free指向下一个空消息块,这个存有数据的消息块排到队尾msg_queue_tail;如果没有空间可写,可挂起到suspend_sender_thread;...原创 2022-04-23 15:06:36 · 972 阅读 · 0 评论 -
RT_Thread自问自答
在看韦东山老师“RT-Thread内部机制”的视频,挺有意思的,有些概念的理解还是要深究一下,不然可能就是“我知道,这不就是那个....那个....那个嘛”,哪个嘛,并不是因为嘴笨说不好,是因为确实没想过真说不清楚,下面我就自问自答吧。1、线程是什么?我的理解,线程就是指挥函数的运行。【一个线程对应一个入口函数】控制ta在何时运行,可以运行多久; 暂停运行去切换别的线程时,保存当前的环境,以便下次继续运行;2、线程切换时要保存的环境是什么?首先函数是存在FLASH中的,不需要保.原创 2022-04-22 21:43:29 · 771 阅读 · 0 评论 -
RT_Thread_串口数据解包
1、背景之前买过一个传感器模块,可以输出光照强度、温湿度、大气压强、海拔,看着好玩就买了,刚好现在辞职了就在家研究研究,RT_Thread我也是最近在家这段时间开始学习的,恍然间都更新了23篇了,希望自己可以多学一些,而不是拿着自己现在会的知识打一份工,找工作不是看是否轻松是否挣钱,工作是我们生命中的一大部分时光,一定要找到一份热爱的工作,不然就太可惜了。这个模块(GY39)的数据可以由串口输出,格式如下:USB转TTL连接模块和串口助手,接收数据如下:(循环发送0x15和0x45的帧,原创 2022-04-20 17:34:51 · 2864 阅读 · 3 评论 -
RT-Thread_rt_kprintf()打印浮点数(解决方法2:添加rt_vsnprintf_full)
1、解决方法1(替换vsnprintf)反思按上篇文章的解决方法1,rt_kprintf是可以打印浮点数了,但总觉得有些不好,如果直接替换vsnprintf就行那官方为什么不替换,是因为还要添加libc的支持,那不添加libc的话,rt_thread应该会自己提供实现打印浮点的方法吧。毕竟打印浮点数应该是一个挺普遍的需求,不应该没支持的,于是再次查阅资料发现了解决方法2。如果之前按解决方法1(替换vsnprintf)操作,请先恢复rt_kprintf()2、解决步骤2..原创 2022-04-20 13:50:33 · 4072 阅读 · 5 评论 -
RT-Thread_rt_kprintf()打印浮点数(解决方法1:rt_vsnprintf替换为vsnprinitf)
1、问题变量类型是double,利用rt_kprintf发现无法打印。rt_kprintf("temperature = %.2f\n",GY39_Info.temperature);2、解决步骤2.1、进入rt_kprintf()函数,将rt_vsnprintf改为vsnprintf;2.2、添加头文件#include <stdio.h>2.3、打开"RT-Thread Setting"添加"libc"组件重新编译下载,就可以了。...原创 2022-04-20 12:51:10 · 1858 阅读 · 2 评论 -
RT_Thread_配置串口3、利用例程验证
1、配置board.h的串口3打开board.h文件,找到串口这一段,就是在这里增加串口3的配置,先看一下注释中的说明。1、宏定义串口号 2、宏定义相对应的发送和接收引脚号 3、如果使用DMA,要在RT-Thread Settings里配置 4、根据串口号和发送接收定义DMA功能所以我们配置串口3只需要第1、2步,新增在之前的串口1下方。/*-------------------------- UART CONFIG BEGIN ------------------------.原创 2022-04-19 12:59:04 · 1859 阅读 · 2 评论 -
RT_Thead_board.h中的宏配置
1、board.h的宏想要使用某个外设,就可以去board.h里开启对应的宏。下面是board.h里涵盖的宏的思维导图,一目了然。2、配置开启宏并不是唯一的步骤,在注释里还有详细的操作步骤说明,这里截取两个。/*-------------------------- UART CONFIG BEGIN --------------------------*//** After configuring corresponding UART or UART DMA, you原创 2022-04-19 12:05:05 · 656 阅读 · 0 评论 -
RT-Thread Studio中ST-LINK下载报错“Old ST-LINK firmware version“解决
1、问题RT-Thread Studio中选择ST-LINK下载,报错如下:2、分析及解决步骤这个报错是说ST-LINK的版本太老了,请升级。首先报错没说找不到ST-LINK驱动啥的,只是说版本太老,所以是有一个旧版本的ST-LINK存在的,这就是平时我在Keil5上用的ST-LINK喽。进入Keil5的安装目录,找到ST-LINK文件夹,如下图:"ST-LinkUpgrade.exe"这就是现成的用于ST-LINK更新的程序啊,得来全不费工夫,双击打开。点原创 2022-04-18 17:08:53 · 4950 阅读 · 1 评论 -
RT_Thread_软件定时器
1、定时器分类1.1、硬件定时器(MCU提供)精度很高,可以达到纳秒级别,并且是中断触发方式。由外部晶振提供给芯片输入时钟,到达设定时间值后芯片中断控制器产生时钟中断。1.2、软件定时器(OS提供)定时数值必须是 时钟节拍(OS Tick)的整数倍。HARD_TIMER模式RT-Thread 定时器默认的方式是 HARD_TIMER 模式,即定时器超时后,超时函数是在系统时钟中断的上下文环境中运行的。SOFT_TIMER模式通过宏定义 RT_USING_TIMER_SO原创 2022-04-18 12:13:48 · 2575 阅读 · 0 评论 -
RT_Thread_进程间通讯——消息队列
1、消息队列消息队列能够接收来自线程或中断服务例程中不固定长度的消息,并把消息缓存在自己的内存空间中。 其他线程也能够从消息队列中读取相应的消息(最先进入消息队列的消息,即先进先出原则 (FIFO))。而当消息队列是空的时候,可以挂起读取线程,当有新的消息到达时,挂起的线程将被唤醒以接收并处理消息。struct rt_messagequeue{ struct rt_ipc_object parent; void* msg_pool;原创 2022-04-17 19:57:53 · 3325 阅读 · 0 评论 -
RT_Thread_进程间通讯——邮箱
1、邮箱邮箱是线程间通信的一种方法,可以传递数据。每封邮件4个字节大小(32 位CPU,指针的大小为 4 个字节,所以一封邮件恰好能够容纳一个指针)。struct rt_mailbox{ struct rt_ipc_object parent; rt_uint32_t* msg_pool; /* 邮箱缓冲区的开始地址 */ rt_uint16_t size; /* 邮箱缓冲区的大小 */原创 2022-04-17 15:33:30 · 2615 阅读 · 0 评论 -
RT_Thread_事件集
1、事件集用一个 32 位无符号整型变量来表示,每一位代表一个事件,线程通过 “逻辑与” 或“逻辑或”将一个或多个事件关联起来,形成事件组合。事件的 “逻辑或” 也称为是独立型同步,指的是线程与任何事件之一发生同步; 事件的 “逻辑与” 也称为是关联型同步,指的是线程与若干事件都发生同步。2、事件集API2.1、创建和删除静态事件集rt_err_t rt_event_init(rt_event_t event, const char* name, rt_uint8_t flag)原创 2022-04-16 20:39:33 · 1330 阅读 · 0 评论 -
RT_Thread_互斥量
1、互斥量概念互斥量是一种特殊的二值信号量,只有两种状态:开锁或闭锁;可用于对临界资源的保护从而实现独占式访问。当一个线程A持有互斥量时,其他线程不能进行开锁或持有,但线程A能够再次获得这个锁而不被挂起。这个特性与一般的二值信号量有很大的不同:在信号量中,线程递归持有会发生主动挂起,最终形成死锁。信号量为1,take take release release,第一个take后信号量为0,第二个take就会挂起等待,而使得该信号量一直没机会释放造成死锁。2、互斥量的特性——优先级继原创 2022-04-16 15:22:22 · 1345 阅读 · 0 评论 -
RT_Thread_信号量
1、信号量1.1、创建和删除信号量静态信号量rt_err_t rt_sem_init(rt_sem_t sem, const char *name, rt_uint32_t value, rt_uint8_t flag)参数 描述 sem 信号量对象的句柄 name 信号量名称 value 信号量初始值原创 2022-04-15 21:21:56 · 810 阅读 · 0 评论 -
RT_Thread_临界资源保护
1、临界资源、临界区1.1、临界资源任何时刻最多只允许一个线程去使用的资源。进程间要以互斥的方式访问临界资源。属于临界资源的硬件:打印机、音响、屏幕等;软件:消息队列,变量,数组,缓冲区等。1.2、临界区每个进程中访问临界资源的那段代码称为临界区(criticalsection)。多个进程涉及到同一个临界资源的的临界区称为相关临界区。使用临界区时,一般不允许其运行时间过长,只要运行在临界区的线程还没有离开,其他所有进入此临界区的线程都会被挂起而进入等待状态,并在一定程度上影响原创 2022-04-15 18:22:19 · 949 阅读 · 0 评论 -
RT_Thread_调度器钩子函数
1、设置调度器钩子设置调度器钩子函数,在系统线程切换时,这个钩子函数将被调用:void rt_scheduler_sethook(void (*hook)(struct rt_thread* from, struct rt_thread* to));函数参数 描述 hook 表示用户定义的钩子函数指针 钩子函数 hook() 的声明如下:void hook(struct rt_thread* from, struct rt_thread* to);调度器钩子函数原创 2022-04-13 20:21:51 · 810 阅读 · 0 评论 -
RT_Thread_空闲线程
1、空闲线程(idle)说明1.1、线程类型:系统线程1.2、优先级:最低1.3、线程状态:就绪态当系统中无其他就绪线程存在时,调度器将调度到空闲线程,它通常是一个死循环,且永远不能被挂起。空闲线程必须有得到执行的机会,即其他线程不允许一直while(1) 死卡 ,必须调用具有阻塞性质的函数;否则例如线程删除、回收等操作将无法得到正确执行。1.4、功能1:回收资源若某线程运行完毕,系统将自动删除线程:自动执行 rt_thread_exit() 函数,先将该线程从系统就绪队列中删除,再原创 2022-04-13 18:09:18 · 1990 阅读 · 0 评论 -
RT_Thread中的(void*)1传参
1、timeslice sample例程中传参2、说明首先,rt_thread_create创建动态线程,入口函数的传参的定义是"void * parameter",也就是说可以传任意类型的指针;而在实际调用的时候传入的是"(void*)1",等于传入了一个指向0x0000 0001的指针。再看,thread_entry中函数参数也是"void * parameter",可以传任意类型的指针,那么传(void*)1没问题;函数内,value = (rt_uint32_t)parame原创 2022-04-13 09:53:27 · 1490 阅读 · 0 评论 -
RT_Thread_PIN中断
官方资料:1、绑定引脚中断回调函数原创 2022-04-12 10:46:12 · 1053 阅读 · 0 评论 -
RT_Thread_PIN读写
官方资料:PIN设备 (rt-thread.org)1、代码下面代码是宏定义引脚,然后操作引脚输出高低电平,并读取引脚电平;(P.S.引脚是输出模式,也可以读取引脚电平的)//宏定义LED的引脚编号PF9#define LED0_PIN GET_PIN(F, 9)int main(void) { //设置LED为推挽输出 rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); while (1) { rt_p原创 2022-04-11 10:21:29 · 2283 阅读 · 0 评论 -
RT_Thread线程优先级
1、线程的优先级RT_Thread最多支持256级的优先级,越小优先级越高;工程的线程优先级的最大值,在rt_config.h中查看和配置2、线程入口函数的两种模式2.1、无限循环void thread_entry(void* paramenter){ while (1) { /* 等待事件的发生 */ /* 对事件进行服务、进行处理 */ }}2.2、单次顺序执行、有限次循环static void thread_entry(vo原创 2022-04-10 16:24:11 · 3278 阅读 · 1 评论 -
RT_Thread_线程的一些基本概念
官方资料:线程管理 (rt-thread.org)1、线程的分类系统线程:rtt系统创建的线程:main、idle空闲线程;用户线程:我们自己写的,由rt_thread_init和rt_thread_create创建的线程;2、线程的五种状态和切换注:RT-Thread 中,实际上线程并不存在运行状态,就绪状态和运行状态是等同的。3、创建线程补充一下下面创建线程时有关的宏定义,可以在rt_config.h里查看和修改;3.1、静态线程静态线程是指线..原创 2022-04-10 15:14:16 · 1223 阅读 · 0 评论 -
RT-Thread_动态内存堆
1、rt_system_heap_init初始化的起始和结束地址函数声明:rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);关于动态内存堆的起始和结束地址,我截取了重要的几行;下图中,SRAM的大小是128KB,HEAP_BEGIN是从RW和ZI段的结束开始,HEAP_END就是SRAM起始地址加上SRAM的大小;打印出HEAP_BEGIN和HEAP_END的值看看(16进制)。HEAP_BEGIN是0x200原创 2022-04-10 11:11:06 · 1720 阅读 · 0 评论 -
上电复位到RT-Thread启动过程
1、Reset_Handler上电复位,执行的第一段代码是启动文件startup_stm32f407xx.s里的汇编程序Reset_Handler;执行SystemInit; 执行__main函数,__main函数是编译器自动生成的函数; 将RW/RO段复制到运行域SRAM中,并初始化ZI段; 加载执行C语言所需要的库; 跳转到main函数; mdk有个扩展的功能,可以将main函数扩展为Sub和Super,所以首先跳转的就是$Sub$$main,至于在main.c中看到的mai原创 2022-04-03 23:26:43 · 1005 阅读 · 0 评论 -
ART-Pi_2_点灯、ulog日志输出、printf输出
1、点灯不用自己写,创建个点灯的模板就有了,例程名为“art_pi_blink_led”。主要代码如下,首先宏定义LED引脚;然后设引脚为输出模式,在循环中延时输出高低电平。#define LED_PIN GET_PIN(I, 8)int main(void){ rt_uint32_t count = 1; rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); while(count++) { rt_thread_原创 2021-06-16 18:44:21 · 454 阅读 · 0 评论 -
ART-Pi_1_开发环境,创建出厂程序的工程,编译下载
1、开发环境硬件:ART-Pi开发板开发平台:RT-Thread Studio从官网下载,安装,没有什么要注意的问题。打开RT-Thread Studio,安装STM32H7的库和ART-Pi开发板的资源包,如图。2、创建出厂工程别人给的板子,上电运行配网不成功,应该是被烧过其他程序,所以恢复下出厂程序。文件→新建→RT-Thread项目,圈出来的是要选的地方。点击“完成”,出厂程序就创建好了。3、编译、下载如图,直接点击编译,然后下载。下载完成后,再用微信小程序配网就成功原创 2021-06-16 15:50:48 · 589 阅读 · 1 评论