- 博客(15)
- 收藏
- 关注
原创 FreeRTOS信号量
信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问假设有一个人需要在停车场停车,首先判断停车场是否还有空车位(判断信号量是否有资源);停车场正好有空车位(信号量有资源),那么就可以直接将车开入空车位进行停车(获取信号量成功);停车场已经没有空车位了(信号量没有资源),那么这个人可以选择不停车(获取信号量失败);也可以选择等待(任务阻塞)其他人将车开出停车场(释放信号量资源), 然后再将车停入空车位。空车位 :信号量资源数(计数值)让出占用车位 :释放信号量(计数值++)
2025-01-04 19:26:36
758
原创 FreeRTOS消息队列
队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递)队列类似全局变量吗?假设有一个全局变量a = 0,现有两个任务都在写这个变量a:可以看到,全局变量的弊端:数据无保护,导致数据不安全,当多个任务同时对该变量操作时,数据易受损,那应该咋办?那就是使用队列。简介:队列是一种任务到任务、任务到中断、中断到任务数据交流的一种机制。在队列中可以存储数量有限、大小固定的多个数据,队列中的每一个数据叫做队列项目,队列能够存储队列项。
2024-11-21 16:53:14
924
原创 FreeRTOS 任务切换
在前面的章节中,介绍了 FreeRTOS中任务创建、删除、挂起和恢复等几个基础API函数的使用方法,并且讲解了FreeRTOS中极为重要的列表和列表项。本章将讲解FreeRTOS系统启动到第一个任务开始运行的一整个流程,也就是FreeRTOS系统的启动流程。一、FreeRTOS开启任务调度器1.函数之前写代码都是在freertos_demo()中使用FreeRTOS的任务创建API 函数创建start_task任务后,再调用函数函数如下:....
2024-11-10 21:24:33
908
原创 FreeRTOS的列表和列表项
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考初始化列表vListInitialise();初始化列表项vListInitialiseItem();列表末尾插入列表项vListInsertEnd();列表插入列表项vListInsert();列表移除列表项uxListRemove();
2024-11-06 14:36:16
948
原创 FreeRTOS临界段代码保护及调度器挂起与恢复
临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段为什么要设置临界代码段?首先是像IIC、SPI这类需要严格按照时序初始化的外设,不允许被打断,还有系统的需求,任务的需求等等,都不允许被打断。能打断当前任务执行的只有中断和任务调度。FreeRTOS 在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。临界区是直接屏蔽了中断,系统任务调度靠中断,ISR(中断服务程序)也靠中断。taskENTER_CRITICAL() //任务级进入临界段。
2024-11-05 17:29:30
257
原创 FreeRTOS中断管理
简单来说,让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断。中断的执行机制分为三步:中断请求、响应中断、退出中断。
2024-11-04 21:58:33
700
原创 FreeRTOS的任务挂起与恢复
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考内容不多也没啥好总结的,也就能写一些注意事项日后学习使用如有错误会一并写在总结里面,就把总结当做是踩坑经历吧哈哈哈~~
2024-10-29 15:21:46
481
原创 FreeRTOS的任务创建与删除
本次学习了关于FreeRTOS以下三个的方面:1.任务创建和删除API函数2.任务的创建和删除(动态方法)3.任务的创建和删除(静态方法)/* 任务栈栈顶,必须为TCB的第一个成员 *//* 任务状态列表项 *//* 任务事件列表项 *//* 任务优先级,数值越大,优先级越大 *//* 任务栈起始地址 *//* 任务名字 */省略很多条件编译的成员} tskTCB;本次学习了关于FreeRTOS的两种不同的任务创建方法。
2024-10-28 20:06:57
687
原创 STM32F103单片机USART/UART异步通信配置步骤
CH340USB转串口原理图。主要是对三个时钟(GPIOA、USART1、AFIO)和USART1中断的使能,以及对串口通信的两个收发引脚PA9和PA10进行配置。此函数可以放在第一步的uart_init()函数中,作为初始化函数使用。所用的开发板是正点原子的开发板,以下是学习笔记。下面是完整的main.c和usart.c模块。使能中断和设置优先级。
2024-05-21 21:10:44
1432
1
原创 【DS18B20】读取温度
1.初始化—跳过ROM(0xcc)—读取温度(0xbe)—调用两次读取温度函数,分别是高位和低位。1.初始化—跳过ROM(0xcc)—转换温度(0x44)
2024-03-13 21:18:37
1073
原创 【矩阵键盘】
需要注意的是这里的两个key_io都是局部变量,与上面的获取键值函数没有关系,在后面的语句中也能看到上面这个函数的键值key_io作为函数的返回值已经赋值给了下面这个函数的键值key_io。检测列的时候,给定义的变量key_io在不同列的情况下赋值基础值,如第一列是4,第二列是8等,是应为他们列的第一个键值就是这个,并没有其他的特殊含义。(值得注意的是,在高四位的P4口中,可以直接对寄存器赋值,因为单片机中其他的外设没用到除了P42和P44口以外的口,所以检测的时候可以直接赋值P4=0xff或者0x00)
2024-03-10 15:15:54
917
1
原创 【独立按键】状态机法
可以看到,当跳线帽接在J5的2,3口上时只有S4~S7起作用,此时为独立按键状态,由P33~P30低四位控制。统计S4按下的次数:每按下一次S4,数码管的数字+1 (默认数字是0)(2)按键状态的判断,包括判断按键按下,判断按键弹起;(3)不阻塞程序,不用delay消抖。
2024-03-10 09:23:54
360
1
原创 【定时器】综合练习
2. 当L1闪烁5次后,继电器吸合;再次闪烁5次后继电器关闭;4. 蜂鸣器一直处于关闭状态,且L2,L3一直处于熄灭状态。1. L1以0.5s间隔闪烁;(不能使用Delay)3. L4~L8以0.1s间隔流水灯;
2024-03-09 12:42:50
201
原创 点亮LED,打开蜂鸣器、继电器
接下来就要看到译码器电路了 ,Y4C由一个与非门控制着,WR接地的情况下,需要使得Y4具有高电平,因此需要对译码器进行控制,不难得出当P27=1,P26=0,P27=1的情况下,可以使得Y4C输出高电平,从而打开寄存器。可以看到,这个LED外设采用的是共阳极的设计,因此我们需要获得在L1~L8左端的低电平,即需要锁存器的Q端能够产生低电平,即需要对锁存器的控制端D端赋值低电平,就可以让对应的LED灯亮起。值得注意的是,共阳极的LED灯赋值时应该是低电平点亮,如果给出的是共阴极的位,那应该进行取反"~"。
2024-03-09 12:08:14
256
原创 【IAP15 IO】
51 单片机内部有很多个小模块,每个模块居住在拥有唯一房间号的房间内, 同时每个模块都有 8 个控制开关。P0 就是一个功能模块,就住在了 0x80 这个房间里,我们 就是通过设置 P0 内部这个模块的 8 个开关,来让单片机的 P0 这 8 个 IO 口输出高电平或者 低电平的。经过上边第二 条语句后,以后只要在程序里写 LED,就代表了 P0.0 口(“^”这个符号在数字键 6 上边), 注意这个 P 必须大写,也就是说我们给 P0.0 又取了一个更形象的名字叫做 LED。
2024-02-28 17:24:31
236
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人