RT-Thread

修改 CubeMX 生成的 RT-Thread makefile 工程

不羁岁月 提交于 2020-04-05 17:37:59
修改 CubeMX 生成的 RT-Thread makefile 工程 使用 RT-Thread 官方 基于 CubeMX 移植 RT-Thread Nano 生成的 Makefile 工程在编译时有错误,需要简单修改一下。 添加 context_gcc.s 文件。需要在 Makefile 中添加这个 .s 文件,在 CubeMX 生成的工程中可以找到它,如果你找到的文件拓展名为大写的 .S 请把它改成小写 .s , 在汇编中大小写是不一样的。 # ASM sources ASM_SOURCES = \ startup_stm32f103xb.s \ Middlewares/Third_Party/RealThread_RTOS_RT-Thread/libcpu/arm/cortex-m3/context_gcc.s 修改启动文件(修改 startup_stm32f103xb.s),将 bl main 改为 bl entry . /* Call the application's entry point.*/ bl entry bx lr .size Reset_Handler, .-Reset_Handler 修改完编译应该就没问题了,但是可能会有警告,我这里提示 obj 定义了但是没有使用,不用理它 来源: https://www.cnblogs.com/Luad/p

RT-Thread Studio 使用笔记(七)| 配合STM32CubeMX添加裸机驱动(以ADC为例)

孤者浪人 提交于 2020-03-05 22:12:22
1. 配置STM32CubeMX 2. 复制stm32xxxx_hal_msp.c文件 将 CubeMx 生成的代码 stm32f7xx_hal_msp.c 函数复制到 RT-Thread Studio 生成的工程中,并参与工程编译: 由于我们并没有使用 CubeMx 生成的工程,所以这里需要将 stm32f7xx_hal_msp.c 文件中 #include “main.h” 替换为 #include “board.h”。 3. 修改stm32f7xx_hal_conf.h文件 4. 使用外设 上述文件配置完成之后,ADC 外设就可以使用的,在 main.c 中添加外设的使用代码: /* * Copyright (c) 2006-2020, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2020-03-05 Mculover666 the first version */ # include <rtthread.h> # include "board.h" ADC_HandleTypeDef hadc1 ; /* ADC1 init function */ void MX_ADC1_Init ( void ) { /

RT-Thread之mqttclient软件包

放肆的年华 提交于 2020-02-28 20:35:43
关于mqttclient软件包 一个基于socket API之上的跨平台MQTT客户端 基于socket API的MQTT客户端,拥有非常简洁的API接口,以极少的资源实现QOS2的服务质量,并且无缝衔接了mbedtls加密库。此仓库是专门为RT-Thread做的软件包,原始仓库位于: https://github.com/jiejieTop/mqttclient 优势: 基于标准BSD socket之上开发 ,只要是兼容BSD socket的系统均可使用。 稳定 :无论是 掉线重连 , 丢包重发 ,都是严格 遵循MQTT协议标准 执行,除此之外对 大数据量 的测试无论是收是发,都是非常稳定(一次发送 135K 数据,3秒一次),高频测试也是非常稳定(7个主题同时收发,每秒一次,也就是1秒14个mqtt报文,服务质量QoS0、QoS1、QoS2都有)。因为作者以极少的资源设计了 记录机制 ,对采用QoS1服务质量的报文必须保证到达一次,对QoS2服务质量的报文有且只有收到一次(如果不相信它稳定性的同学可以自己去修改源码,专门为QoS2服务质量去测试,故意不回复 PUBREC ,让服务器重发QoS2报文,看看客户端是否有且只有处理一次),而对于掉线重连的稳定性,则是 基本操作 了,没啥好说的,因此在测试中稳定性极好。 轻量级 :整个代码工程极其简单,不使用mbedtls情况下

RT-Thread--线程间通信

