当前位置: 首页 > news >正文

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() 解锁。这样可以确保同一时刻只有一个线程可以访问共享资源,避免数据竞争和不一致性的问题。 

相关文章:

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

本篇文章记录我在智能车竞赛中&#xff0c;对 Infineon_TC264 这款芯片的底层库函数的学习分析。通过深入地对其库函数进行分析&#xff0c;C语言深入的知识得以再次在编程中呈现和运用。故觉得很有必要在此进行记录分享一下。 目录 ​编辑 一、代码段分析 NO.1 指向结构体…...

第十三届蓝桥杯(C/C++ 大学B组)

目录 试题 A: 九进制转十进制 试题 B: 顺子日期 试题 C: 刷题统计 试题 D: 修剪灌木 试题 E: X 进制减法 试题 F: 统计子矩阵 试题 G: 积木画 试题 H: 扫雷 试题 I: 李白打酒加强版 试题 J: 砍竹子 试题 A: 九进制转十进制 九进制正整数 ( 2022 )转换成十进制等于多…...

数据结构从入门到精通——排序的概念及运用

排序的概念及运用 前言一、排序的概念排序稳定性内部排序外部排序 二、排序运用三、常见的排序算法四、排序性能检测代码srand()clock() 五、oj排序测试代码 前言 排序是将数据按照一定规则重新排列的过程&#xff0c;常见规则有升序、降序等。排序算法如冒泡排序、快速排序等…...

react面试题总结

1、当调用 setState的时候&#xff0c;发生了什么操作&#xff1f; 当调用 setState时&#xff0c; React做的第一件事是将传递给setState的对象合并到组件的当前状态&#xff0c;这将启动一个称为和解&#xff08; reconciliation&#xff09;的过程。 和解的最终目标是&#…...

5_springboot_shiro_jwt_多端认证鉴权_禁用Cookie

1. Cookie是什么 ​ Cookie是一种在客户端&#xff08;通常是用户的Web浏览器&#xff09;和服务器之间进行状态管理的技术。当用户访问Web服务器时&#xff0c;服务器可以向用户的浏览器发送一个名为Cookie的小数据块。浏览器会将这个Cookie存储在客户端&#xff0c;为这个Co…...

条形码申请指南:外地人如何成功注册香港条形码

香港条形码是打造的通行证&#xff0c;消费者对香港条码有一定的认知&#xff0c;拥有香港条形码就获得消费者对产品的认可&#xff0c;香港条形码是全球条码中具有防伪功能的条形码&#xff0c;化妆品、护肤品、保健品、包装食品等行业的产品认证&#xff0c;就有必要申请香港…...

Covalent Network借助大规模的历史Web3数据集,推动人工智能发展

人工智能在众多领域中增强了区块链的实用性&#xff0c;反之亦然&#xff0c;区块链确保了 AI 模型所使用的数据的来源和质量。人工智能带来的生产力提升&#xff0c;将与区块链系统固有的安全性和透明度融合。 Covalent Network&#xff08;CQT&#xff09;正位于这两项互补技…...

test测试类-变量学习

test测试类 作用&#xff1a;标记到类上成为测试类&#xff0c;标记到方法上成为测试方法 变量&#xff1a;测试类的变量&#xff0c;在测试类括号中应用 1、invocationCount变量 意思是这个方法应该被调用的次数。 在测试框架中&#xff0c;特别是当使用参数化测试或数据驱动…...

【DL经典回顾】激活函数大汇总(二十七)(Bent Identity附代码和详细公式)

激活函数大汇总&#xff08;二十七&#xff09;&#xff08;Bent Identity附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可或…...

element-plus el-table表格默认选中某一行

需求&#xff1a;进入页面时默认选中表格第一行 <el-tableref"singleTableRef":data"tableData"highlight-current-rowrow-click"handleCurrentChange" ><el-table-column property"date" label"日期" /><…...

Vue+SpringBoot打造民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…...

基于单片机的模糊PID炉温控制系统设计

摘 要 电热炉是在工业热处理的生产中广泛使用的一种设备&#xff0c;电热炉的温度控制系统存在时变性&#xff0c;非线性&#xff0c;滞后性等特征&#xff0c;难以用常规PID的控制器对系统达到很好的控制效果。当控温精度的要求高时&#xff0c;使用传统的控制理论方法难以达…...

深入浅出落地应用分析:AI数字人「微软小冰」

hi,各位,今天要聊的是AI小冰,机缘巧合,投递了这家公司的产品,正好最近在看数字人相关的,就详细剖析下这款产品! 前言 小冰,全称为北京红棉小冰科技有限公司,前身为微软(亚洲)互联网工程院人工智能小冰团队,是微软全球最大的人工智能独立产品研发团队。作为微软全…...

