Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
15天入门rt-thread学习笔记-第二天(系统启动代码和用户入口)
发布于 2018-05-18 15:40:58 浏览:2184
订阅该版
* 本帖最后由 coolbor 于 2018-5-26 13:29 编辑 * 通过led跑马灯代码,学习了解到以下内容: 1、线程的创建、启动 2、线程的状态主要有:运行态、就绪态和挂起态等。经查资料,线程状态还有初始状态和结束态。 几种状态间的转换关系如线程转换图所示: ![secondlesson.jpg](/uploads/201805/18/153953j3pcc3cupgs6c8so.jpg) 线程通过调用函数rt_thread_create/init进入到初始状态(RT_THREAD_INIT);再通过调用函数rt_thread_startup进入到就绪状态(RT_THREAD_READY);当处于就绪状态的线程调用rt_thread_delay, rt_sem_take,rt_mb_recv等函数或由于获取不到资源时,将进入到挂起状态(RT_THREAD_SUSPEND);处于挂起状态的线程,如果等待超时依然未能获得资源或由于其他线程释放了资源,那么它将返回到就绪状态。 挂起状态的线程,如果调用rt_thread_delete/detach将更改为关闭状态(RT_THREAD_CLOSE);而运行状态的线程,如果运行结束会在线程最后部分执行rt_thread_exit函数而更改为关闭状态(RT_THREAD_CLOSE)。 3、空闲线程只有在没有其他线程运行时才运行。 -------------------------------------------------------------------------------------------------------------- 作业一:使用裸机驱动方式修改跑马灯中的LED控制部分 //软件延时方式 int main(void) { led_init();//led初始化 while (1) { led_on();//点亮led delay_ms(500);//延时500ms led_off();//熄灭led delay_ms(500);//延时500ms } } volatile uint8_t time_500ms_cnt = 0; volatile uint8_t time_500ms_ok = 0; //定时器中断,10ms中断1次 void timer_interrupt(void) { if(++time_500ms_cnt >= 50)//500ms计数 { time_500ms_cnt = 0; time_500ms_ok = 1;//设置500ms标志 } } //定时器中断方式 int main(void) { timer_interrupt_init(); led_init(); while (1) { if(time_500ms_ok)//500ms时间到 { time_500ms_ok = 0;//清除500ms标志 led_toggle();//转换LED状态 } } } 裸机程序中我更喜欢用定时器中断方式,因为不会像软件延时那样无谓的消耗CPU时间。尤其是按键不会有响应延迟现象,LED显示器类不会有显示闪烁等现象。 作业二:了解线程控制块结构体struct rt_thread; 线程控制块是操作系统用于控制线程的一个数据结构,它会存放线程的一些信息,例如优先级,线程名称等,也包含线程与线程之间连接用的链表结构,线程等待事件集合等。在RT-Thread实时操作系统中,线程控制块由结构体struct rt_thread表示。 线程控制块结构体struct rt_thread包含了以下内容: 1、rt对象(包含线程)相关的内容:对象名称(字符串)、对象类型和线程标志、对象链表和线程链表 2、堆栈相关内容:堆栈指针、线程入口地址、参数、堆栈地址和堆栈大小、线程错误号、线程状态 3、优先级相关内容:当前优先级、初始线程优先级 4、事件相关内容:事件集合和事件信息 5、其他相关内容:线程初始节拍(嘀哒)、线程当次运行剩余节拍(嘀哒)、线程定时器、以及线程退出时的清理函数和用户数据 其中init_priority是线程创建时指定的线程优先级,在线程运行过程当中是不会被改变的(除非用户执行线程控制函数进行手动调整线程优先级)。 cleanup成员是RT-Thread 1.0.0中新引入的成员,它会在线程退出时,被idle线程回调一次以执行用户设置的清理现场等工作。 最后的一个成员user_data可由用户挂接一些数据信息到线程控制块中,以提供类似线程私有数据的实现,例如lwIP线程中用于放置定时器链表的表头。
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
2.2k
关于作者
coolbor
这家伙很懒,什么也没写!
提问
16
回答
3
被采纳
0
关注TA
发私信
相关问题
1
请教cpu使用率分析
2
选择FreeRTOS, 还是RT-Thread。
3
thread heap stack overflow ?
4
rtt消息队列delay问题
5
释放被删除线程的内存地方在哪里啊
6
请教:各线程结束后,释放其中的内存的连续性问题
7
STM32F103中断关于信号量、邮箱问题
8
RTT中的线程栈大小如何控制
9
关于线程由执行态变为挂起态的代码实现,,,
10
rt_malloc(rt_size_t size)内存分配函数最小分配尺寸问题
推荐文章
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组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部