- 博客(67)
- 收藏
- 关注
原创 一文带你手搓自己的嵌入式RTOS(二)
我们知道,数据都保存在堆栈和寄存器当中,当我们进行任务切换时,如:A→B, 我们需要把任务A的信息保存起来,当 B→A 时,能够继续正常运行任务A, 那么当任务A切换到任务B的时候我们需要保存哪些信息呢?通常我们使用滴答定时器作为系统心跳,进行时间计数,在我们设计RTOS时,同是如此,在滴答中断中进行任务扫描,如需要任务切换,拉起PendSV中断即可,在PendSV中断中进行任务切换。 M3进入异常:硬件会自动保存寄存器R0~R3,R12,LR ,PC, xPSR。
2025-04-01 19:53:39
759
原创 一文带你手搓自己的嵌入式RTOS(一)
MCU型号 :不同的芯片架构,其硬件特性不同,如ARM架构的Cortex-M3 和 Coretex-M4就有许多区别,我们这里使用初学者常用的芯片,STM32F103xx(Cortex-M3内核)。这里使用的是cmake + ninja 构建项目,gcc 进行编译,pyocd进行仿真,
2025-03-31 14:50:11
653
原创 AUTOSAT-PDUR模块
PDUR 示意图PduR提供路I-PDU(Interaction LayerE Protocol Data Units)的路由服务。PduR基于静态定义的I-PDU标识符来执行I-PDU的路由,在运行期间没有I-PDU被动态路由,即PduR的路由表是静态配置,配置完成后在运行时不支持更改。PduR模块主要有两部分组成:PduR路由路径:静态路由路径,描述的是每个被路由I-PDU的路由属性。PduR引擎:根据PduR路由路径执行路由功能的代码,PduR引擎要处理。
2024-10-30 14:08:23
1113
1
原创 AUTOSAR-Com模块
对不同速率的总线网络提供数据交换;为汽车控制单元应用软件提供了统一的通信环境,为内部和外部通信定义了公共的软件通信接口和行为;AUTOSAR COM模块进行发送和接收信号,为RTE提供面向信号的接收与发送函数。
2024-10-28 19:20:39
867
原创 rt-thread下CAN通信
配置主控制寄存器(CAN_MCR):can 工作模式 和 位时序寄存器(CAN_BTR) : 位时序及波特率。一个开发板在shell中输入 can_sample_receive 开启接收线程。一个开发板在shell中调输入 can_sample_send 开启发送线程。can控制器将数据传入can收发器→数字信号转为为物理信号→发送。can收发器将收到物理信号转为数字信号→can控制器。读取数据:app读取FIFO邮箱对应寄存器,获取数据。筛选器进行过滤 → FIFO邮箱。
2024-09-05 16:18:31
1060
原创 从源码解析FreeRTOS是如何进行任务切换
在FreeRTOSConfig.h定义了系统节拍时钟频率 ,下面表示每s有1000次心跳,即1ms一次(用户自己可以根据自己的需求修改)xTaskIncrementTick()是进行任务切换的重要函数,根据条件把阻塞的任务加入就绪链表中。FreeRTOS在PendSV_Handler函数进行任务切换,此函数使用的都是汇编语言。根据上面的定义系统每隔1ms就会调用SysTick_Handler()
2024-08-19 16:47:08
620
原创 GD32A50x使用DMA采集双ADC多通道数据
如图所示,我们配置为常规并行模式,根据配置顺序,对应二个通道的数据会搬运到DMA中,ADC0通道的数据为低16位,对应ADC1通道数据在高16位。同时我们选择是外部触发转换,也需要配置定时器产生脉冲。最后根据自己的实际情况进行修改,这只是一个demo。
2024-08-12 14:55:10
615
原创 FreeRTOS实现低功耗管理
这里涉及到FreeRTOS的机制,简单来说就是当所有任务都被。如果是此内核的mcu,可不做更改。这里,我们只需要实现自己函数即可,系统就会自动调用。(我们上面配置的)个tick后就会进入低功耗模式。时,FreeRTOS就会执行空闲任务,然后经过。当进入低功耗模式后会自动调用。
2024-08-05 16:54:59
623
原创 十五届蓝桥杯嵌入式代码解析(省一)
这套题目也比较常规,考察LED,LCD,按键,PWM,输入捕获。而这套题目重点要求即是**读懂题目,别混淆题意。实际代码并不多,主要是思路问题。
2024-05-30 10:18:49
1866
3
原创 手撸词法分析器(C/C++)
简单来说就是能识别基本的符号(+,-,*,/,),关键词(for ,while,return ,int ),数字等。这么说大家应该有个基本了解,那么我们如何写代码呢,这里有个思维图。可以大致将单词分成这几类,然后进行判断即可。
2024-04-17 11:12:14
673
2
原创 蓝桥杯嵌入式第十二届省赛
这套题做法其实也跟上一届题目大径相同,先把基本模块实现了,按键,LCD,LED,PWM模块,最后也就是难点就说串口模块,最后我们再去处理,边写串口,边重新去修改其他模块的逻辑。本届蓝桥杯相比于上一届难度有所提升,但是基本考察的外设和知识点都基本没变,只是提高了代码逻辑,知识点还是常规,LCD,LED,按键,PWM,定时器,串口。
2024-03-12 08:52:54
1261
3
原创 蓝桥杯嵌入式第十一届(第二场)省赛
这套题目相对简单,考察LCD屏幕,LED,PWM,ADC,以及按键等知识点,相互结合起来也比较简单。我们只需要先分模块写好各部分即可。链接:https://pan.baidu.com/s/11nfGSuzsEeDCWtdyrCY3Pw?pwd=6666 提取码:6666。文件也属实有点多,可以到这里自取博主的代码进行参考。这里使用STM32CubeMX配置的时候使用的是adc2的通道15即PB15。
2024-03-04 08:09:44
557
原创 搭建esp32-idf开发环境并烧入第一个程序
我们可以看到如下信息(可以进入hello_world工程中,是调用了printf输出的信息)。我们输入idf.py --version 就如查看安装好的版本了,只有安装成功才能出现。下载程序完成后我们可以输入以下命令监听串口打印的信息(类似于串口助手)打开设备管理器,查看esp32连在哪个端口,如图,博主是连在COM3。进入了hello_world目录后,我们就可以编译工程了。这里博主下载的是4.4版本的。你可以根据自己需求下载。安装完成后,桌面会出现如下图标,我们点击进入。编译成功机会出现如下打印信息,
2023-12-21 09:33:49
1537
原创 linux驱动开发-点亮第一个led灯
相对于裸机是程序是运行在操作系统之上的,可以调用标准c库以及内核提供的函数接口,且需要将文件编译为ko文件,加载进linux内核中才能运行。这里和裸机不同的是,这类开发板可以运行linux操作系统,所以和裸机开发有点不同。我们可以看原理图得知,开发板上有一个led可以操控,引脚为GPIO5_3,这样我们只需要操作对应寄存器即可。另外前面博主以及写过51,32单片机的技术博客,入门都是从点灯开始,这里也不例外。可以看出地址为0x020A_C004,配置0为输入模式,配置1为输出模式。下面我们进行代码的讲解。
2023-10-30 14:05:08
573
原创 imx6ull开发板之qt应用编程读取AP3216c(光照,距离)数据。
首先你的开发板需要QT的文件系统,这样才能支持qt程序。在这个背景下才能进行下面的操作。如果没有此背景,自行去查找资料,完成此步。这里是在windows平台下进行开发的。这里的命令可以参考博主的上一篇文章。我们在linux下用Qt打开刚才拷贝的文件夹,点击Build即可。:我这里使用的是百问网的imx6ull开发板。运行之后会生成一个build目录,如图第二个。我们运行程序后会生成2个目录,我们首先给此文件具有可执行权限。这步之后直接运行即可,如图。
2023-10-12 10:29:18
487
原创 imx6ull开发板i2c应用编程读取AP3216c传感器数据
读取ap3216是i2c应用编程的很好例子,以此来掌握i2c应用编程,这个例子只是初步了解,里面涉及的函数,以及结构体还需自己去查阅资料,深入了解。以上已是全部代码(只是分开写)。
2023-10-10 10:28:25
687
原创 一文教你学会Makefile脚本的简单应用
Makefile其实就是一种脚本语言,跟python脚本一样,方便你程序的开发。当我们编译的文件过多,而又需要经常编译的时候就需要写Makefile脚本语言。或者方便别人去编译你的程序(其他人不知道如何编译),拿到你的Makefile文件后,只需要make一下,程序就编译出来了。本文就讲这么多了,只涉及一点基础,适合小白,如果需要深入了解Makefile,博主推荐去看《跟我一起学Makefile》这本书!!!。
2023-09-26 08:19:22
997
原创 蓝桥杯嵌入式创建第一个工程(点亮led灯)
蓝桥杯嵌入式的板子是STM32G431RBT6,所以我们需要导入对应的板级芯片包,不然单片机程序会报错,允许不起来。(如:我们学习stm32f03时也需要导入对应的板级芯片包)。下面教大家如何导入!你们可以去STM意法半导体官网下载,但是是外网,下载较慢,博主这里百度网盘提供给你们。如下图操作后,最后按下复位键就能看到现象了。
2023-09-19 17:52:54
2300
8
原创 STM32F103驱动oled显示屏
oled显示屏和其他显示屏类似,不过他只有0.96英寸,屏幕较小,但是使用起来比较方便。有二种驱动方式,分别为IIC,和SPI驱动。IIC驱动的话只需要4根线,电源,地线,数据线,和时钟线。驱动代码就是以上这些了。
2023-08-30 08:37:08
1109
原创 FreeRTOS事件组
事件类似与信号量,可以等待某一个事件的发生,但是也可以等待某几件事情的发生。这个就比较重要了。列如,在环境监测中,温度达到30°以上同时湿度百分之50以上,就报警。在这种情况下信号量就不太适应了。这时候可以使用事件。
2023-08-29 08:03:03
211
原创 C语言巧用联合体union判定数据的存储格式(大小端)
联合体大家可能比较陌生,但是大家对结构体稍微熟悉一点吧。其实它们二个类似,只不过结构体成员占用不同的地址,而联合体所有成员占用。我们可以看出,低字节存储的是0x45对应的是value的低位0x45,所以低地址存储低位,利用这个特性我们就能判断在当前编译器下存储的数据的格式。我这里就通过代码的方法给大家讲解。
2023-08-28 07:56:14
334
原创 c语言函数指针和指针函数的区别,以及回调函数的使用。
函数指针本质也是指针,不过是指向函数的指针,存储的是函数的地址。,指针函数其实就是返回值是指针的函数,本质是函数。
2023-08-25 08:04:54
862
原创 FreeRTOS软件定时器的原理以及使用实例
我们知道,如果是裸机系统的话,定时器都是由硬件中断完成的。还有一个中断服务函数。而FreeRTOS是一个操作系统,它提供了软件定时器。它也是由系统心跳完成计数的。并不会单独产生硬件中断,同时也不用去写中断服务函数。不过的是我们只需要写一个回调函数即可。(创建软件定时器时,传递函数地址即可)如创建任务一样。FreeROTS软件定时器直接使用的话比硬件定时器方便很多,但是我们应该知其然而知其所以然。不管学习什么的话,我们尽量去了解它的底层以及原理,这样使用的时候出了问题比较容易去排查。!!
2023-08-22 15:49:51
1189
4
原创 C# 字节数组与INT16,float,double之间相互转换,字符数组与字符串相互转换,
如果你已经有了4个字节大小的字符串,第一个参数可以直接传buff[4],由于博主这里只是截取一部分数据所以是如下操作。
2023-08-22 08:35:23
1756
原创 RFID高频读卡器+SG90舵机模拟门禁开关门小项目
今天就想写一个小项目,用RFID高频读卡器加SG90舵机去模拟门禁,当RFID读取到IC卡后,我们的舵机就转动,模拟开门。自我感觉这个项目也是比较容易理解和上手的。这个项目模块也挺少的,就二个模块,但是学习都是循序渐进的 ,慢慢的叠加模块,也可以去再加一个led灯,刷门禁开灯等等。根据自己的兴趣去添加模块。总之,学了各个模块之后,最好自己去做一个小项目练练手。另外,这个小项目的源代码也在博主的资源文件中,需要的可以免费下载!
2023-08-16 11:49:26
916
1
原创 STM32控制SG90舵机原理及代码
舵机的运用还是比较广泛的,那么舵机工作原理是什么呢,一般来说我们给舵机一个信号他就能工作了,那么这个信号是什么,以及如何产生的呢。这里我们需要给舵机一个PWM信号,频率是50HZ,即周期是20ms(来控制舵机如何转动。这里怎么产生PWM波和设置占空比可以参考博主的一篇文章,写的很详细。在这个条件下不同的占空比就是不同的信号。不同的信号就能控制舵机转动角度。那么我们如何控制舵机呢,我们需要单片机产生一个20ms的信号PWM(我这里使用的是stm32f103ZET6的。
2023-08-14 09:05:37
3527
3
原创 环形队列+DMA空闲中断+接收串口数据
代码放出来的就是以上这些,都放上去也比较麻烦,同时也没什么意义。写这篇博客是想让大家有大致的思路以及参考代码,从而根据自己的项目或者需求区进行改动。最后,如果真的需要全部代码的可以私信博主!最好点点关注!!!
2023-08-08 10:30:07
3057
14
原创 Winform使用PictureBox控件显示图片并且自适应
一.首先我们只需要在项目文件中的/bin/Debug 下面创建一个文件夹保存你的照片。我这里文件夹名字叫Resources.。1.在控件中设置BackgroundImageLayout=Stretch。二. 然后我们把我们的照片放入Resources文件夹中即可。三.在构造器中添加picturebox控件。2.设置SizeMode=StretchImage。四.我们到初始化代码中加入如下代码即可。然后即可显示你的图片了。五.设置你的图片自适应。
2023-07-27 15:52:16
4060
4
原创 力扣刷题-翻转字符串
这里我们使用双指针。左指针指向开头,右指针指向末尾。直到left>=right结束。编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组。、使用 O(1) 的额外空间解决这一问题。不要给另外的数组分配额外的空间,你必须。
2023-07-27 15:39:06
121
原创 力扣刷题-最大子数组和
如果i-1位字符数组最小小于0即(dp[i]-10 那么最大肯定是dp[i-1]+nums[i].给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。公式如下ans=max(dp[i],dp[i-1]+nums[i])输入:nums = [-2,1,-3,4,-1,2,1,-5,4]解释:连续子数组 [4,-1,2,1] 的和最大,为 6。输入:nums = [5,4,-1,7,8]
2023-07-24 16:35:57
212
原创 C# winform子窗口向父窗口传值
这里我使用一个简单的方法。只需要在父窗口定义一个静态变量就行。这样父窗体就能获得get_num修改后这个值了。父窗体为Form1,子窗体为Form2。子窗体直接给get_num赋值即可。
2023-07-24 10:42:00
1356
2
原创 C#中小数保留固定位数
这里我们是保留固定4位,并且转化为字符类型。如果我们想改为保留五位只需要把F4改为F5。我们写程序的时候,有时候数据想要对齐一点,如果小数位数不一样,自然就对不齐了。输出结果为result=123.4560(四舍五入)。1.这里举例保留小数点后4位(
2023-07-22 18:03:37
3488
1
原创 STM32定时器的使用
我们知道定时器在单片机中是非常重要的,不管是51单片机还是stm32系列的单片机。我这里就只介绍stm32f103c8t6(只有4个定时器)和stm32f103zet6(有8个定时器)这二款单片机的定时器。然后我们就能到stm32f10x_it.c的定时器7中断函数写想要做的事情。我们这里只介绍二个功能,一个基本定时功能,一个是输出PWM波(比较通道):高级定时器功能兼容通用定时器的功能,通用定时器兼容普通定时器的功能。我这里使用的是普通定时器7。
2023-07-13 08:48:57
582
3
原创 STM32使用printf重定向到USART(串口)并打印数据到串口助手
整个程序到这里就结束了。学会这个printf重定向到串口1,对于你程序的调试就方便多了。你只需要加上如上代码就行了。你学会了吗?
2023-07-10 16:16:12
13964
17
原创 STM32控制蜂鸣器间隔发出声音(响1s,关闭1s)
我现在这个蜂鸣器是有缘蜂鸣器,只能发出一种声音。而且是低电平触发(根据你们自己的蜂鸣器决定),现在我要做的一个实验就是蜂鸣器响1s,关闭1s。实现间隔的发出声音。代码也不算多,到这里就结束了,如果你想修改间隔值,就直接修改中断里面data的值就可以了。这个代码只是一个demo。
2023-07-05 11:23:16
7159
12
原创 一文教你学会keil软件仿真
仿真在我们调试代码中是非常重要的。通过仿真,我们可以快速定位到错误代码,或者错误逻辑的地方。这里我就以为例,教大家如何软件仿真(软件仿真不需要单片机,直接通过keil软件进行代码调试)。
2023-06-27 09:34:44
9572
2
原创 创建第一个FreeRTOS任务
我们如何观察实验现象呢,其实有二种方法,一种是通过printf串口打印(需要自己添加串口初始化代码),一种是通过软件仿真观察flag和flag2变量的值。我的理解是这样,创建任务之前,我们需要定义一个句柄,然后我们创建任务的时候将任务和句柄绑定。后序我们就可以通过操作这个句柄来操作任务(如删除任务,我们只需要删除句柄)。一个任务是flag在1和0之间来回切换,一个任务是flag2在0和1之间来回切换。任务创建函数如下,这里有5个参数,分别是任务函数,任务名,任务栈大小,任务优先级,任务句柄。
2023-06-27 09:03:51
508
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人