Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
多线程
2024-RSOC
[2024-RSOC]夏令营Day2的日记
发布于 2024-07-23 21:28:35 浏览:574
订阅该版
[tocm] # **【2024-RSOC】夏令营Day2:初识rt-thread及多线程简单试用]** **【2024-RSOC】** 基于RT-Thread官方开发板星火一号 ![0.png](https://oss-club.rt-thread.org/uploads/20240723/f54250dee4f4760af66a43dbc51e0813.png.webp) 我们从配置好env后的步骤开始操作。 ## clone工程到workspace ![1.png](https://oss-club.rt-thread.org/uploads/20240723/0d61a46de6230e93d1e1f0562d37d3cc.png.webp) ## 初次搞机(干通官方bsp源码) 我就默认你env配置好了,反正我是翻不了墙叫队友打了个懒人包给我。环境变量自己给工具包的添加进去,我就不放了。 在文件根目录下,我们使用env输入`scons --target=vsc`建立vscode工程,并用`code .`![4.png](https://oss-club.rt-thread.org/uploads/20240723/8cffe695a845da0e9f56cf0a2336920c.png) >如果要使用MDK5打开工程,这个spark的bsp没给`mklinks.bat`这玩意,我也没时间试了,晚上九点浇作业,急急急急急。![急急急急急]![2.jpg](https://oss-club.rt-thread.org/uploads/20240723/13d4890b24006842d5262ee80ce3a0af.jpg) 不出意外的话就出意外了,这个`launch.json`得自己稍做加工。 ![3.png](https://oss-club.rt-thread.org/uploads/20240723/a80c6d331773b4216f45cf28188e14a6.png) 添加如下代码到`launch.json`。 ``` { // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "rt-spark-openocd", "executable": "${workspaceRoot}/rt-thread.elf", "request": "launch", "type": "cortex-debug", "runToEntryPoint": "main", "targetId": "STM32F407ZG", "servertype": "openocd", "configFiles": [ "interface/stlink-v2.cfg", "target/stm32f4x.cfg" ], "armToolchainPath": "C:/Users/27153/Desktop/rtt/env-windows/tools/gnu_gcc/arm_gcc/mingw/bin", // !!!需要修改为自己的GCC 工具链路径 !!! "gdbPath": "C:/Users/27153/Desktop/rtt/env-windows/tools/gnu_gcc/arm_gcc/mingw/bin/arm-none-eabi-gdb.exe" // !!!需要修改为自己的GDB 路径 !!! } ] } ``` ![5.png](https://oss-club.rt-thread.org/uploads/20240723/8b97a6fa7d317dcdb4689973056b69fd.png.webp) 打开终端,输入`scons -j12`进行编译,结果如图,成功。 ![6.png](https://oss-club.rt-thread.org/uploads/20240723/8b96c1977f3566990725689f0c693689.png.webp) 按F5进行烧写调试,结果如图 ![7.png](https://oss-club.rt-thread.org/uploads/20240723/c2b16bc120203d0e7222d3ec1e713a57.png.webp) 小红灯闪烁。至此,例程完毕。 ## 小试牛刀(hello world) 先来个`hello world`开开胃 新建文件夹`hello`并新建`hello.c`和`hello.h`,代码如下: hello.c: ``` #include "hello.h" void Print_Hello_World(void) { rt_kprintf("hello world\n"); } ``` hello.h: ``` #ifndef __HELLO_H__ #define __HELLO_H__ #include
void Print_Hello_World(void); #endif ``` 文件目录如图: ![8.png](https://oss-club.rt-thread.org/uploads/20240723/8e978b0dd83fc9c786edc98f46837659.png) 输入`scons -j12`编译。 不出意外的话又出意外了。所以我们添加一个SConscript让vscode能找到我们写的hello.c。代码如下: ``` from building import * import os cwd = GetCurrentDir() CPPPATH = [cwd] src = ['hello.c'] group = DefineGroup('Hello_Test', src, depend = [''], CPPPATH = CPPPATH) Return('group') ``` 输入`scons -j12`编译,过辣,爆爽无需多言! ![9.png](https://oss-club.rt-thread.org/uploads/20240723/e83db9c2213142bfa1ad23687935baee.png.webp) ![10.png](https://oss-club.rt-thread.org/uploads/20240723/9251bb551bcd8a39968a61830a644d8d.png.webp) ## 多线程 基础知识自己去官方文档看去 >[县城的工作机制](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/thread/thread ) 我们用例子中的代码,创建一个动态线程初始化一个静态线程,一个线程在运行完毕后自动被系统删除,另一个线程一直打印计数,如下代码: ``` #include
#define THREAD_PRIORITY 25 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 5 static rt_thread_t tid1 = RT_NULL; /* 线程 1 的入口函数 */ static void thread1_entry(void *parameter) { rt_uint32_t count = 0; while (1) { /* 线程 1 采用低优先级运行,一直打印计数值 */ rt_kprintf("thread1 count: %d\n", count ++); rt_thread_mdelay(500); } } rt_align(RT_ALIGN_SIZE) static char thread2_stack[1024]; static struct rt_thread thread2; /* 线程 2 入口 */ static void thread2_entry(void *param) { rt_uint32_t count = 0; /* 线程 2 拥有较高的优先级,以抢占线程 1 而获得执行 */ for (count = 0; count < 10 ; count++) { /* 线程 2 打印计数值 */ rt_kprintf("thread2 count: %d\n", count); } rt_kprintf("thread2 exit\n"); /* 线程 2 运行结束后也将自动被系统脱离 */ } /* 线程示例 */ int thread_sample(void) { /* 创建线程 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,名称是 thread2,入口是 thread2_entry */ rt_thread_init(&thread2, "thread2", thread2_entry, RT_NULL, &thread2_stack[0], sizeof(thread2_stack), THREAD_PRIORITY - 1, THREAD_TIMESLICE); rt_thread_startup(&thread2); return 0; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(thread_sample, thread sample); ``` 该代码的效果是,线程 2 计数到一定值会执行完毕,线程 2 被系统自动删除,计数停止。线程 1 一直打印计数。 演示结果如图: ![11.png](https://oss-club.rt-thread.org/uploads/20240723/04e7f064a35181f19036b44cdcc8fb78.png.webp) 当然多线程示例代码还有俩,我就不在这里演示了。你也可以给他塞50个县城,主打一个闹着玩。 编译完能够正常运行,就该做点有意思的了,点个灯吧。 我们打开原理图看一下灯带的原理。灯带使用的方案是SK6805,如图示它的原理图。 ![12.png](https://oss-club.rt-thread.org/uploads/20240723/d4a484aae6742b295207609df6a9bb3b.png.webp) 单颗灯珠定义如下图 ![13.png](https://oss-club.rt-thread.org/uploads/20240723/45738c6230ab254466bb1cba2be6a3b6.png.webp) 详细阅读规格书我们可以发现,这个灯珠是给显示器用的,就那种街头大彩屏,舞台背景屏幕之类的,没时间研究了,所以我的建议是润,不写了。 ------- ## 你以为这就完了 自己写不了难道还不能抄作业吗?今天高低得点个灯玩。 我们打开刚才的代码,在线程1和线程2中直接添加LED的控制代码。 ``` rt_pin_write(GPIO_LED_R, PIN_HIGH); rt_thread_mdelay(100); rt_pin_write(GPIO_LED_R, PIN_LOW); rt_thread_mdelay(100); rt_pin_write(GPIO_LED_B, PIN_HIGH); rt_thread_mdelay(100); rt_pin_write(GPIO_LED_B, PIN_LOW); rt_thread_mdelay(100); ``` 记得加上gpio对应的头文件,在msh中启用thread_sample,即可观察到那颗可怜的小LED随着计数的进行在闪。 ![14.jpg](https://oss-club.rt-thread.org/uploads/20240723/b4e86664c517a9515023dc274d45b2d7.jpg.webp)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
河南理工大学恁带劲儿
俺是计算机协会硬件部嘞
文章
5
回答
0
被采纳
0
关注TA
发私信
相关文章
1
大家有没有遇到过多线程使用同一个串口发送数据,数据是交叉的
2
workqueue中调用rt_i2c_transfer互斥锁线程bug
3
micropython和本地线程的通信
4
大神们,我发现一个问题,RTT这个系统是不是没有查看其他线程状态的函数?
5
不知道该如何使用线程?
6
线程错误怎么判断哪里的问题(其他线程都ok)
7
rt_kprintf 多线程使用问题
8
线程优先级被中断影响
9
挂载在操作系统上的文件系统操作,需要用互斥锁防止多线程操作问题吗?
10
socket多线程操作转为单线程处理,断开连接检测代码展示
推荐文章
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
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
20
个答案
2
次被采纳
张世争
11
个答案
2
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部