Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
2024-RSOC
【2024-RSOC】多线程学习分享
发布于 2024-07-24 00:27:35 浏览:606
订阅该版
[tocm] # 多线程学习记录 ## RT-Thread 启动流程  ## 多线程入门 三种实时操作系统的功能对比  ### 线程的三大属性 1、线程栈 线程栈保存有当前任务的上下文,当进行线程切换时,会将当前线程的上下文存在栈中,当线程要恢复运行时,再从栈中读取上下文信息从而恢复现场。 线程栈中还保存自己任务函数的局部变量。Cortex M架构的线程栈如下图所示。  2、线程控制块TCB 在RT-Thread中,线程控制块是操作系统用于管理线程的一个数据结构。它会存放线 程的一些信息,例如优先级、线程名称、线程状态等,也包含线程与线程之间连接用的链表结构, 线程等待事件集合等。  线程控制块由结构体 struct rt_thread 定义并形成线程内核对象, 再链接到内核对象容器中进行管理。  3、任务函数/入口函数 函数原型: void (*entry)(void* parameter) 函数要求: 要有让出 CPU 的动作 (例如 rt_thread_mdelay() ) ### 线程状态及切换 五大状态:初始态,就绪态,运行态,挂起态,关闭态  ### 线程相关API函数 详见rt-thread内核编程手册  ## 嵌入式开发经验 ### 软件开发管理 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.  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开始闪烁  
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
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
FAL
RTC
rt-smart
I2C_IIC
cubemx
UART
ESP8266
WIZnet_W5500
BSP
ota在线升级
PWM
flash
packages_软件包
freemodbus
潘多拉开发板_Pandora
ADC
GD32
定时器
编译报错
flashDB
keil_MDK
socket
中断
rt_mq_消息队列_msg_queue
Debug
ulog
SFUD
msh
C++_cpp
at_device
本月问答贡献
出出啊
1524
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
821
个答案
179
次被采纳
crystal266
555
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部