不羁的心 提交于 2020-02-13 00:21:57
线程中通信 在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取,根据读取到的全局变量值执行相应的动作,达到通信协作的目的; 邮箱 邮箱服务是实时操作系统中一种典型的线程间通信方法。举一个简单的例子,有两个线程,线程 1 检测按键状态并发送,线程 2 读取按键状态并根据按键的状态相应地改变 LED 的亮灭。这里就可以使用邮箱的方式进行通信,线程 1 将按键的状态作为邮件发送到邮箱,线程 2 在邮箱中读取邮件获得按键状态并对 LED 执行亮灭操作。 邮箱的工作机制 RT-Thread 操作系统的邮箱用于线程间通信,特点是开销比较低,效率较高; 邮箱中的每一封邮件只能容纳固定的 4 字节内容(针对 32 位处理系统,指针的大小即为 4 个字节,所以一封邮件恰好能够容纳一个指针)。典型的邮箱也称作交换消息,如下图所示,线程或中断服务例程把一封 4 字节长度的邮件发送到邮箱中,而一个或多个线程可以从邮箱中接收这些邮件并进行处理。 非阻塞方式的邮件发送过程能够安全的应用于中断服务中,是线程、中断服务、定时器向线程发送消息的有效手段。 通常来说,邮件收取过程可能是阻塞的,这取决于邮箱中是否有邮件,以及收取邮件时设置的超时时间。当邮箱中不存在邮件且超时时间不为 0 时,邮件收取过程将变成阻塞方式。在这类情况下

RT-thread内核之进程间通信

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-13 00:09:28
这里面见到的同步和互斥的概念非常清晰,转载自: http://www.cnblogs.com/King-Gentleman/p/4311582.html 一、进程间通信机制 rt-thread操作系统的IPC(Inter-Process Communication,进程间同步与通信)包含有中断锁、调度器锁、信号量、互斥锁、事件、邮箱、消息队列。其中前5个主要表现为线程间同步,邮箱与消息队列表现为线程间通信。本文主要介绍它们的一些特性及使用场合。 1、中断锁 关闭中断也叫中断锁,是禁止多任务访问临界区最简单的一种方式,即使是在分时操作系统中也是如此。当中断关闭的时候,就意味着当前任务不会被其他事件打断(因为整个系统已经不再响应那些可以触发线程重新调度的外部事件),也就是当前线程不会被抢占,除非这个任务主动放弃了处理器控制权。关闭中断/恢复中断API接口由BSP实现,根据平台的不同其实现方式也大不相同。比如在stm32平台中中断锁机制通过关闭中断函数(rt_base_t rt_hw_interrupt_disable(void),这个函数用于关闭中断并返回关闭中断前的中断状态。)以及恢复中断函数(void rt_hw_interrupt_enable(rt_base_t level),恢复调用rt_hw_interrupt_disable()函数前的中断状态)实现。 警告:

RT-thread内核之小内存管理算法

一世执手 提交于 2020-02-12 22:12:27
一、动态内存管理 动态内存管理是一个真实的堆(Heap)内存管理模块,可以在当前资源满足的情况下,根据用户的需求分配任意大小的内存块。而当用户不需要再使用这些内存块时,又可以释放回堆中供其他应用分配使用。RT-Thread系统为了满足不同的需求,提供了两套不同的动态内存管理算法,分别是 小内存管理算法 和 SLAB内存管理算法 。小堆内存管理模块主要针对系统资源比较少,一般用于小于2M内存空间的系统;而SLAB内存管理模块则主要是在系统资源比较丰富时,提供了一种近似多内存池管理算法的快速算法。 两种内存管理模块在系统运行时只能选择其中之一或者完全不使用动态堆内存管理器。这两种管理模块提供的API接口完全相同。 因为动态内存管理器要满足多线程情况下的安全分配,会考虑多线程间的互斥问题,所以请不要在中断服务例程中分配或释放动态内存块。因为它可能会引起当前上下文被挂起等待。 二、小内存管理算法 本文主要介绍小内存管理算法,至于SLAB内存管理算法则在后续文章中介绍。小内存管理算法是一个简单的内存分配算法。初始时,它是一块大的内存。当需要分配内存块时,将从这个大的内存块上分割出相匹配的内存块,然后把分割出来的空闲内存块还回给堆管理系统中。每个内存块都包含一个管理用的数据头,通过这个头把使用块与空闲块用双向链表的方式链接起来,如 内存块链表图所示:

RT-thread内核之系统时钟

