动态创建在堆中分配空间,静态创建在栈中分配空间.
系统最小执行时间为一个节拍.
系统最小执行单位是线程.
1.修改系统时钟
//drivers/board.h中其中单位为MHz#define BSP_CLOCK_SOURCE("HSE")//HSI:内部时钟源 HSE:外部时钟源
#define BSP_CLOCK_SOURCE_FREQ_MHZ((int32_t)8)//外部时钟参数:默认0,根据晶振设置
#define BSP_CLOCK_SYSTEM_FREQ_MHZ((int32_t)100)//主频
2.内核启动 系统启动文件:
./libraries/CMSIS/Device/ST/STM32xxxx/Source/Templates/gcc/startup_stm32xxxx.S
启动流程:startup_xx.S --> entry() --> rtthread_startup() -->系统初始化 --> 创建线程 -->线程调度。
3.线程的五种状态 初始态(RT_THREAD_INIT)、就绪态(RT_THREAD_READY)、运行态(RT_THREAD_RUNNING)、挂起态(RT_THREAD_SUSPEND)、关闭态(RT_THREAD_CLOSE)。
4.线程状态间切换
文章图片
5.线程常用函数(线程分配的空间 一定要大于线程函数所使用的内存)
rt_thread_create()//创建动态线程
rt_thread_init()//创建静态线程rt_thread_startup()//开启线程
rt_thread_delete()//删除动态线程释放内存
rt_thread_detach()//释放静态线程内存
rt_thread_yield()//让出处理器资源
rt_thread_control()//控制函数可修改:优先级、开关线程、绑定CPUrt_thread_sleep()//睡眠--节拍数
rt_thread_delay()//延时--节拍数
rt_thread_mdelay()//延时--毫秒rt_thread_self()//返回调用当前程序的线程句柄
rt_schdduler_sethook()//查看线程调度关系rt_tick_get()//获取当前系统时钟节拍
6.一些常用的宏定义
1.底层驱动配置:./rt_thread/components/drivers/include/driverseg:serial.h中可以修改串口波特率等参数。7.定时器使用
2.系统节拍设置:rtconfig.hRT_TICK_PER_SECOND 1000eg:这里设置为1000则标识一个系统节拍时间为1/1000秒,即一个系统节拍时长为1ms。
3.
rt_timer_create()//创建定时器
rt_timer_delete()//删除定时器rt_timer_start()//开启定时器
rt_timer_stop()//关闭定时器rt_timer_detach()//静态定时器不再使用时使用rt_timer_control()//定时器 设置定时时间、
//获取定时时间、
//触发方式(单次、循环)、
//读取定时器状态。rt_hw_us_delay()//高精度延时
8.线程间同步 临界区:多个执行单元都会执行到的代码区域.
竟态:多个执行单元同时执行临界区会产生竟态.
9.信号量使用(每次获取信号量都要记得释放信号量)
rt_sem_create()//创建动态信号量//名字小于8个字符
rt_sem_delete()//删除动态信号量rt_sem_init()//创建静态信号量
rt_sem_detach()//脱离静态信号量内存rt_sem_trytake()//尝试获取 等同于take的RT_WAITING_NO
rt_sem_take()//获取信号量 ==> value--
#define RT_WAITING_FOREVER持续等待
#define RT_WAITING_NO不等待rt_sem_release()//释放信号量 ==> value++
10.互斥量(信号量可由不同线程释放,互斥量只能由同一线程释放)
rt_mutex_create()//创建动态互斥量
rt_mutes_delete()//删除动态互斥量rt_mutex_init()//创建静态互斥量
rt_mutex_detach()//释放静态互斥量内存rt_mutex_take()//获取互斥量获取和释放互斥量都有同一个线程完成操作
rt_mutex_release()//释放互斥量
11.事件集 事件只与线程相关,时间间相互独立、事件仅用于同步不提供数据传输、事件无排队性。
由32位无符号数的位控制。
recv接收事件 执行完之后,send发送下一个事件。
rt_event_create()//创建动态事件集
rt_event_delete()//删除动态事件集 释放内存rt_event_init()//初始化静态事件集
rt_event_detach()//脱离静态事件集rt_event_send()//向事件集发送事件,唤醒对应的挂起的线程
rt_event_recv()//从事件集中接收事件
12.IO设备
设备类型:
rt_device_class_char,字符设备
rt_device_class_clock,块设备
rt_device_class_netlf,网络设备
rt_device_class_MTD,存储设备
rt_device_class_CAN,CAN设备
rt_device_class_RTC,RTC设备
rt_device_class_sound,音频设备
rt_device_class_graphic,图形化设备
rt_device_class_I2CBUS,I2C总线设备
rt_device_class_USBDevice,USB从机设备
rt_device_class_USBHost,USB主机设备
【rtt|RT-thread笔记】rt_device_class_SPIBUS,SPI设备
rt_device_class_SPIDevice,SPI从机设备
rt_device_class_SDIO,SDIO总线设备
rt_device_class_Timer定时器设备
rt_device_class_miscellaneous杂项
rt_device_class_sensor,传感器设备
rt_device_class_touch触控设备
rt_device_clase_unknown其他设备
rt_device_create()//创建动态设备
rt_device_destroy()//销毁设备rt_device_ops()//操作方法集合rt_device_register()//注册设备
rt_device_unregister()//注销设备 并不会释放内存,需要destroy 来释放内存常用访问设备函数:
rt_device_find()//查找设备
rt_device_open()//打开i设备
rt_device_read()//读取数据
rt_device_write()//写入数据
rt_device_control()//控制设备
rt_device_set_rx_indicate()//接收回调函数
rt_device_set_tx_complete()//发送回调函数
rt_device_close()//关闭设备具体操作:
rt_device_init()
rt_device_open()
rt_device_close()
rt_device_read()
rt_device_write()
rt_device_control()
13.串口配置
配置串口时,用rt_device_control(name,cmd,arg)14.注意事项 1.注意在rtt的i2c中系统没有将从机地址左移1位,故需要手动左移一位。
name通过find获取的串口句柄
cmdRT_DEVICE_CTRL_CONFIG;
arg是一个serial_configure类型的结构体 ,系统默认是:RT_SERIAL_CONFIG_DEFAULT
如果要开启DMA
注意在board.h中宏定义 BSP_UART1_RX_USING_DMA。
如:从机地址是0x40,在定义rt_i2c_msg 的add时,add = 0x40 >> 1;
推荐阅读
- 数据结构|LeetCode每日一刷 --- 手撕单链表习题(2)
- 计算机考研|C语言——从字符串中统计单词的频数
- C语言|C语言实现——字符串逆序
- c语言|c语言————字符串的逆序旋转
- C语言小白进阶之路|C语言——字符、字符串的输入输出
- C语言|C语言——字符串旋转问题
- c语言|C语言——字符串分类统计
- 字符串|C语言——字符串学习笔记(2)
- 字符串操作|c语言——字符串右移