IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> RT-thread笔记 -> 正文阅读

[嵌入式]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。

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:38:44  更:2021-12-24 18:40:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:59:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码