动态创建在堆中分配空间,静态创建在栈中分配空间.
系统最小执行时间为一个节拍.
系统最小执行单位是线程.
//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) //主频
系统启动文件:
./libraries/CMSIS/Device/ST/STM32xxxx/Source/Templates/gcc/startup_stm32xxxx.S
启动流程:startup_xx.S --> entry() --> rtthread_startup() -->系统初始化 --> 创建线程 -->线程调度。
初始态(RT_THREAD_INIT)、就绪态(RT_THREAD_READY)、运行态(RT_THREAD_RUNNING)、挂起态(RT_THREAD_SUSPEND)、关闭态(RT_THREAD_CLOSE)。
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() //获取当前系统时钟节拍
1.底层驱动配置:./rt_thread/components/drivers/include/drivers eg:serial.h中可以修改串口波特率等参数。
2.系统节拍设置:rtconfig.h RT_TICK_PER_SECOND 1000 eg:这里设置为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() //高精度延时
临界区:多个执行单元都会执行到的代码区域.
竟态:多个执行单元同时执行临界区会产生竟态.
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++
rt_mutex_create() //创建动态互斥量
rt_mutes_delete() //删除动态互斥量
rt_mutex_init() //创建静态互斥量
rt_mutex_detach() //释放静态互斥量内存
rt_mutex_take() //获取互斥量 获取和释放互斥量都有同一个线程完成操作
rt_mutex_release() //释放互斥量
事件只与线程相关,时间间相互独立、事件仅用于同步不提供数据传输、事件无排队性。
由32位无符号数的位控制。
recv接收事件 执行完之后,send发送下一个事件。
rt_event_create() //创建动态事件集
rt_event_delete() //删除动态事件集 释放内存
rt_event_init() //初始化静态事件集
rt_event_detach() //脱离静态事件集
rt_event_send() //向事件集发送事件,唤醒对应的挂起的线程
rt_event_recv() //从事件集中接收事件
设备类型:
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()
配置串口时,用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。
1.注意在rtt的i2c中系统没有将从机地址左移1位,故需要手动左移一位。
如:从机地址是0x40,在定义rt_i2c_msg 的add时,add = 0x40 >> 1;