- 博客(36)
- 收藏
- 关注
原创 华为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
373
原创 彻底搞清楚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
267
原创 力扣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
434
原创 又是一篇关于GD32堆栈的梳理+FreeRTOS的空间
这篇文章主要想讲清楚几个事情:1、启动文件Stack_Size、Heap_Size的大小设置有啥影响;2、FreeRTOS的内存:FreeRTOSConfig.h文件configTOTAL_HEAP_SIZE;
2024-06-28 16:00:31
421
原创 嵌入式EMC
EFT:电快速瞬变脉冲群((EFT/B, Electrical Fast Transient / Burst)是在同一供电回路中,静电ESD:仿真操作人员或物体在接触设备时产生的放电以及人或物体对邻近物体之放电,以检测被测设备抵抗静电放电之干扰能力。多种用电器(或设备)在工作过程中(如开关、继电器等在使用时)产生的瞬态脉冲群。浪涌:电子设备在电源线上遇到瞬间过电压的耐受能力,模拟雷击、电路突然断开;EMC:兼容,设备间相互兼容在共同环境下工作的能力。在EFT测试项目下:输入引脚的检测,容易误触发。
2024-06-26 09:01:33
397
原创 FreeRTOS零散知识点(持续更新)
由于没有经常使用,很容易忘记,但是这些信息又是很关键,仅此记录。以下仅仅是个人的认识,其中可能有误解,不可全信,望包涵指正。,会去查询是否需要切换任务。同等优先级的任务,每个任务执行1tick后切换另一个同等优先级的任务;2、进入中断前一刻执行的是低优先级任务,中断中唤醒高优先级任务(把高优先级任务放就绪列表);(例如在等待队列信息),低优先级任务给队列发送消息,发送成功后,会去执行高优先级任务;3、中断结束后,是否需要马上执行高优先级任务,取决于调度策略;,也就是只有中断处理完后,才会有任务切换的说法;
2024-06-20 10:05:50
143
原创 FreeRTOS手表项目多级菜单的实现
如图,关注焦点是任务:1、在一个确定时刻,在那一圈任务中(写有只有一个任务解挂)只有一个任务处在运行,界面显示的是该任务应该显示的内容;2、切换菜单的按键每被按下一次,就会切换下一个任务,界面显示也会随着任务切换而不一样;3、在那一圈任务(写有只有一个任务解挂),它们都会读取按键队列的按键值,因为每个任务都要和按键交互;4、按键任务最高优先级,负责把识别到的按键值发送到按键队列里面。
2024-06-06 09:47:37
766
原创 多级菜单的实现一
郑重声明一下:以上代码全都不是出自我本人。我在整理菜单实现的代码时,发现之前落下的笔记,出处我也找不到了,对原作者要说声抱歉。总共分享三种实现多级菜单方式,前面两种是裸机式的,第三种是带有FreeRTOS。假设进入的二级菜单是menu2_key_wave();进入二级菜单具体哪一个项目呢,根据返回的值决定,会根据flag的值,在界面上不同位置显示出光标。2、当menu1有返回值后,进入二级菜单。1、首先处在第一级菜单:显示。,则返回flag的当前值,
2024-06-05 17:30:47
202
原创 守护任务用来防止资源冲突
策略:每个任务都往自己的队列里面发数据,单独建立一个监听任务:处理所有队列的数据。(监听任务的执行频次要比任务发送队列的快)。背景:有三个任务,他们都需要操作数码管。每个任务对应三个数码管,共9个数码管。硬件上9个数码管的控制使用一套硬件完成。3、给队列发送数据的任务(有三个任务,只举例一个任务的发送情况,其他两个类似)轮询每个队列是否有数据,不等待轮询,有数据马上处理。,每个下标号0、1、2代表对应任务任务1、2、3;2、listen监听任务,守护任务。每个队列可以有20个数据,类型是。
2024-06-04 10:07:37
299
原创 模块化编程实例
c文件是实例结构体内容,包括1、数据结构体的内容存放空间的申请;2、数据操作结构体里面的操作函数的具体实现;.h文件是结构体定义,以及外部使用接口的声明;总结:感觉都是用指针的方式去操作数据?以上代码模版来自韦东山的三人射球机项目。
2024-05-30 17:41:44
234
原创 理清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
507
原创 FreeRTOS的浮点运算异常(实则是由于编程不严谨)
由于项目涉及内容多,变量多,出问题时,第一怀疑是自己可能没有了解FreeRTOS的浮点型运算的特性,网上也搜了一些文章,但是问题始终没有解决。最后只好放慢心态,放缓思维,给耐心,重新理顺,才得出以上结论(中间的过程没有那么顺利)。不足:遇到问题的时候会飘,并没有基于事实稳扎稳打,仍然是不淡定,思维上也跳过很多细节。回到异常现象,即任务函数与doubleAdd函数各自在两个不同.c的情况。调用函数doubleAdd函数,并获取返回值,返回值正确。任务中调用函数doubleAdd函数,并获取返回值,
2024-03-21 11:11:51
283
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
1426
原创 汇编代码的执行顺序好像和C逻辑顺序不一致
正点原子的一个例程,如下,代码会在break断点,但是上一条函数 vTaskSuspend(Task1Task_Handler) 却没有执行。
2024-02-19 14:50:04
193
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
1658
原创 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
1717
4
原创 分享一个另类的LCD动图
如视频,参考了书籍《代码本色:用编程模拟自然系统》 也叫《The Nature of Code》;使用了向量的概念去搭建。
2024-01-10 13:55:10
593
1
原创 插拔串口有可能会产生一个异常数据
以上,作为软件的我犯了一个错:先入为主,有想甩锅的嫌疑,总想证明:不是软件造成的。实际上硬件知识,自己也懂,自我代入进去,自己如果作为硬件的话应该怎么解,好像软件的我也没有给有效支撑或方案(作为软件的我当时没有这么去思考)。软件人的思维:软件的逻辑不会有问题,软件有问题早出问题了,不用等到插拔等操作。这个现象和4现象的区别是,4现象关注点是:只插拔一根线也会有复位,仍然怀疑是由插拔引入了干扰;在485串口插拔会出问题,就这个现象,就已经可以正对串口代码做些实验,例如屏蔽串口,或者检查串口接收端的处理。
2024-01-04 17:03:21
436
1
原创 GD32或STM32(GD32F103RB)串口DMA+IDLE空闲中断
2、做了一个特殊处理(这个特殊处理完全没有必要):使能了串口的TC中断,目的是需要确保数据已经完全发出,发送完,后拉高485电平(有的方案不需要),进行等待接收;这里多此一举:讲讲TC和TBE的关系:TBE=1,表示USART_TDATA为空,即可以把你要发的数据给USART_TDATA赋值了,可以理解buf缓存寄存器,但是并没有发出(可能还处在移位寄存器);1、Rx来一个字节触发一次串口中断,读取字节,同时根据协议判断,属于什么帧,对应要执行什么操作;2、串口FIFO,较少中断触发次数;
2024-01-03 15:40:31
1190
1
原创 小模块优秀代码整理(持续更新)
以下很多代码并非出自本人,具体来源也理不清了,有可能有的代码会有bug。这个文章主要是给大家一些提示,根据自己理解,编写适合自己的代码。结构体和联合体一起使用:用来解析帧数据,既是一段连续的数组,每个成员又有具体含义(甚至每个位的含义都不一样)首先要配置好一个1ms的时钟,时钟内部对一个全局变量的g_uTimerCount++处理;最后直接调用GetTickDly(需要延时的时常),一旦超过需要的时长,进入if。GPIO的宏定义操作:使用宏写代码,代码会显得有调理,整洁,易懂。
2024-01-03 11:03:13
676
1
原创 GD32或STM32(GD32F103RB)Ymodem串口升级源码分析
2 while等待串口的USART_FLAG_IDLE空闲标记:该标记置位的条件是,收完一帧数据,或者收完一段数据后停止了一段时间(根据代码现象,我理解是这样,但是我没有仔细去查阅);着重介绍一下UART_RecvData函数的使用,该函数是用了DMA,代码上以查询的方式获取串口数据,主要步骤如下:(每次需要调用该函数时,都会执行以下,请结合下面代码看以下文字)2、数据帧的处理(什么条件需要写入flash,flash是按照页为单位写入,这里的情况是一页为1K);3 拷贝DMA的buf的内容。
2024-01-02 14:35:03
843
1
原创 GD32或STM32(GD32F103RB)用Ymodem升级
为什么说到Ymodem升级协议(用bin文件升级),因为有通用的小工具、小软件是支持Ymodem功能的(例如SecureCRT ,Tera Term),这里推荐Tera Term,because我使用SecureCRT没调试成功。说明一下涉及的三条帧与命令的关系:可以理解为帧是大的流程,即升级的流程(或者传输数据的流程)。产品的代码一般以boot+app的形式开发。另外讲下用SecureCRT失败的原因:用1024发帧的时候,起始帧如下:即起始帧竟然是STX开头也就是起始帧是1024字节的数据。
2023-12-29 16:59:33
994
1
原创 GD32或STM32(GD32F103RB)读写内部FLASH,即用flash存配置信息或者版本号
这两种情况是不能同时兼容的,所谓不能同时兼容,是指在一页的地址区间内,不能有这两种情况(例如一页的范围是0到100的地址,把可以修改信息放在0-50地址,把不能修改的地址放到51-100。这种情况是不允许的)。为什么要区分好这两种情况,因为Flash的写入前必须先擦除(Flash默认是FF,只做写0操作),flash的擦除,是按照一页为单位进行操作。第一种情况:对存储信息只做读取操作。这种使用可以理解为是只读的,像版本号,或因为硬件不一样做的区分信息,这些信息是只读的,不修改;
2023-12-27 15:49:39
1125
1
原创 stm32或GD32如何把想要图标显示在lcd上
问题2:如何把图标转变为自己LCD需要的16进制数:需要使用PCtoLCD2002.exe软件,该软件只识别BMP格式图片。至此合适大小的bmp图片已经具备。接下来是使用PCtoLCD2002.exe软件,生成需要的16进制码。我的屏幕显示是逐行再往下一列显示,点击生成字模;至此图案的16进制码已经生成。打开后,如图,大小默认是100*100,修改为12*12,确定。保存为BMP:保存为24位图(也就是24*24个点大小)问题1解决后,得到PNG格式的图案,并且尺寸较大;打开之前保存好的bmp图案。
2023-12-21 11:23:45
596
原创 测脉冲测试时产品故障,串口通信Rx上拉输入
考虑是否有的管脚设为了浮空输入,把浮空输入设为上拉输入;串口Tx设为复用推挽输出,Rx设为内部上拉输入。
2023-12-20 11:42:29
397
原创 STM32或GD32调试debug时正常运行,烧录后程序不正常
PB3、PB4、PA13、PA14、PA15默认下都是烧录功能。那么我们想使用PB3、PB4做其他功能时要执行一个操作,拿GD32来说是执行:gpio_pin_remap_config函数;例如:我的项目是只使用了PA13、PA14作为下载口,其他口都做其他功能。现象:如题,用keil调试的时候,设备正常运行;一但烧录程序后,断电重启,设备异常;考虑:是否使用了下载口,并且下载口没有重定位造成。
2023-12-20 11:23:53
1575
原创 while(!dma_flag_get(I2C_DMA, DMA_RX_CH, DMA_FLAG_FTF));IIC的DMA卡住
【代码】while(!IIC的DMA卡住。
2023-12-15 11:08:37
550
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人