【早鸟优惠|高录用|EI稳定检索】2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)诚邀投稿/参会!

【早鸟优惠|高录用|EI稳定检索】 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;ICVISP 2024&#xff09;诚邀投稿/参会&#xff01; # 早鸟优惠 # 先投稿先送审 # #投稿免费参会、口头汇报及海报展示# 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;I…...

CPU设计实战—异常处理指令

异常类型以及精确异常的处理 异常有点像中断&#xff0c;处理完还要回到原来的状态&#xff0c;所以需要对之前的状态进行保存。本CPU主要实现对以下异常的处理&#xff1a; 1.外部硬件中断 2.复位异常 3.系统调用异常&#xff08;发生在译码阶段&#xff09; 4.溢出异常&…...

Elasticsearch(13) match_phrase的使用

elasticsearch version&#xff1a; 7.10.1 match_phrase 语法 POST <index>/_search {"query": {"match_phrase": {"<field_name>": {"query": "<your_search_phrase>","slop": <max_dis…...

通过路由器监控,优化网络效率

路由器是网络的基本连接组件&#xff0c;路由器监控涉及将路由器网络作为一个整体进行管理&#xff0c;其中持续监控路由器的性能、运行状况、安全性和可用性&#xff0c;以确保更好的操作和最短的停机时间&#xff0c;因此监控路由器至关重要。 为什么路由器监控对组织很重要…...

使用canvas实现图纸标记及回显

图纸 图纸标记后的效果图 最近做的一个qms项目里面&#xff0c;需要前端在图纸上实现标记及标记后的内容还要能够回显&#xff0c;然后后端通过标记的点&#xff0c;去读取标记图纸的内容&#xff0c;如一些公式、数据之类的&#xff0c;目前实现的功能有 在图纸上面进行矩形…...

鸿蒙-自定义组件的生命周期

目录 自定义组件的生命周期 1.aboutToAppear 2.aboutToDisappear 3.onPageShow 4.onPageHide 5.onBackPress 日志输出 1.显示页面 2.页面点击返回按钮 3.页面跳转 4.页面返回 自定义组件的生命周期 先来一段列子 import router from ohos.router Entry Component…...

【Linux】自动化构建工具-make/Makefile

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 认识make/Makefile3. 了解make/Makefile原理3.1 依赖关系和依赖方法3.2 make检测的顺序3.3 PHONY:XXX 4. makefile内置符号 1. 前言 在上一篇中已经了解了【Linux】编译器-gcc/g使用&#xff0c;这次来一起…...

week07day03(power bi dax公式 零售数据业务分析)

一. 切片器(筛选)相关的三个函数 1.all &#xff08;all后面的数据意思是 不受其影响&#xff09; #ALL 筛选的是 筛选器 或 切片器#计算 销售金额 &#xff0c;并且 不受到 门店ID 控制 计算金额 CALCULATE(SUM(销售表[金额]),ALL(销售表[门店ID]))#计算 销售金额 &#x…...

rembg报错onnxruntime_providers_tensorrt.dll

报错&#xff1a; 2024-03-16 04:16:59.4413827 [E:onnxruntime:Default, provider_bridge_ort.cc:1534 onnxruntime::TryGetProviderInfo_TensorRT] D:\a_work\1\s\onnxruntime\core\session\provider_bridge_ort.cc:1209 onnxruntime::ProviderLibrary::Get [ONNXRuntimeErro…...

精酿啤酒:一口啤酒,一份享受

在繁华的都市生活中&#xff0c;我们总是匆匆忙忙&#xff0c;追求着各种目标和成就。然而&#xff0c;在这个过程中&#xff0c;我们往往忽略了生活的本质&#xff0c;那就是享受。而Fendi Club 啤酒&#xff0c;正是为那些追求品质生活的都市精英们量身打造的。 Fendi Club啤…...

git报: “fatal: detected dubious ownership in repository“

“fatal: detected dubious ownership in repository”的中文翻译是&#xff1a;“致命错误&#xff1a;检测到仓库中存在可疑的所有权问题”。 这句话意味着 Git 在检查代码仓库时发现所有权存在问题&#xff0c;可能是由于文件或目录的所有权与 Git 仓库预期的所有权不匹配。…...

代码随想录算法训练营第27天|93.复原IP地址、78.子集、90.子集二

