Infineon_TC264智能车代码初探及C语言深度学习(二)

本篇文章记录我在智能车竞赛中,对 Infineon_TC264 这款芯片的底层库函数的学习分析。通过深入地对其库函数进行分析,C语言深入的知识得以再次在编程中呈现和运用。故觉得很有必要在此进行记录分享一下。

 

目录

​编辑

一、代码段分析 

NO.1 指向结构体的指针

NO.2 单片机的FIFO

NO.3 单片机的DMA 

 NO.4 结构体指针作为函数的入口参数

 NO.5 结构体的嵌套使用

NO.6 初探双核单片机TC264


一、代码段分析 

NO.1 指向结构体的指针

在这段代码中motor_t * motor 是一个指向 motor_t 结构体的指针。这种写法表示 motor 是一个指针变量,指向类型为 motor_t 的结构体变量。通过使用指针,可以在函数内部直接修改结构体的内容,而无需传递整个结构体的副本,从而节省内存空间并提高效率。

在函数中,通过传递 motor 指针作为参数,可以在函数内部访问和操作该结构体变量的成员。通过指针操作,可以对结构体的成员进行读取或修改,包括调整电机的参数、控制电机的运动等操作。指针作为一种强大的工具,用于在函数之间传递和操作复杂的数据结构,如结构体。

NO.2 单片机的FIFO

在单片机中,FIFO表示先进先出(First In, First Out)的缓冲区或队列。FIFO通常用于临时存储数据,以便在处理器和外设之间传输数据时进行缓冲和调节速度。

在单片机中,FIFO通常是一个硬件模块,用于暂时存储数据。当数据被写入FIFO时,它被放置在FIFO的尾部;而当数据被读取时,它从FIFO的头部被取出,保持了数据的顺序性。

FIFO的常见用途包括:

  1. 通信接口:在串行通信中,FIFO可用于暂存接收到的数据或等待发送的数据,以便缓解处理器的负担。

  2. DMA(Direct Memory Access):在DMA传输中,FIFO可以暂存要传输的数据,以便DMA控制器按照一定的速率将数据传输到目标设备或内存中。

  3. 数据采集:在数据采集系统中,FIFO可用于临时存储传感器数据,以便后续处理。

  4. 多任务处理:在实时系统中,FIFO可用于处理不同优先级任务之间的数据传输,确保数据按照先进先出的原则进行处理。

NO.3 单片机的DMA 

DMA(Direct Memory Access)是单片机中的一种数据传输方式,它允许外设直接和内存之间进行数据传输,而无需通过中央处理器(CPU)的干预。

在传统的数据传输方式中,CPU负责从外设读取数据,并将数据写入内存,或者从内存读取数据并将数据发送到外设。这种方式会占用CPU的时间和资源,限制了系统的性能和效率。

而DMA可以解决这个问题。DMA控制器作为一个独立的硬件模块,可以直接访问内存,并与外设进行数据传输,而不需要CPU的介入。

使用DMA传输数据的基本过程如下:

  1. 配置DMA控制器:首先,需要配置DMA控制器,包括设置数据传输的方向(从外设到内存,或从内存到外设)、源地址和目的地址、传输数据的大小等参数。

  2. 启动DMA传输:一旦DMA控制器配置完成,可以启动DMA传输。DMA控制器开始从外设读取数据或向外设写入数据,直接与内存进行数据交换,而不需要CPU的介入。

  3. 完成DMA传输:当DMA传输完成后,DMA控制器会发出中断信号,通知CPU数据传输已经完成。

通过使用DMA,单片机可以在不占用CPU资源的情况下进行高速的数据传输。这对于需要高效处理大量数据的应用非常有用,如音频、视频处理,以及高速通信等。

需要注意的是,DMA的具体实现和功能会因单片机型号和厂商而异。因此,在使用DMA时,需参考所使用单片机的技术手册和相关资料,了解具体的配置和操作方法。

 NO.4 结构体指针作为函数的入口参数

这段代码是用来初始化一个电机的函数。它接受一个指向 motor_t 结构体的指针作为参数,并使用该结构体中的信息来初始化电机的GPIO、编码器和PWM等部分。

