RT-thread笔记

动态创建在堆中分配空间,静态创建在栈中分配空间.

系统最小执行时间为一个节拍.

系统最小执行单位是线程.

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。

14.注意事项

1.注意在rtt的i2c中系统没有将从机地址左移1位,故需要手动左移一位。

        如:从机地址是0x40,在定义rt_i2c_msg 的add时,add = 0x40 >> 1;  

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值