Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
2024-RSOC
【2024-RSOC】多线程学习分享
发布于 2024-07-24 00:27:35 浏览:356
订阅该版
[tocm] # 多线程学习记录 ## RT-Thread 启动流程 ![07rtt启动流程示意图.PNG](https://oss-club.rt-thread.org/uploads/20240723/51a0fff5431226dfdca1cfe761f8b2d2.png.webp) ## 多线程入门 三种实时操作系统的功能对比 ![06三种RTOS对比.PNG](https://oss-club.rt-thread.org/uploads/20240723/d4ffe8e88e656cc30b6d6b18b2bdccbd.png.webp) ### 线程的三大属性 1、线程栈 线程栈保存有当前任务的上下文,当进行线程切换时,会将当前线程的上下文存在栈中,当线程要恢复运行时,再从栈中读取上下文信息从而恢复现场。 线程栈中还保存自己任务函数的局部变量。Cortex M架构的线程栈如下图所示。 ![09Cortex-M架构的线程栈.PNG](https://oss-club.rt-thread.org/uploads/20240724/187005a319452b5676f1c8db41171720.png.webp) 2、线程控制块TCB 在RT-Thread中,线程控制块是操作系统用于管理线程的一个数据结构。它会存放线 程的一些信息,例如优先级、线程名称、线程状态等,也包含线程与线程之间连接用的链表结构, 线程等待事件集合等。 ![08TCB.PNG](https://oss-club.rt-thread.org/uploads/20240724/c1692a544232288995c9394a18abdf9e.png.webp) 线程控制块由结构体 struct rt_thread 定义并形成线程内核对象, 再链接到内核对象容器中进行管理。 ![10rt_thread结构体.PNG](https://oss-club.rt-thread.org/uploads/20240724/baa205f9ce5d1a4cfe4d13d1dfe08540.png) 3、任务函数/入口函数 函数原型: void (*entry)(void* parameter) 函数要求: 要有让出 CPU 的动作 (例如 rt_thread_mdelay() ) ### 线程状态及切换 五大状态:初始态,就绪态,运行态,挂起态,关闭态 ![11线程状态的切换.PNG](https://oss-club.rt-thread.org/uploads/20240724/ebb1227cefde0f5f7b8262c6cf33855e.png.webp) ### 线程相关API函数 详见rt-thread内核编程手册 ![12线程相关函数.PNG](https://oss-club.rt-thread.org/uploads/20240724/5e136069990d19f70e9f68ee35de79a2.png) ## 嵌入式开发经验 ### 软件开发管理 1、Git的使用 我比较喜欢使用git bash,直接使用命令行。 git clone github仓库网址 git status 对比本地和远端仓库的文件,有没有更新 git add .将本地文件暂存 git commit -m "说明更新的内容" git push 将暂存的文件推送到云端仓库 2、MarkDown文件的编写 ### 引入CI/CD CI/CD是持续集成(Continuous Integration,CI)和持续部署/持续交付(Continuous Deployment/Delivery,CD)的简称。持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽快地发现集成错误。 作为持续交付的延伸,持续部署可以自动将应用发布到生产环境。这意味着开发人员对应用的更改在编写后的几分钟内就能生效(假设它通过了自动化测试),从而便于持续接收和整合用户反馈。 ### 自动化测试 1、uTest的使用-这部分有待学习 2、嵌入式系统开发的常见问题 栈内存写穿 栈内存溢出 ## 分析RT-Thread源码 ## 课后作业说明 1. 系统设计 基于stm32F407ZGT6的LED和串口模块,编写两个用户线程,thread1(优先级25)的任务:LED_R的闪烁,thread2(优先级24-较高优先级)的任务:通过串口打印从0到1.高优先级抢占CPU,thread2结束后才能执行thread1. ![05led原理图.PNG](https://oss-club.rt-thread.org/uploads/20240723/f53c42dd9b1e5ce7c1d406a95f770a40.png) 2. 程序设计 线程1的入口函数 ```c static void thread1_entry(void *parameter) { //rt_uint32_t count = 0; rt_pin_mode(GPIO_LED_B, PIN_MODE_OUTPUT); while (1) { /* 线程1采用低优先级运行,闪烁led */ rt_pin_write(GPIO_LED_B, PIN_LOW); rt_thread_mdelay(500); rt_pin_write(GPIO_LED_B, PIN_HIGH); rt_thread_mdelay(500); } } ``` 动态创建thread1 ```c /* 创建线程1,名称是thread1,入口是thread1_entry */ tid1 = rt_thread_create("thread1", thread1_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); /* 如果获得线程控制块,启动这个线程 */ if (tid1 != RT_NULL) rt_thread_startup(tid1); ``` 线程2的入口函数 ```c static void thread2_entry(void *param) { rt_uint32_t count = 0; /* 线程2拥有较高的优先级*/ for (count = 0; count < 2000 ; count++) { rt_kprintf("thread2 count: %d\n", count); } rt_kprintf("thread2 exit\n"); /* 线程2运行结束后也将自动被系统脱离 */ } ``` 静态创建thread2,启动thread2 ```c rt_thread_init(&thread2, "thread2", thread2_entry, RT_NULL, &thread2_stack[0], sizeof(thread2_stack), THREAD_PRIORITY - 1, THREAD_TIMESLICE); /* 启动线程2 */ rt_thread_startup(&thread2); ``` 3. 运行现象 MobaXTerm串口界面依次打印0到2000,之后LED_B开始闪烁 ![03运行后串口-打印结束后亮灯.PNG](https://oss-club.rt-thread.org/uploads/20240723/92a1b19f4bbb0e7c2a296e1546899d2c.png.webp) ![00led闪烁.jpg](https://oss-club.rt-thread.org/uploads/20240723/cd8b3bde3906a5f93f0e42aaf53383b6.jpg.webp)
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
RTTsum_Cloud
这家伙很懒,什么也没写!
文章
2
回答
0
被采纳
0
关注TA
发私信
相关文章
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部