- 博客(49)
- 收藏
- 关注
原创 Zephyr【3】-----实机实验----- 设备树点灯(基于STM32 官方开发板 NUCLEO-F767ZI)
设备树(DTS)是一种描述硬件配置的方法,通过定义硬件组成和连接关系,使同一软件代码能适配不同硬件。以STM32F767ZI-NUCLEO开发板为例,设备树文件描述了3个LED灯连接的GPIO引脚。在应用程序中,通过宏定义和API函数获取设备树配置信息并控制GPIO。编译时需配置GPIO支持,使用west工具构建后生成hex文件烧录。实验现象为LED灯周期性闪烁。设备树实现了硬件描述与软件驱动的分离,提高了代码复用性。
2025-07-14 16:17:11
287
原创 Zephyr【2】-----内核调度[1]
Zephyr内核调度机制摘要:采用优先级驱动调度,始终选择最高优先级就绪线程执行。协作式线程(负优先级)需主动让出CPU,抢占式线程(非负优先级)可被更高优先级线程抢占。通过动态调整优先级可实现两种模式转换。时间片轮转确保同级线程公平执行,调度器锁可临时禁止抢占。线程状态包括就绪(可执行)和非就绪(阻塞、挂起等)。ISR会中断任何线程执行。配置选项定义两种线程的优先级范围。长时间运行的协作式线程应适时调用k_yield或k_sleep避免系统延迟。
2025-07-07 15:17:55
263
原创 Zephyr【1】-----概述
本文介绍了Zephyr RTOS的系统架构和关键特性。其目录结构包含硬件抽象层、内核代码和驱动模块,采用CMake构建系统结合Kconfig和Devicetree进行配置。Zephyr支持协作式和抢占式混合调度,提供丰富的线程通信机制(信号量、消息队列等),具有多种内存管理方案(堆、slab、块分配器),并内置蓝牙、文件系统等子系统。相较于FreeRTOS,Zephyr在通信方式、内存管理和调度策略上更为全面,同时兼容多种第三方组件生态,适用于复杂嵌入式系统开发。
2025-07-07 15:16:15
904
原创 Linux【10】-----Linux系统编程(线程池和并发socket编程 c语言)
本文实现了一个基于线程池的并发服务器程序。线程池采用环形任务队列结构,包含工作线程、任务队列和同步机制(互斥锁和条件变量)。服务器端通过socket监听客户端连接,每当有连接建立时,将处理任务加入线程池队列。工作线程从队列取出任务并执行,实现客户端请求的并发处理,避免了频繁创建销毁线程的开销。程序展示了线程池与网络编程的配合使用,为高并发服务器提供了一种高效的解决方案。
2025-06-28 16:51:39
264
原创 Linux【9】-----Linux系统编程(调度机制和动态/静态优先级)
本文摘要介绍了Linux线程调度与信号响应的关键概念。调度部分详细讲解了静态优先级(0-99)和动态优先级机制,包括三种调度策略:SCHED_OTHER(分时)、SCHED_FIFO(先到先服务)和SCHED_RR(时间片轮转),并说明如何通过pthread_attr接口设置调度属性和优先级。动态优先级部分阐述了通过nice值(-20到19)调整普通任务优先级的原理。信号响应部分介绍了线程专用的信号处理函数(pthread_kill等)和信号屏蔽方法。文章包含多个实践练习示例,如创建特定调度策略的线程、设置
2025-06-23 09:41:32
771
原创 Linux【8】-----Linux系统编程(并发编程原理与应用)
本文介绍了Linux线程编程的基本操作。主要内容包括:1) 线程创建使用pthread_create接口,需指定线程ID、属性、执行函数和参数;2)线程退出方式有pthread_exit或函数返回,注意主线程对子线程的影响;3)线程接合使用pthread_join回收资源;4)线程属性可通过pthread_attr_init设置,如分离属性。第二部分讲解多线程同步互斥,重点介绍互斥锁的使用:互斥量初始化、上锁解锁操作,并通过示例程序演示了如何保护共享变量。文章包含关键API说明和代码示例,适合作为Linux
2025-06-14 13:45:56
436
原创 Linux【7】------Linux系统编程(进程间通信IPC)
要求进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号之后打开消息队列并把进程的PID作为消息写入到消息队列中,要求进程B在写入消息之后,发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出消息正文的内容。:根据阻塞接口,设计一个程序,要求把快捷键Ctrl+C的对应信号进行阻塞,需要创建一个信号集,把该信号添加到信号集,对信号集属性进行设置(阻塞),然后测试发送该信号是否会被进程响应。1~ 31的信号为普通信号,编号为34~64的信号为实时信号。
2025-06-11 21:20:57
929
原创 Linux【4】------RK3568启动和引导顺序
如果这些设备都没有有效的启动代码,BootROM 会进入 USB OTG 模式,等待上位机(如 PC)通过 USB 向其下载启动代码;BootROM 会尝试从配置好的外部设备(如 NOR/NAND/eMMC/SD 卡)加载启动程序;一旦代码加载完成,系统即可进入正常启动流程。加电后,芯片首先执行。
2025-06-07 17:11:42
427
原创 STM32八股【10】-----stm32启动流程
是 C 运行时库的入口,它会初始化全局变量(复制 .data 段到 SRAM,清零 .bss 段),然后跳转到用户写的 main 函数,至此头文件初始化完成。中断向量表的前4个字节是 _initial_sp, 表示 主栈指针(MSP) 的初始地址,用来设置堆栈指针(SP)然后从下一个地址(0x08000004)读取复位处理程序的地址(Reset_Handler),并跳转到那里执行。是 ST 库提供的函数,负责初始化时钟、外设等,比如设置系统时钟为 72MHz。3.跳转到 main 函数。
2025-05-25 14:20:08
948
原创 STM32八股【9】-----volatile关键字
主要是为了防止编译器优化导致无法得到最新的值。主要用于以下三处:1.在中断中修改访问的变量。2.多任务(线程)共享的变量。3.硬件寄存器变量。
2025-05-18 17:14:40
627
1
原创 实习技能记录【4】-----消息分发中的观察者模型
的状态变化,并在主题对象状态改变时自动通知所有观察者对象。观察者模式(Observer Pattern)是一种。,主要用于定义对象之间的。ai修改的c语言版本。
2025-04-29 16:18:54
407
原创 实习技能记录【5】-----项目中消息传递到ui层的方法
UI线程通过非阻塞的获取到来自底层的消息并在进一步进行消息分发这里使用虽然的是FreeRTOS,但是osMailGet不是通用的FreeRTOS函数,是CMSIS-RTOS的接口。底层实现的原理实际上就是freeRTOS的队列。
2025-04-29 15:36:05
322
原创 FreeRTOS学习笔记【10】-----任务上下文切换
上下文其实就是线程的状态类别保存内容CPU寄存器高级寄存器R4~R11(手动保存)栈指针状态寄存器xPSR任务控制块保存任务的栈顶指针(SP)和其他调度信息ARM架构中的寄存器内容类型内容描述自动保存寄存器R0 ~ R3,R12,LR,PC,xPSR由硬件在异常(中断)进入时自动压栈手动保存寄存器R4~R11由 FreeRTOS 的上下文切换汇编代码手动压栈特殊寄存器SP、LR、PSP/MSP栈指针、返回地址,决定任务能否正确返回。
2025-04-25 21:14:00
1000
原创 STM32八股【6】-----CortexM3的双堆栈(MSP、PSP)设计
线程模式:正常代码执行时的模式(如 main 函数、FreeRTOS任务)可以是特权级(使用MSP)也可以是非特权级(使用PSP)异常模式:正在执行中断服务程序永远是特权级,使用MSP。
2025-04-25 21:13:38
806
原创 实习技能记录【3】-----Git操作
区域名称英文名说明相关命令工作区你当前编辑的目录,包含所有可见的项目文件git status暂存区暂时保存你准备提交的文件修改(git add后进入)git addgit reset本地仓库提交后的版本快照,存储于.git目录中git commitgit log远程仓库(可选)GitHub、Gitee 等远程平台上的仓库,用于多人协作git pushgit pull。
2025-04-08 18:20:08
466
原创 实习技能记录【2】-----LVGL[基本概念]
屏幕是 LVGL 应用程序中的顶层容器。它是用户界面的根对象,所有的可见 UI 元素最终都会添加到某个屏幕上(通常是活动屏幕)。作为其他 UI 元素的父对象。可以拥有自己的背景颜色、背景图片等样式。LVGL 可以管理多个屏幕,但在任何给定时刻只有一个屏幕是“活动的”并显示给用户。可以通过函数如或来加载和切换不同的屏幕。可以使用获取当前活动屏幕的指针。: 屏幕本身也是一个lv_obj_t对象,只是它是最顶层的,没有父对象(除了内部的显示驱动器)。
2025-04-08 16:43:09
678
原创 C/C++编程【1】----- 网络socket编程
1.1 计算机网络概述(TCP/IP、UDP、HTTP等协议)1.2 套接字(Socket)基础概念2.1 TCP 编程3.1 阻塞 I/O(Blocking I/O)3.1 非阻塞 I/O(Non-Blocking I/O)3.1 I/O 复用
2025-03-31 20:26:23
223
原创 STM32八股【2】-----ARM架构
寄存器名称作用R0-R3通用寄存器用于数据传递、计算及函数参数传递;R0 也用于存储函数返回值。R4-R12通用寄存器用于存储局部变量,减少频繁的内存访问。R13栈指针 (SP)指向当前栈顶,负责管理栈操作。分为主栈指针 (MSP)和进程栈指针 (PSP):系统中断处理和普通任务可以使用不同的栈。栈指针用于管理栈的操作,包括函数调用时保存现场和中断处理时保存寄存器状态。R14链接寄存器 (LR)保存函数调用返回的地址,函数返回时恢复程序执行。R15程序计数器 (PC)
2025-03-21 20:57:55
1799
原创 STM32八股【1】-----启动流程和startup文件理解
请解释STM32微控制器的启动过程,从上电到用户主程序的执行,包括主堆栈指针(MSP)和程序计数器(PC)的初始化。启动文件中定义了堆栈和堆的大小。请解释它们在嵌入式系统中的作用,以及如何根据应用需求确定它们的大小。在启动文件中,Reset_Handler的作用是什么?它通常执行哪些关键任务来准备系统运行?在STM32的启动文件中,向量表的作用是什么?它通常位于存储器的哪个区域,为什么?
2025-03-21 20:06:55
744
原创 FreeRtos学习笔记【9】-----延时函数
FreeRtos的延时函数一、绝对模式vTaskDelayUntil() 绝对模式延时函数保证延时时间严格但中断会打断函数导致延时时间变化。二、相对模式vTaskDelay() 相对模式延时函数使用前将INCLUDE_vTaskDelay 置 1相对模式的延时时间不精确,根据情况不同延时时间会变化。...
2021-02-18 16:05:12
569
1
原创 如何快速理解模糊PID---(二)
模糊控制规则上文只介绍了误差这一个输入量,我们可以用相同的方法对误差的变化率这一输入量进行模糊化。模糊控制规则主要有两种,Mamdini和T-S型模糊控制器这里只介绍Mamdini型模糊控制器Mamdini型模糊控制器就是一堆“如果 x是U1 y是U2 那么 z是W1”的语句组成先上图设误差为E,误差的变化率为EC,而输出量我们也用上文的方法将他划分出六个区域,并规定出它的模糊论域(NB,NM,NS,Z0,PS,PM,PB)例如我们规定输出也是介于 (- 90 , + 90) 之间的
2021-02-09 14:46:18
8160
6
原创 如何快速理解模糊PID算法 ---(一)
一、前言想通过此文章够快速理解模糊PID的前提条件是:已经了解PID控制算法,并且利用该算法控制过一些玩意。这篇文章是我参考了四篇学位论文之后写下的,如果有错误,恳请各位大佬批评指正,后面我也会提到这几篇论文关于模糊PID的不足(不全面)的地方。二、传统PID的缺点以及为什么我们要使用模糊PID使用过PID的同学都知道,PID控制器是一个简单但是控制效果非常好的算法。PID算法有很多种类,包括位置式,增量式,单级,串级等等。如果参数整定的好,那么在一定的情况下,PID控制器是可以做到非常不错的
2021-02-09 04:26:02
17587
3
原创 FreeRtos学习笔记【8】-----串口控制CAN控制的电机
一、实现的功能能够接收串口输入的数据数据范围设定为 0 — 65535,并设置超出范围设置错误提示利用freertos任务向电机发送数据利用串口控制电机位置二、功能实现省略基础配置首先构建电机增量式位置环float PID_Increase(Error sptr, PID_increase pid, float NowPlace, float Point){ float iError,//当前误差 Increase; //最后得出的实际增量 iError = Po
2021-02-07 00:10:03
3254
4
原创 STM32串口收发
一、与串口收发以及中断相关的函数1 void USART_Init()串口初始化2 void USART_Cmd()使能串口3 void USART_ITConfig()使能中断4 void USART_SendData()发送数据5 uint16_tUSART_ReceiveData();接收数据6 FlagStatus USART_GetFlagStatus()获取状态标志位7 void USART_ClearFlag()清除状态标志位8 ITStatus USART_Ge
2021-02-06 19:09:26
1002
1
原创 FreeRtos学习笔记【7】-----内核控制函数
内核控制函数临界段代码保护临界段是指必须完整运行不能被打断的代码FreeRtos进入临界段之后需要关闭中断,处理完临界段之后再打开中断临界段代码保护函数如下在中断中void Task_test( void * pvParameters){ u16 x; while(1) { x = taskENTER_CRITICAL_FROM_ISR(); //进入临界保护区 vTaskDelay(3000); vTaskGetRunTimeStats(Infor
2021-02-06 16:45:36
145
1
原创 FreeRtos学习笔记【6】-----任务状态等参数的查询
API函数展示实验实验内容:统计各个任务的运行时间和CPU使用时间占比等信息所用API函数:void vTaskGetRunTimeStats( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /* pcWriteBuffer表示存储数据的内存 */首先,在FreeRtosConfig.h中 更改如下两个宏#define configGENERATE_RUN_TIME_STATS 1...
2021-02-06 00:24:39
513
1
原创 Python学习笔记----------------python的数据类型
一、python的数据类型整形浮点型布尔类型e记类型字符串二、类型转换转化成浮点型 float()转化成整形 int()转化成字符串 str()1、int()浮点型转化成整形,python直接将小数部分砍掉2、str()将其他数据类型的数据变成字符串类型的数据二、type()和isinstance()函数type()函数用于获取某一变量的数据类型isinstance()有两个参数,第一个是变量,第二个是给定的数据类型isinstance函数用来判断变量的类型
2021-02-05 21:23:15
175
原创 Python学习笔记-----------基本函数
一、input,print函数和变量变量不需要定义temp = input("请输入")test = int(temp)print(test)运行结果二、if函数temp = input("请输入")test = int(temp)if test>5: print("比五大")else: print("比五小")运行结果注意事项:if后空格然后写条件,条件后跟冒号,冒号后按回车自动在下一行缩进。若条件为真则执行缩进后的语句,若为假则执行else:下一行缩进后的语
2021-02-05 21:06:11
200
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人