目录 一、力扣93.复原IP地址1.1 题目1.2 思路1.3 代码1.4 总结 二、力扣78.子集2.1 题目2.2 思路2.3 代码2.4 总结 三、力扣90.子集二3.1 题目3.2 思路3.3 代码3.4 总结 一、力扣93.复原IP地址 &#xff08;比较困难&#xff0c;做起来很吃力&#xff09; 1.1 题目 1.2 思路 …...

Java微服务轻松部署服务器

我们在日常开发微服务之后需要再服务器上面部署&#xff0c;那么如何进行部署呢&#xff0c;先把微服务的各个服务和中间件以及对应的端口列举出来&#xff0c;都打包成镜像&#xff0c;以及前端代码部署的nginx&#xff0c;使用docker-compose启动&#xff0c;访问服务器nginx…...

Wordpress站点通过修改.htaccess 设置重定向实现强制 https 访问

要在WordPress站点上通过修改.htaccess文件实现强制HTTPS访问&#xff0c;您可以按照以下步骤进行操作&#xff1a; 登录到WordPress站点管理后台。 在文件管理器或通过FTP访问网站根目录&#xff0c;找到并打开名为 .htaccess 的文件。 在打开的文件中添加以下代码&#xf…...

人大金仓助力国家电网调度中心培养国产数据库专家人才

近日,为进一步提升调度自动化安全可靠水平,提高电网数据应用效能,人大金仓助力国家电网调度中心培养国产数据库专家人才。 调度自动化系统拥有海量电网数据资源,是支撑电网安全经济优质运行的重要保障。数据库是调度自动化系统稳定运行的基石之一,其结构严谨、运行稳定、扩展灵…...

什么是增强型SSL证书?购买一张需要多少钱?

增强型SSL证书是一种提供更高级别安全验证与用户信任度的网络安全工具&#xff0c;也被称为EV证书。相较于DV&#xff08;域名验证&#xff09;和OV&#xff08;组织验证&#xff09;证书&#xff0c;它通过严格的身份核实流程确保网站所有者的合法性和真实性。 首先&#xff0…...

C++:函数传参到函数执行结束发生了什么

首先要明确两个概念 函数实参的入栈从右向左栈区从高地址向低地址偏移 接下来看下面一段代码 void fun(int a,int b,int c){std::cout<<&a<<" "<<&b<<" "<<&c<<std::endl; } int main(){fun(1,2,3); }…...

b2b网站开发费用/关键词优化设计

从今天开始&#xff0c;小白将深入给大家带来关于数据分析工具SPSS的使用和讲解&#xff0c;在这段时间里我会带着大家来一起学习了解如何使用SPSS进行描述性统计分析、假设检验、相关分析、回归分析、聚类分析、主成份分析、因子分析等。在分享的途中会出现大量的分析实例&…...

做系统去哪个网站好/qq群排名优化软件官网

文章目录文章参考file-loader应用场景安装案例 —— 引入字体库的配置url-loader(升级版)安装案例——图片打包file-loader 与 url-loader 的区别&#xff1f;webpack打包html里面img后src为“[object Module]”问题?文章参考 url-loader github file-loader 官方解释&…...

wordpress主题对比/互联网营销策划

今天在测试程序的时候&#xff0c;出现如下错误提示&#xff1a;Fatal error: Maximum execution time of 30 seconds exceeded in C:\Inetpub\wwwroot\ry.php on line 11意思是说脚本执行时间超过了30秒的上限。30秒脚本执行时间&#xff0c;对于一般的网页来说&#xff0c;可…...

腾讯云可以用wordpress教程/上海优化外包公司排名

<题目链接> 题目大意&#xff1a; 有两个容量的空杯子&#xff0c;能够对这两个空杯子进行三种操作&#xff1a; 分别是fill(a)&#xff0c;装满a杯子&#xff1b; drop(a)&#xff0c;倒空a杯子&#xff1b; pour(a,b)&#xff0c;将a杯子中的水倒入b杯子中&#xff1b;…...

wordpress用多大主机/互联网运营自学课程

弹簧动画 弹簧动画:CASpringAnimation->CABasicAnimation(基础动画)->CAPropertyAnimation(属性动画)->CAAnimation(核心动画) 下面就是核心动画的结构图: 基础动画:CABasicAnimation->只能设置fromValue、toValue、byValue 所以CASpringAnimation(弹簧动画)也只能…...

做网站的都是什么专业毕业的/让顾客进店的100条方法

作者&#xff1a;朱金灿 来源&#xff1a;http://blog.csdn.net/clever101一是com组件工程的依赖设置。比如A这个组件工程要使用B组件工程的类&#xff0c;要如何设置呢&#xff1f;具体就是先把在A工程里加上B工程的idl文件的路径&#xff0c;具体如下图&#xff1a;然后在A工…...