【stm32单片机】[Hal库][嵌入式][1]嵌入式工程模板与“任务调度器”
一、任务调度器
1. 调度器结构体
函数指针和指针函数:C语言基础知识:函数指针&指针函数(定义格式、作用及用法说明)_指针函数的定义-CSDN博客
PS: 函数指针本身上还是一个指针,和一般指针没有区别,指向函数的执行地址
1234567//调度器类型的结构体类型声明//任务结构typedef struct { void (*task_func)(void);//函数指针 uint32_t rate_ms;//任务运行周期 uint32_t last_run;//上次运行时间} scheduler_task_t;
typedef struct {} scheduler_task_t;是⼀种定义新结构体类型的⽅式,这⾥定义 了⼀个名为 scheduler_task_t 的结构体类型。这个结构体类型包含三个成员。
void *task_func(void);定义了一个函数指针,用于储存任务函数的地址,便于进行任务调度
rate_ms表示任务具体的执行周期
last_run⽤于存储任务上次运⾏的时间戳(以毫秒为单位)。该成员⽤于 记录任务上⼀次被 ...
【Tensorflow】[2] 神经网络搭建
一、独热编码
独热编码使用N位代表N种状态,任意时候只有其中一位有效。采用独热编码的例程:
独热编码使用N位代表N种状态,任意时候只有其中一位有效。
采用独热编码的例子
12345性别: [0, 1]代表女,[1, 0]代表男数字0-9: [0,0,0,0,0,0,0,0,0,1]代表9,[0,1,0,0,0,0,0,0,0,0]代表1
独热编码的优点在于
能够处理非连续型数值特征
在一定程度上也扩充了特征。比如性别本身是一个特征,经过编码以后,就变成了男或女两个特征。
适合分类
在神经网络中,独热编码其实具有很强的容错性,比如神经网络的输出结果是 [0,0.1,0.2,0.7,0,0,0,0,0, 0]转成独热编码后,表示数字3。即值最大的地方变为1,其余均为0。[0,0.1,0.4,0.5,0,0,0,0,0, 0]也能表示数字3。
numpu中有一个函数,numpy.argmax()可以取得最大值的下标。
二、神经网络训练的重要概念
1. 输入(x)输出(y)、标签(label)
输入是指传入给网络处理的向量,相当于数学函数中的变量。
输出是指网络处理后返回的结 ...
【Git学习】[3]标签管理
前言
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针
使用tag命名指向历史版本号,能够更好的进行代码管理
一、创建标签
查看分支
1git branch
创建新的标签
1git tag v1.0
查看所有标签
1git tag
查看历史提交
1git log --pretty=oneline --abbrev-commit
比如要对->“博客备份”这次打标签
1git tag v0.9 607328c
查看标签信息,注意:```tag``是按字母顺序排列的
1git show v0.9
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
1git tag -a v0.1 -m "version 0.1 released" 1094adb
二、操作标签
删除标签
注意:对标签的操作都在本地,不会影响远程
1git tag -d v0.1
如果要推送标签到远程仓库,使用:
1git push origin v1.0
一次性推送全部尚未推 ...
【Git学习】[2]分支管理
创建与合并分支 - Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
一、分支的创建
1. 分支创建
我们创建dev分支,然后切换到dev分支:
12$ git checkout -b devSwitched to a new branch 'dev'
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
123$ git branch dev$ git checkout devSwitched to branch 'dev'
然后提交:
1234$ git add readme.txt $ git commit -m "branch test"[dev b17d20e] branch test 1 file changed, 1 insertion(+)
dev 分支的任务完成,就可以切换分支了
二、分支的管理
1. 查看分支
2. 切换分支
3. 合并分支
完成之后,master分支上的修改在main上也能看到了
4. 删除分支
1git branch -d dev
【深度学习】[1]神经网络的基本概念
一、神经网络的基本概念
1. 神经元(感知器)
一种被称为感知器的人工神经元在20世纪五六十年代被科学家Frank提出。通过数学模型,可以认识到感知器是一个根据输入与权重来做出决定的设备,随着权重和阈值的变化,可以得到不同的决策模型。当一个感知器计算后得到的值大于阈值时,从神经学的角度来讲这个感知器被激活,反之为0。感知器可以一定程度上模仿人脑做出决策,但是感知器的决策过程全部是线性的,在处理图像处理、语音识别等复杂问题时,难以仅靠线性模型达到良好的识别效果,因此需要在感知器模型种引入非线性部分。
2. 非线性神经元
为解决复杂的数学模型,引入激活函数,激活函数给神经元带来了非线性因素,使得神经网络可以任意逼近任何非线性函数。
通常将激活函数与线性神经元合并使之成为非线性神经元
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。
激活函数可以分为两大类:
饱和激活函数: sigmoid、 tanh…
非饱和激活函数: ReLU 、Leaky Relu 、ELU、PReLU、 ...
【stm32单片机】[Hal库][2]stm32时钟树
一、锁相环的原理与应用
参考文章:【STM32】知识补充 锁相环原理与应用解析_stm32数字锁相-CSDN博客
什么是锁相环 (PPL)
锁相环是一种闭环反馈控制系统. 用于生成与输入信号同步且相位相同的输出信号. 它的核心功能是在输入信号的相位变化时, 自动调整输出信号以保持同步. 这使得锁相环成为了一种理想的频率和相位控制技术.
锁相环的基本组成
锁相环主要由以下几个部分组成:
相位比较器 (Phase Detector): 相位比较器负责比较输入信号和反馈信号的相位差, 并将其转换为电压信号
低通滤波器 (Low-Pass Filter): 低通滤波器对相位比较器的输出信号进行滤波, 以消除高频噪声和相位抖动
电压控制振荡器 (Voltage-Controlled Oscillator): 根据低通过滤波器的输出电压调整输出信号的频率和相位
反馈分频器 (Feedback Divider): 反馈分频器对 VCO 的输出信号进行分频处理, 并将其反馈给相位比较器
【Tensorflow】[1]配置Tensorflow-GPU的快速模型训练
author: sz_jmu
前言
TensorFlow 是一个用于机器学习和深度学习的开源框架,由 Google Brain 团队开发并在 2015 年发布。它是目前最流行的深度学习框架之一,广泛用于构建、训练和部署机器学习模型,特别是在处理复杂的神经网络任务时。TensorFlow 提供了灵活的工具和库,支持从研究到生产环境中的机器学习应用。
TensorFlow可以支持CPU,也可以支持CPU+GPU,前者配置较为简单,兼容性较好,后者需要一些额外的操作支持。
在训练规模庞大的模型时,使用CPU往往存在较大的性能限制,模型训练速度较慢。神经网络算法通常涉及大量的参数、激活值、梯度值的缓冲区,其中每个值在每一次训练迭代中国都要被完全更新,有可能会超出传统计算机的高速缓存(Cache),所以内存带宽通常会成为主要瓶颈。而与CPU相比,GPU的一个显著优势就是具有极高的内存带宽。神经网络的训练算法通常不涉及大量的分支运算和复杂控制指令,更适合在GPU硬件上完成,具有并行特性的GPU更适合神经网络的计算,因此,安装TensorFlow的GPU环境是合适的选择。
参考文章:
解决tens ...
【TI】[2]常见外设的基本配置
Sysconfig界面:
1.波特率,数据格式的配置
2.中断使能配置
3.引脚配置
PS:LP-G3507开发板上用于板载调试的串口与单片机的PA11和PA10连接(跳线帽),配置这两个引脚可以直接通过MicroUSB接口与主机进行串口通信
库函数使用
1.初始化部分
12NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);//清除串口中断标志位NVIC_EnableIRQ(UART_0_INST_INT_IRQN);//使能串口中断
2.中断配置
1234567891011void UART_0_INST_IRQHandler(void){ switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) { case DL_UART_MAIN_IIDX_RX: gEchoData = DL_UART_Main_receiveData(UART_0_INST); DL_UART_Main_transmitData(UART ...
【电赛】[2023E题]运动控制与目标追踪系统复刻[视觉部分]
# 注意
本项目创建时间:2024-7-17
本文标记为OpenCV入门参考项目以及电赛典型范例,由题主长期维护 --2024-10-2
一、图像处理方案
Opencv: 开源计算机视觉处理库,使用嵌入式SOC板卡作为摄像头模块,提供相对可靠的性能。
由于激光点的亮度远高于其他位置,所以采用HSV格式的色彩空间,对图像H,S,V域进行识别。
若要区分红绿激光,那么就对图像的RGB空间进行处理
2. 电工胶带的识别
使用原图像->灰度图像->设置阈值后进行二值化的方法,使得黑胶带区域识别为纯白色,其余部分全部为纯黑色区域。关于调参:建议使用创建滑块窗口的方法,进行动态调参,减少调参上浪费的时间。
摄像头容易受到外接环境光的干扰,可以通过调节分辨率,设置摄像头的图像获取范围,也有一种更为实用的方法:ROI(感兴趣区),可以通过创建掩膜的方式,只对ROI区域进行处理,这样就排除了外界环境的干扰。当然也可以使用切片的方法,定义一个变量用于读取图像的指定范围,然后再进行图像处理,需要显示参数时,再将一些特征点、辅助线、坐标点、数据显示在想要观看的图像上,使用opencv ...
【TI】-1-Sysconfig工具使用(GPIO、定时器为例)
一、编译器CCS Theia的基本使用
本文主要介绍通过CCS Theia以及Sysconfig的基本使用方法,将以GPIO和定时器为例,泛化性地介绍CCS Theia这个工具,便于其他外设配置的理解,对于CCS Theia IDE的安装及其环境配置,不做多赘述。
1. 范例程序的导入
步骤:
选择File -> import Project(s)
选择SDK中官方示例的地址,本文安装路径为:S:\ti\mspm0_sdk_2_01_00_03\examples\nortos\LP_MSPM0G3507\driverlib
gcc:代表C++方式编程的工程格式
ticlang:代表TI官方IDE的工程格式
2. Sysconfig界面
Sysconfig界面是TI推出的图形化界面配置,类似于ST 的CubeMX,能够极大简化对于单片机外设的初始化配置,更容易上手,但是这也需要我们正确小心地去使用这个工具,错误的配置很容易导致单片机无法正常工作。
一般的,在我们使用CCS Theia配置工程时,CCS成功加载工程文件后会显示一些特殊图标( ...
【yolov5】[1]初探目标检测算法--YOLOv5的训练及在地平线RDK X3上的快速部署
一、Windows环境下的模型训练
针对YOLO的模型训练环境配置,Windows端兼容性差于Ubuntu,如果电脑上有Ubuntu系统,建议用Ubuntu系统进行训练(但注意,虚拟机安装的Ubuntu系统无法使用物理GPU进行训练)。
YOLO版本:YOLOV5 7.0
准备好目标模型对应的图片数据集,使用labelme命令,启动数据集打标工具
2. 模型的训练和导出ONNX
2.1 环境配置
Anoconda可以区分不同的环境,不同的环境下可以使用的命令是不同的
创建环境
1conda create -n yolov5_7.0 python==3.8.5
列举所有环境
1conda env list
删除’环境
1conda env remove --name <env_name>
激活环境
1conda activate <env_name>
如配置好yolo的环境,安装好pytorch,cuda,yolo相关依赖,就需要使用conda activate yolov5_7.0激活
2.1.1 常见问题:
Anoconda环境下无法识别到CU ...