动态创建在堆中分配空间,静态创建在栈中分配空间.
系统最小执行时间为一个节拍.
系统最小执行单位是线程.
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() //控制函数可修改:优先级、开关线程、绑定CPU
rt_thread_sleep() //睡眠--节拍数
rt_thread_delay() //延时--节拍数
rt_thread_mdelay() //延时--毫秒
rt_thread_self() //返回调用当前程序的线程句柄
rt_schdduler_sethook() //查看线程调度关系
rt_tick_get() //获取当前系统时钟节拍
?6.一些常用的宏定义
1.底层驱动配置:./rt_thread/components/drivers/include/drivers? ? ?????????????????eg:serial.h中可以修改串口波特率等参数。
2.系统节拍设置:rtconfig.h? ?RT_TICK_PER_SECOND 1000? ? ?eg:这里设置为1000则标识一个系统节拍时间为1/1000秒,即一个系统节拍时长为1ms。
3.
?7.定时器使用
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主机设备
????????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)
name????????通过find获取的串口句柄
cmd????????RT_DEVICE_CTRL_CONFIG;
arg? ? ? ? 是一个serial_configure类型的结构体 ,系统默认是:RT_SERIAL_CONFIG_DEFAULT
如果要开启DMA
注意在board.h中宏定义?BSP_UART1_RX_USING_DMA。
?
|