- 博客(50)
- 收藏
- 关注
原创 FreeRTOS任务间数据量大:使用指针类型给队列
在 vSenderTask1 和 vSenderTask2 中,将 DataPacket 结构体定义为任务局部变量。这样在任务的生命周期内,由于使用任务局部变量,发送任务中的 DataPacket 结构体在整个任务运行期间都存在。如果发送任务再次更新了结构体内容,可能会影响接收任务读取的数据。接收任务:接收任务保持不变,从队列中接收 DataPacket 结构体指针,并打印接收到的数据内容。在每次循环时,更新结构体中的数据内容,然后将结构体的地址赋给指针 pPacket 并发送到队列中。
2025-02-27 11:12:00
228
原创 STM32 CubeMx配置串口收发使用DMA并调用Idle模式(一)
Idle的开启不在CubeMx的设置选项里面,DMA的地址绑定也不在CubeMx里面,只要调用相应的函数这两个设置就起效。分两篇讲,第一篇讲cubeMx的配置,第二篇结合代码落实。
2025-02-17 09:23:11
366
原创 FreeRTOS创建队列 返回空指针 分析
系统的全局变量也是在Total_Heap_Size分配的,也就是系统的所有开销都是这里分配,主要有三部分:1、任务栈;每个任务都会执行以下:也就是每个任务都会create信号量和队列,srcRxbufSize值是38;前面先执行的两个任务队列分配成功,第3个任务,申请返回的队列指针是0(也就是空)3、分配启动文件设置的堆栈大小:堆heap、栈stack,确定栈顶地址sp;1、全局变量、静态变量啥的都先分配完(包含初始为0和初始不为0);2、分配FreeRTOS的堆栈ucHeap;
2025-01-16 16:07:40
362
原创 STM32串口HAL库收发的三种模式
使用串口主要有三种方式:1、轮询;2、中断;3、DMA;4、接收使用Idle+DMA;以下图片、代码、资料均来自韦东山的资料,我这里只是结合自己理解整理心得。
2024-12-30 13:56:17
366
原创 FreeRTOS中全局变量的使用(持续更新)
实在非要extern侵犯我,我还可以严格控制包含我.h档的对象,而不是放到公共的includes.h中被人围观,丢人现眼。4、全局变量用作属性或者参数,明确哪个任务修改,哪个任务查看,这两个任务会不会存在冲突,即读写期间不要被打断(3、我们经常用全局去标识一种情况已经发送,在另外的任务或函数中,查询该情况(或多种情况),这种使用场景可以用。,顺便把结构体定义也收进来;6、如果非要开放出去让人读取,那就用函数return出去,这样就是只读属性了;优先级高的任务会打断优先级低的任务,同级任务轮询时间片运行。
2024-10-28 09:32:07
1136
原创 FreeRTOS互斥锁与二值信号量的区别
C先运行拥有信号量,使用途中还没释放信号量,被B抢占,B开始运行,B运行一段时间后,A运行抢占B,但是A等待信号量,A阻塞;B继续运行,B运行完,C运行,C释放信号量,A运行,A运行完,C再运行。也就是说初始化后,信号量使用前必须有give(释放)的操作,否则take会一直等下去;二值信号量不可以递归,同一个任务对同一个二值信号量的获取操作将会导致该任务被挂起;互斥锁适合保护长时间运行的代码块,二值信号量适合任务间的简单同步;递归互斥锁允许任务在已经持有互斥锁的情况下再次获取该互斥锁;
2024-10-24 14:25:52
460
原创 华为OD 机器人搬砖 二分法 思路
题意理解:8个小时内搬完这一堆砖头,每个仓库有一堆,机器每个小时只能在一个仓库工作,也就是说仓库如果大于8个,不可能完成。取决你在这个小时给它多少电并且充的电只能用在这个小时,例如示例1:30 12 25 8 19 ,最大砖头30,假如每个小时给30的电,总共5堆,5个小时就能办完。要求8个小时内办完即可,并且至少多少电,所以找一个数,这个数正好满足8小时内办完。1 如果是大于等于8小时,right往左移,right= mid -1;2 如果小于8,left往右移,left = left +1;
2024-08-29 10:18:49
1154
原创 华为OD 员工派遣 二分法 思路
1、从1到mid,计算share有几个,xok有几个,yok有几个,sum = share+xok+yok。找到最小的k,使得可以将编号1-k中的员工分配给x国、y国,且满足两国需求;从工号1-k中选择员工 派去 x国(需要nx人)、y国(需要ny人);2 该数只能用做x国,data%x!3 该数只能用做y国,data%y!工号为x倍数的不去x国,工号为y倍数的不去y国;暴力法:从1-k数中,一个一个数,去判断是都满足。2
2024-08-29 09:31:56
1095
原创 华为OD 可以处理的最大任务 C语言实现
5 6----------------------------------第6天做。2 6----------------------------------第5天做。2 6----------------------------------第2天做。5 5----------------------------------第5天做。5 6----------------------------------第6天做。5 8----------------------------------第7天做。
2024-08-27 16:28:48
7121
原创 华为OD题目 csv格式的数据 字符串 用C没写出来
第一个单元中有对B单元的引用,B单元格的值为1,替换时,将第二个数据单元的内容替代<B>的位置,并和其他内容合并。第二个单元中有对A单元的引用,A单元格的值为1,替换时,将A单元的内容替代<A>的位置,并和其他内容合并。2. 每个单元格的内容包含字母和数字,以及使用<>分隔的单元格引用,例如:<A>表示引用第一个单元的值。将一个csv格式的数据文件中包含有单元格引用的内容替换为对应单元格内容的实际值。5. 引用单元格的位置不受限制,运行排在后面的单元格被排在前面的单元格引用。A单元格:aCd<B>8u。
2024-08-21 18:26:55
485
原创 彻底搞清楚strtok的使用
2、第二次调用strtok,传入的是NULL,因为不需要从头开始,而是从上面第一步的结束位置开始往下找下一个。最后是:"This is \0 www.runoob.com \0 website"开始是:"This is - www.runoob.com - website"该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。它会修改原字符串,把要找的字符改为null也就是字符'\0'“-”,就是从-后面的空格开始(空格的ascii码是32),返回前面字符串的指针,并把。
2024-08-21 11:57:07
434
原创 力扣739 每日温度 单调栈的理解
当前元素更大的话,栈顶出栈(并且栈顶对应的下标,出结果了,因为当前的值栈顶代表的值大)top--,(1)当前元素更大,栈顶出栈(并且栈顶对应的下标,出结果了,因为当前的值栈顶代表的值大)top--,输入: temperatures = [73,74,75,71,69,72,76,73]比69大,栈顶的要出栈,表示已经找到了比栈顶要大的数,他们相距=当前处理下标-栈顶下标;(2)当前元素小,当前元素的下标入栈,入栈后top++;输出: [1,1,4,2,1,1,0,0]下一个71,没有75大,下标3,入栈;
2024-08-20 17:19:30
487
原创 又是一篇关于GD32堆栈的梳理+FreeRTOS的空间
这篇文章主要想讲清楚几个事情:1、启动文件Stack_Size、Heap_Size的大小设置有啥影响;2、FreeRTOS的内存:FreeRTOSConfig.h文件configTOTAL_HEAP_SIZE;
2024-06-28 16:00:31
903
原创 嵌入式EMC
EFT:电快速瞬变脉冲群((EFT/B, Electrical Fast Transient / Burst)是在同一供电回路中,静电ESD:仿真操作人员或物体在接触设备时产生的放电以及人或物体对邻近物体之放电,以检测被测设备抵抗静电放电之干扰能力。多种用电器(或设备)在工作过程中(如开关、继电器等在使用时)产生的瞬态脉冲群。浪涌:电子设备在电源线上遇到瞬间过电压的耐受能力,模拟雷击、电路突然断开;EMC:兼容,设备间相互兼容在共同环境下工作的能力。在EFT测试项目下:输入引脚的检测,容易误触发。
2024-06-26 09:01:33
1265
1
原创 FreeRTOS零散知识点(持续更新)
由于没有经常使用,很容易忘记,但是这些信息又是很关键,仅此记录。以下仅仅是个人的认识,其中可能有误解,不可全信,望包涵指正。,会去查询是否需要切换任务。同等优先级的任务,每个任务执行1tick后切换另一个同等优先级的任务;2、进入中断前一刻执行的是低优先级任务,中断中唤醒高优先级任务(把高优先级任务放就绪列表);(例如在等待队列信息),低优先级任务给队列发送消息,发送成功后,会去执行高优先级任务;3、中断结束后,是否需要马上执行高优先级任务,取决于调度策略;,也就是只有中断处理完后,才会有任务切换的说法;
2024-06-20 10:05:50
216
原创 FreeRTOS手表项目多级菜单的实现
如图,关注焦点是任务:1、在一个确定时刻,在那一圈任务中(写有只有一个任务解挂)只有一个任务处在运行,界面显示的是该任务应该显示的内容;2、切换菜单的按键每被按下一次,就会切换下一个任务,界面显示也会随着任务切换而不一样;3、在那一圈任务(写有只有一个任务解挂),它们都会读取按键队列的按键值,因为每个任务都要和按键交互;4、按键任务最高优先级,负责把识别到的按键值发送到按键队列里面。
2024-06-06 09:47:37
1641
5
原创 多级菜单的实现一
郑重声明一下:以上代码全都不是出自我本人。我在整理菜单实现的代码时,发现之前落下的笔记,出处我也找不到了,对原作者要说声抱歉。总共分享三种实现多级菜单方式,前面两种是裸机式的,第三种是带有FreeRTOS。假设进入的二级菜单是menu2_key_wave();进入二级菜单具体哪一个项目呢,根据返回的值决定,会根据flag的值,在界面上不同位置显示出光标。2、当menu1有返回值后,进入二级菜单。1、首先处在第一级菜单:显示。,则返回flag的当前值,
2024-06-05 17:30:47
468
原创 守护任务用来防止资源冲突
策略:每个任务都往自己的队列里面发数据,单独建立一个监听任务:处理所有队列的数据。(监听任务的执行频次要比任务发送队列的快)。背景:有三个任务,他们都需要操作数码管。每个任务对应三个数码管,共9个数码管。硬件上9个数码管的控制使用一套硬件完成。3、给队列发送数据的任务(有三个任务,只举例一个任务的发送情况,其他两个类似)轮询每个队列是否有数据,不等待轮询,有数据马上处理。,每个下标号0、1、2代表对应任务任务1、2、3;2、listen监听任务,守护任务。每个队列可以有20个数据,类型是。
2024-06-04 10:07:37
367
原创 模块化编程实例
c文件是实例结构体内容,包括1、数据结构体的内容存放空间的申请;2、数据操作结构体里面的操作函数的具体实现;.h文件是结构体定义,以及外部使用接口的声明;总结:感觉都是用指针的方式去操作数据?以上代码模版来自韦东山的三人射球机项目。
2024-05-30 17:41:44
339
原创 理清STM32的内存(ram)与flash(rom)空间
1、因为ZI-data和bss对应(初始化为0的全局变量),RW-data和data对应(初始化不为0的全局变量);ZI-data+RW-data叫全局区静态区;烧录程序后,占用flash空间 = code + R0-data + RW-data。总结:我没有去研究到底是不是我上面说的这样,感觉大概率是的。以下注意flash和ram的排布,ram从RWsection开始。2、如下图,下面这种情况经常和STM32的情况混在一起。为什么RW-data在flash又在内存ram,编译后的bin文件大小(基本上)
2024-04-25 14:37:31
834
原创 FreeRTOS的浮点运算异常(实则是由于编程不严谨)
由于项目涉及内容多,变量多,出问题时,第一怀疑是自己可能没有了解FreeRTOS的浮点型运算的特性,网上也搜了一些文章,但是问题始终没有解决。最后只好放慢心态,放缓思维,给耐心,重新理顺,才得出以上结论(中间的过程没有那么顺利)。不足:遇到问题的时候会飘,并没有基于事实稳扎稳打,仍然是不淡定,思维上也跳过很多细节。回到异常现象,即任务函数与doubleAdd函数各自在两个不同.c的情况。调用函数doubleAdd函数,并获取返回值,返回值正确。任务中调用函数doubleAdd函数,并获取返回值,
2024-03-21 11:11:51
1082
1
原创 GD32或STM32PWM的中断:中央对齐模式
配置好一个往复运行的时钟,例如从0到1000,按照升计数;则计数值在0-200是一种电平,200到1000是另一种电平。计数从0到1000,再从1000到0,以此往复运行;当计数大于200是一种电平,小于200是另外一种电平;,即最后一种CAM=2b11;例如0-200,到200时刻触发中断,计数继续升,升到1000后,往下降,降到200,再次触发中断。有时候需要在PWM的一个(每个)脉冲后做某些事情,就会要配置PWM中断。如下代码:可以在中断里面打断点,查看 中断触发的时候时钟计数值是多少。
2024-03-05 18:08:16
3974
原创 汇编代码的执行顺序好像和C逻辑顺序不一致
正点原子的一个例程,如下,代码会在break断点,但是上一条函数 vTaskSuspend(Task1Task_Handler) 却没有执行。
2024-02-19 14:50:04
260
2
原创 GD32或STM32:DMA循环模式与普通模式(串口IDLE)
我的现象是:第一步收完后,关闭DMA,重置CNDTR,再开DMA,第二步接收,依然是从RxBuff下标0开始接收)Circle模式的DMA:初始化后,不需要再次配置,会以循环列表的形式往数组里面存数据;使用DMA减少了cpu的参与(数据搬移),IDLE(即帧与帧之间的空缺时间会触发idle)解决了频繁的串口中断,又可以处理不定长的数据帧;front 是当前正在处理的数组的index,rear 是下一个要存放数据的index。(2)获得rear的值,(它表示下一个要存储的下标);
2024-01-31 16:12:37
3542
原创 LVGL与STM32的理解(基于正点原子资料)
我们要在lcd_draw_fast_rgb_color里面实现对屏的具体操作(也就是在这里实现自己的代码)。lcd_set_window、lcd_write_ram_prepare、lcd_wr_data这三个函数是本例程LCD屏的控制函数(也就是自己写的函数)。以下是stm32工程的文件目录,GUI_APP也可以忽略(细节参考正点原子例程):这里主要是再次加强一下印象,主要就是把。,里面的lcd_init()与lcd_display_dir是。它们都是LVGL的接口,按照它们的需求,把内容给它们即可。
2024-01-19 15:46:15
2994
5
原创 分享一个另类的LCD动图
如视频,参考了书籍《代码本色:用编程模拟自然系统》 也叫《The Nature of Code》;使用了向量的概念去搭建。
2024-01-10 13:55:10
630
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人