首先,它调用 gpio_init 函数来初始化电机的使能引脚(EN_pin),然后调用 encoder_quad_init 函数来初始化电机的编码器,接着调用 pwm_init 函数来初始化电机的PWM信号,最后调用 gpio_init 函数来初始化电机的方向控制引脚(DIR_pin)。

在这段代码中,假设 motor_t 结构体包含了所有必要的信息来初始化电机所需的各个部分,而这些信息则通过 motor 指针传递进来。

 NO.5 结构体的嵌套使用

这段代码是对 motor_t 结构体变量 motor_xia 进行初始化赋值。

 

NO.6 初探双核单片机TC264

双核单片机相对于单核单片机来说,具有以下区别:

  1. 性能更强:双核单片机拥有两个处理核心,可以同时运行多个任务,提高处理性能和效率。

  2. 更高的可靠性:双核单片机可以实现双核热备份,一旦一个核心出现问题,另一个核心可以继续工作,提高系统的稳定性和可靠性。

  3. 更灵活的应用:双核单片机可以将不同的任务分配给不同的核心处理,实现并行处理,适用于复杂的应用场景。

总的来说,双核单片机相比于单核单片机在性能、可靠性和应用方面都有明显的优势,适合需要更高处理性能和稳定性要求的应用场景。

双核单片机的设计通常会考虑到避免核心之间的冲突。在设计上,双核单片机通常会采用独立的缓存系统、总线结构等来确保两个核心能够独立运行而不会相互干扰。

此外,软件开发人员在编写应用程序时也需要注意避免核心之间的冲突。他们可以通过合理分配任务、使用同步机制等方式来确保双核系统的稳定运行,避免核心之间的竞争和冲突。

在双核系统中,同一个变量在不同核心中运行时,最终的值可能会取决于具体的情况和系统设计。由于每个核心都有自己的寄存器和缓存,可能会导致变量的值在两个核心之间发生不同步。

如果在双核系统中需要多个核心之间共享变量,并且需要保证变量的一致性,通常需要使用同步机制来确保数据的一致性,比如使用锁、信号量、互斥量等。这样可以避免出现数据竞争和不一致的情况,保证变量的最终值是符合预期的。

因此,要确保在双核系统中对同一个变量进行操作时能够得到正确的结果,开发人员需要特别注意同步机制的使用,以避免数据竞争和不确定性的情况发生。

 如何进行同步机制呢?

在双核系统中,可以采用以下几种常见的同步机制来确保对共享变量的操作是有序且正确的:

  1. 锁(Lock):使用锁机制可以确保在一个核心执行某段代码时,其他核心无法同时执行该段代码。常见的锁包括互斥锁(Mutex)和自旋锁(Spinlock),可以根据具体需求选择适合的锁类型。

  2. 信号量(Semaphore)信号量是一种计数器,用于控制多个核心对共享资源的访问。核心在访问共享资源之前需要先获取信号量,如果信号量计数为0,则核心会被阻塞,直到其他核心释放信号量。

  3. 互斥量(Mutex)互斥量是一种特殊的锁,用于保护共享资源的访问。只有获取到互斥量的核心才能访问共享资源,其他核心需要等待互斥量释放后才能进行访问。

  4. 条件变量(Condition Variable)条件变量用于实现核心之间的等待和唤醒机制。一个核心可以等待某个条件满足后再继续执行,而其他核心可以在满足条件时通知等待的核心继续执行。

这些同步机制可以根据具体的应用场景和需求选择使用。在代码编写中,需要谨慎地使用同步机制,确保正确地获取和释放锁、信号量等,以避免死锁和竞态条件等问题的发生。此外,一些双核单片机芯片也提供了特定的硬件支持来简化同步操作的实现,可以根据具体芯片的文档进行使用和配置。

如何在双核系统中使用互斥锁(Mutex)来对共享资源进行加锁和解锁操作?