让人想犯罪 __ 提交于 2020-02-12 22:12:00
一、系统时钟 rt-thread的系统时钟模块采用全局变量rt_tick作为系统时钟节拍,该变量在系统时钟中断函数中不断加1。而系统时钟中断源和中断间隔一般由MCU硬件定时器(如stm32的嘀嗒定时器)决定,rt_tick初始值为0,每次MCU产生硬件定时中断后,在中断函数中不断加1,即rt_tick变量值与MCU硬件定时器定时中断间隔的乘积为系统真正运行时间(例如rt_tick=10,stm32嘀嗒定时器每隔1ms产生中断,则系统上电运行时间为10ms)。 在bsp/stm32f40x/drivers/board.c中设置MCU硬件定时器定时间隔,以及执行相应定时器中断函数: void SysTick_Configuration(void) { RCC_ClocksTypeDef rcc_clocks; rt_uint32_t cnts; RCC_GetClocksFreq(&rcc_clocks);//获得系统的晶振频率 //RT_TICK_PER_SECOND在rtconfig.h中配置,表示每秒包含的系统时钟节拍数。默认配置为100,则嘀嗒定时器中断间隔为10ms,rt_tick每隔10ms加1,即默认情况下1s内包含100个系统时钟节拍,每个时钟节拍tick表示10ms。为了提高 精度,一般修改宏定义为1000,即1s内包含1000个系统时钟节拍

基于RT-Thread系统使用 QEMU 运行 RT-Thread 提供的基于多线程的非阻塞 socket 编程

一曲冷凌霜 提交于 2020-02-03 03:58:32
多线程非阻塞网络编程 简介: 在实际开发中,往往要求网络传输时不能阻塞当前线程,以致无法及时处理其他消息。在用户无法直接套用简单的 socket demo 时,RT-Thread 提供基于多线程的非阻塞 socket 编程示例,方便用户进行应用程序开发。 在 RT-Thread 使用 socket 网络编程时,当一个任务调用 socket的 recv()函数接收数据时,如果 socket 上并没有接收到数据,这个任务将阻塞在这个 recv() 函数里。这个时候,这个任务想要处理一些其他事情,例如进行一些数据采集,发送一些额外数据到网络上等,将变得不可能了。与此同时,其他线程也需要将数据上传同一个服务器,如果直接多个线程共同使用一个 socket 操作,这将会破坏底层 lwip 的消息事件模型。 客户端使用流程: socket() 创建一个 socket,返回套接字的描述符,并为其分配系统资源。 connect() 向服务器发出连接请求。 send()/recv() 与服务器进行通信。 closesocket() 关闭 socket,回收资源。 服务器使用流程: socket() 创建一个 socket,返回套接字的描述符,并为其分配系统资源。 bind() 将套接字绑定到一个本地地址和端口上。 listen() 将套接字设为监听模式并设置监听数量,准备接收客户端请求。 accept

【rt-thread】1、快速建立rt-thread nano最小裁剪工程

拥有回忆 提交于 2020-02-01 08:29:30
快速建立rt-thread nano最小裁剪工程 使用keil5建立 1、下载rt-thread 3.03版本,3.03程序占用最小 2、使用 CubeMX 配置工程 3、选择添加rt-thread 4、编译后发现有三个函数冲突,在stm32f1xx_it.c中找到这几个函数注释 5、删除主程序中的HAL_Init、SystemClock_Config函数,这几个在别处定义过 6、由于之后用rt的堆栈这里可以把其实文件中的堆改成0,栈改成0x100,最后生成文件大小 Program Size: Code=13058 RO-data=1386 RW-data=172 ZI-data=2020 用软件包工程 如果对工程大小没有要求,可以用软件包里的板demo 官网下载软件包,打开 rt-thread\bsp\stm32\stm32f103-atk-nano 文件夹编译,最后生成文件大小 Program Size: Code=38212 RO-data=6380 RW-data=572 ZI-data=2948 来源: https://www.cnblogs.com/yywBlogW/p/11539529.html

RT-Thread Nano移植

核能气质少年 提交于 2020-02-01 08:27:53
参考:RT-Thread Nano移植 http://www.stmcu.org.cn/module/forum/thread-618970-1-1.html RT_Thread移植:在MDK下以组件形式提供 https://pan.baidu.com/s/1miac86O#list/path=%2Fsharelink4264488348-377157516700337%2F%E5%BC%80%E5%8F%91%E6%9D%BF%E4%BE%8B%E7%A8%8B%2F%E6%AD%A3%E7%82%B9%E5%8E%9F%E5%AD%90%2F%E6%AD%A3%E7%82%B9%E5%8E%9F%E5%AD%90RT-Thread%E4%BE%8B%E7%A8%8B%E5%92%8Cquickstart%E6%95%99%E7%A8%8B%2Fquick%20start%E4%BE%8B%E7%A8%8B&parentPath=%2Fsharelink4264488348-377157516700337. 通常STM32的各型号芯片,在RT-Thread上只需要在board.h中更改下不同的SRAM大小就可以把Kernel + shell跑起来 1RT-Thread Pack的安装地址 。https://www.rt-thread.org/download/mdk/ 2移植方面