#include <stdio.h>
#include <pthread.h>// 定义共享资源
int shared_resource = 0;// 定义互斥锁
pthread_mutex_t mutex;// 线程函数1,对共享资源递增
void *thread_func1(void *arg) {for (int i = 0; i < 1000000; i++) {// 加锁pthread_mutex_lock(&mutex);shared_resource++;// 解锁pthread_mutex_unlock(&mutex);}return NULL;
}// 线程函数2,对共享资源递减
void *thread_func2(void *arg) {for (int i = 0; i < 1000000; i++) {// 加锁pthread_mutex_lock(&mutex);shared_resource--;// 解锁pthread_mutex_unlock(&mutex);}return NULL;
}int main() {pthread_t thread1, thread2;// 初始化互斥锁pthread_mutex_init(&mutex, NULL);// 创建线程1pthread_create(&thread1, NULL, thread_func1, NULL);// 创建线程2pthread_create(&thread2, NULL, thread_func2, NULL);// 等待线程结束pthread_join(thread1, NULL);pthread_join(thread2, NULL);// 销毁互斥锁pthread_mutex_destroy(&mutex);// 打印共享资源的最终值printf("Final value of shared_resource: %d\n", shared_resource);return 0;
}

在上面的代码中,通过创建两个线程并分别对共享资源进行递增和递减操作,使用互斥锁来保护共享资源的访问。在每个线程对共享资源进行操作之前,先调用 pthread_mutex_lock() 加锁,操作完成后再调用 pthread_mutex_unlock() 解锁。这样可以确保同一时刻只有一个线程可以访问共享资源,避免数据竞争和不一致性的问题。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSDN 编辑器设置图片缩放和居中

CSDN 编辑器设置图片缩放和居中 文章目录 CSDN 编辑器设置图片缩放和居中对齐方式比例缩放 对齐方式 Markdown 编辑器插入图片的代码格式为 ![图片描述](图片路径)CSDN 的 Markdown 编辑器中插入图片&#xff0c;默认都是左对齐&#xff0c;需要设置居中对齐的话&#xff0c;…

QTextToSpeech的使用——Qt

前言 之前随便看了几眼QTextToSpeech的帮助就封装使用了&#xff0c;达到了效果就没再管了&#xff0c;最近需要在上面加功能&#xff08;变换语速&#xff09;&#xff0c;就写了个小Demo后&#xff0c;发现不对劲了。 出现的问题 场景 写了个队列添加到语音播放子线程中&a…

HTTPS基础

目录 HTTPS简介 HTTP与HTTPS的区别 CA证书 案例 服务器生成私钥与证书 查看证书和私钥存放路径 Cockpit(图像化服务管理工具) HTTPS简介 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容&#xff0c;不提供任何方式的数据加密&…

C++——类和对象(1)

1. 面向对象和面向过程对比 当涉及到编程范式时&#xff0c;两个主要的方法是面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;和面向过程编程&#xff08;Procedural Programming&#xff09;。这两种编程范式在解决问题和组织代码时有着不同…

COX回归影响因素分析的基本过程与方法

在科学研究中&#xff0c;经常遇到分类的结局&#xff0c;主要是二分类结局&#xff08;阴性/阳性&#xff1b;生存/死亡&#xff09;&#xff0c;研究者可以通过logistic回归来探讨影响结局的因素&#xff0c;但很多时候logistic回归方法无法使用。如比较两种手段治疗新冠肺炎…

Annaconda环境下ChromeDriver配置及爬虫编写

Anaconda环境的chromedriver安装配置_anaconda 配置chromedriver-CSDN博客 Chromedriver驱动( 121.0.6167.85 ) - 知乎 下载好的驱动文件解压&#xff0c;将exe程序复制到Annaconda/Scripts目录以及Chrome/Application目录下 注意要提前pip install selenium包才能运行成功&a…

BEV系列一:BEV介绍和常用BEV算法简介

BEV系列一&#xff1a;BEV介绍和常用BEV算法简介 自动驾驶最全学习资料获取&#xff1a;链接

Linux操作系统——线程概念

1.什么是线程&#xff1f; 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行&#xff0c;本质是在进程地址空间内运行在Linux系统中&#x…

openGauss学习笔记-242 openGauss性能调优-SQL调优-典型SQL调优点-SQL自诊断

文章目录 openGauss学习笔记-242 openGauss性能调优-SQL调优-典型SQL调优点-SQL自诊断242.1 SQL自诊断242.1.1 告警场景242.1.2 规格约束 openGauss学习笔记-242 openGauss性能调优-SQL调优-典型SQL调优点-SQL自诊断 SQL调优是一个不断分析与尝试的过程&#xff1a;试跑Query&…

【Qt】常用控件或属性(1)

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、QWidget属性一览 二、控件button、属性enabled(可用状态) 三、属性geometry(修改位置和尺寸) 1、QRect类型的结…

微信小程序之tabBar

1、tabBar 如果小程序是一个多 tab 应用&#xff08;客户端窗口的底部或顶部有 tab 栏可以切换页面&#xff09;&#xff0c;可以通过 tabBar 配置项指定 tab 栏的表现&#xff0c;以及 tab 切换时显示的对应页面。 属性类型必填默认值描述colorHexColor是tab 上的文字默认颜色…

Leetcode 3.14

Leetcode hot100 二叉树1.二叉树的层序遍历2.验证二叉搜索树3.二叉树的右视图 二叉树 1.二叉树的层序遍历 二叉树的层序遍历 二叉树的层序遍历可以用先进先出的队列来实现。 将每一层的所有node都添加到队列中&#xff0c;记录下当前队列的长度&#xff0c;即该层的元素数量&…

『 Linux 』进程替换( Process replacement ) 及 简单Shell的实现(万字)

文章目录 &#x1f984; 进程替换&#x1f9a9; execl()函数&#x1f9a9; execlp()函数&#x1f9a9; execle()函数&#x1f9a9; execv()函数&#x1f9a9; execvp()函数&#x1f9a9; execvpe()函数&#x1f9a9; execve()函数 &#x1f984; 简单Shell命令行解释器的实现&a…

【漏洞复现】ChatGPT-Next-Web SSRF漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Python-sklearn-diabetes项目实战

目录 1 下载数据集和预处理 1.1 加载/下载数据集 1.2 数据可视化 1.3 数据清洗 1.4 特征工程 1.5 构建特征集和标签集 1.6 拆分训练集和测试集 2 训练模型 2.1 选择算法和确定模型 2.2 训练拟合模型 3 评估并优化模型性能 本文以糖尿病数据集diabetes为基础进行线性…

【Node.js从基础到高级运用】十一、构建RESTful API

在本篇博客中&#xff0c;我们将综合之前讨论的内容&#xff0c;深入探索如何使用Node.js构建一个RESTful API。我们将重点讨论设计合理的API端点&#xff0c;展示如何通过代码实现这些端点&#xff0c;并指导如何使用Postman测试我们的API&#xff0c;确保其按预期工作。 前提…

完美解决 RabbitMQ可视化界面Overview不显示折线图和队列不显示Messages

问题场景&#xff1a; 今天使用docker部署了一个RabbitMQ&#xff0c;浏览器打开15672可视化页面发送消息后不显示Overview中的折线图&#xff0c;还有队列中的Messages&#xff0c;因为我要看队列中的消息数量。 解决方案&#xff1a; 进入容器内部 docker exec -it 容器id…

Spring Cloud Gateway如何实现熔断

Spring Cloud Gateway熔断集成 熔断应用&#xff1a; 金融市场中的熔断机制&#xff1a;在金融交易系统中&#xff0c;熔断机制&#xff08;Circuit Breaker&#xff09;是一种市场保护措施&#xff0c;旨在预防市场剧烈波动时可能导致的系统性风险。当某个基准指数&#xff08…

MySQL数据库(5)——逻辑处理

逻辑处理 在MySQL中&#xff0c;可以使用逻辑运算符和条件语句来进行逻辑处理。 1.逻辑运算符 and 与or 或not 非 这里用法与Java中的用法相同&#xff0c;只是语法发生了部分变化。 2.case——when逻辑处理 语法&#xff1a; case when 条件 then 结果1 else 结果2 end 注…

基于springboot实现驾校信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现驾校信息管理系统演示 摘要 随着人们生活水平的不断提高&#xff0c;出行方式多样化&#xff0c;也以私家车为主&#xff0c;那么既然私家车的需求不断增长&#xff0c;那么基于驾校的考核管理也就不断增强&#xff0c;那么业务系统也就慢慢的随之加大。信息…