- 博客(32)
- 资源 (1)
- 问答 (3)
- 收藏
- 关注
原创 嵌入式工程师必备——NTC曲线拟合
1、下面是温度和阻值对照表,这个表很关键,有一种方法是使用查表法直接把表放在程序中,由于代码传到我这里使用的就不是这种方式我也没有去尝试,我们直接进入今天要讲解的这种;首先看NTC手册,25℃时是5K,温度系数B是3470,有一些NTC会直接给出公式,那种直接按照手册计算就好;2、把温度对照表粘贴到EXCEL,并根据电路图算出对应电阻的分压,在算出ADC数字量,保存这个excel;4、然后把刚刚的x、y选中,matlab会自动生成一个公式,带入程序中就可以了。%x保存表单中的ADC向量;
2024-10-25 15:35:35 229
原创 手把手教你从开发进度划分测试
单元测试:软件单元测试的对象是可独立编译或汇编的程序模块。测试的对象是软件测试中的最小单位:模块。测试阶段:编码后或者编码前(TDD:测试驱动开发)注:一般编码后测试测试对象:最小模块测试人员:测试工程师或开发人员测试依据:代码和注释+详细文档测试方法:白盒测试测试内容:模块接口测试、局部数据结构测试、独立执行路径测试、错误处理路径测试、边界条件测试
2024-09-01 00:13:54 884
原创 C#——类与结构
在未学习面向对象语言时,我常常将类比作一种结构体,其实类与结构体也确实很相似,类用来做函数的集合,结构用来做变量的集合,接下来将从几个角度刨析类与结构的不同。
2024-09-01 00:13:08 1075
原创 C#数组与C数组的差异
与C的数组不同的是,C#数组是一个引用类型,所以需要使用new关键字来创建数组的实例。或者也可以在声明时直接初始化,这样就相当于直接创建了实例。
2024-08-29 21:57:50 188
原创 按输出传递参数
学习过c语言的都知道return 语句可用于只从函数中返回一个值在C#中也是这样,但是C#也可以使用。来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。在方法的声明与调用是在传参前加out修饰。在方法调用之后,a 的值: 7。在方法调用之后,b 的值: 8。按输出传递参数使用方法是。
2024-08-29 20:26:04 183
原创 C#按引用传递参数
实参和形参使用的是两个不同内存中的值不同,在方法声明和引用时在传参前加ref修饰。在交换前,a、b的值:100、200。在交换后,a、b的值:200、100。按引用传递参数的使用方式是。,引用参数是一个对变量的。,不会创建新的存储位置。
2024-08-28 23:31:06 384
原创 形参与实参
在历程中x,y作为函数的形参(形式主义的占位符,形参的作用域仅限于函数内部,函数执行完成后,形参所占用的内存会被释放),而a,b作为实参,不管形参怎么改变不会形象其变化。在C/C#中,函数/方法都可以按值的形式传递参数,实参和形参使用的是两个不同内存中的值。在交换前,a、b的值:100、200。在交换后,a、b的值:100、200。,从而保证了实参数据的安全。
2024-08-28 22:07:07 469
原创 DSP28335中断配置——例can中断配置
以前一直看寄存器手册也没明白到底中断是怎么配置的,只是看例程上别人是这么用的,最近在使用CAN中断遇到了一些问题,才开始看中断配置的资料,DSP的中断是被TI封装好了的,我们都知道dsp中断分为三级,分别去配置三级中断使能就好了,简单的一批。2、使能外设级中断,不同外设的中断要去不同模块中查找。1、使能外设对应的PIE级中断。3、使能cpu级及全局中断。
2024-08-07 13:58:12 638 1
原创 CAN协议类比modbus学习法
CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议。在北美和西欧,CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。CAN协议经过ISO标准化后有两个标准ISO11898标准和IS011519-2标准。
2024-06-10 20:11:26 1341
原创 C语言中二维数组的地址空间分配
一维数组我们都知道是一块连续的内存空间,那么二维数组的分配很明显也是一块连续的内存空间,不一样的地方在于二位数组是有行、列两个下标(实际名字叫什么我记不清了知道的同学可以评论区评论一下),其分配地址是就是多个数组依次次分配。如上面是示例,NF_Data.Para[0][n],就保存在buff[n],NF_Data.Para[1][n],就保存在buff[2n],可以理解为一行就是一个数组然后每行都是连续的。
2024-02-05 11:16:20 213 1
转载 BootLoader升级程序
这里需要注意的是,普通的串口调试助手虽然能够发送bin文件,但是无法分包,如果APP程序不是特别大的话(RAM空间能将程序全部储存下来),可以直接用串口助手。如果RAM空间不足以存下所有的APP程序就需要自己写一个分包发送工具,或者使用可以设置发送延时的串口工具或超级终端都行。传输bin文件可以通过很多方式,这里笔者自己用QT写了一个串口bin文件的发送工具,将bin文件分包发送给单片机,单片机接收到数据后直接写入Flash即可。如果需要升级则进入接收程序,如果不需要则直接跳转到APP程序。
2023-09-15 14:19:18 276
原创 数据结构——栈的表示和操作的实现(一)
操作结果:若栈S为空栈,则返回TRUE,否则返回FALSE。//摧毁是栈没有了,清空是栈本身还在,但是没有元素了。DestroySAtack(&S)//销毁栈操作。StackEmpty(S)//判断S是否为空栈。InitStack(&S)//初始化操作。ClearStack(&S)//栈置空操作。操作结果:删除S的栈顶元素,并用e返回其值。操作结果:返回S的元素个数,即栈的长度。GetTop(S,&e)//取栈顶元素。Push(&S,e)//入栈操作,压栈。Pop(&S,&e)//出栈操作,弹栈。
2023-08-09 22:03:06 79
原创 数据结构——栈和队列应用案例
由运算符优先级确定运算顺序,例:# 3 * (7-2) #(一对#为界限符,表示表达式开始结束)3、)(右括号)于栈顶括号进行匹配,看看是否可以匹配上,匹配上就将栈顶右括号出栈。( [] () )或( { [ ] } )括号左右可以匹配上,正确;实现这个过程需要两个栈,一个是算符栈,另一个称为操作数栈。实现逻辑,将每一次的余数进栈,全部完毕后出栈。( [ ( ) )括号数量不对,格式错误。[ ( ] )只能嵌套不可以交叉,错误;4、](右括号)与栈顶对比,不匹配。检验( ( ) ] )是否匹配。
2023-08-07 20:28:23 178
原创 数据结构——栈和队列
作为最常用的数据结构类型,栈和队列其实也是线性表,栈和队列是限定插入和删除只能在表的“端点”进行的线性表。队列(queue)是一种先进先出(Frist In First Out),的线性表,简称FIFO结构。队列只能在表的一端进行插入(表尾),在表另一端(表头)进行删除的线性表(头删尾插)。栈的存储方式分为顺序栈和链栈,顺序栈更常见,两种存储方法的实现不同。
2023-08-06 21:40:36 49
原创 将正点原子LCD实验源码移植到STM32QUBEIDE
这里比较关键的是类型,这个我卡到这里很久,这里有个LCD interface类型,不要被误导;地址和数据直接按照源码配置就好;
2023-06-25 20:19:48 87
原创 数据结构与算法——基本概念和术语
定义:数据类型是一组性质相同(取值范围相同)的值的集合以及定义这个值集合上的一组操作的总称。(介于伪码和C语言之间)作为描述工具(上机时要用具体的语言实现,如C或C++等)。而另外一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示。在C语言中,一些基本数据结构可以用数据类型来实现,如数组、字符串等。使用高级语言时,必须对每个变量、常量或表达式,明确所属的数据类型。还包括定义在数据模型上的一组抽象运算(相关操作)用已有的数据类型定义描述它的存储结构。{数据对象:
2023-06-07 21:35:17 119
原创 数据结构与算法——数据结构基本概念
(1)集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其它关系。(4)图状结构或网状结构:结构中的数据元素之间存在着多对多的任意关系。对于做显示行业来说,主要应用的数据结构有:队列、栈、图、矩阵、空间索引树、检索;(2)线性结构:结构中的数据元素之间存在着一对一的线性关系。(3)树形结构:结构中的数据元素之间存在着一对多的层次关系。数据元素及其关系在计算机内存中的表示(又称为映像),称为数据的。数据结构描述的是如:表、树、图之类的逻辑关系的数据。例如:线性表、栈、队列、串。
2023-06-05 22:47:09 53
原创 不学会指针就不算学会C语言
指针在定义时会被分配空间用来保存地址,这个空间的大小只取决于硬件平台的位数,对于ARM32,指针变量用于保存地址空间是4个字节,它与定义时的数据类型无关。程序运行时,变量数据保存在RAM内存中,变量保存的数据被分配到内存地址空间由CPU和编译器自动分配内存空间。解释一下这句话,也就是说你想保存一个int8_t的地址类型的数据,指针类型要是int8_t *首先讲解以下指针变量的一个重要符号。使用指针做传参可以修改变量的数值。不说废话这章我直接发干货。2、通过指针访问寄存器。指针变量常见定义错误。
2023-05-10 23:29:15 81
原创 C语言通用链表
通用链表数据块是由list成员串联起来的,它的next和prev指向的是业务数据结构体中list成员的首地址,所以需要根据list成员的首地址得到业务数据结构体的首地址,才能进行访问其它成员的数据。通用链表把初始化分为两部分,指针域和数据域分开初始化,大大提高了通用性,用户可以根据自己的业务需求创建业务数据域。单纯的通用链表是没有意义的,要结合业务类型。通过结构体成员获取结构体首地址宏定义。
2023-04-16 20:57:58 374
原创 C语言通用链表
通用链表把初始化分为两部分,指针域和数据域分开初始化,大大提高了通用性,用户可以根据自己的业务需求创建业务数据域。通用链表数据块是由list成员串联起来的,它的next和prev指向的是业务数据结构体中list成员的首地址,所以。需要根据list成员的首地址得到业务数据结构体的首地址,才能进行访问其它成员的数据。单纯的通用链表是没有意义的,要结合业务类型。通过结构体成员获取结构体首地址宏定义。
2023-04-16 19:38:04 261
原创 如何根据结构体中成员的地址获取整个结构体的首地址
LOS_DL_LIST_ENTRY通过结构体内某个成员变量的地址和该成员的名字,以及数据结构体类型,找到该结构体变量的首地址。根据结构体成员地址,获取整个结构体的首地址,在Linux系统、鸿蒙lite os操作系统中是一个很重要的功能。container_of通过结构体内某个成员的地址和该成员的名字,以及结构体类型,找到该结构体变量的首地址。具体的实现其实就是我前面结构体与动态内存章节开始说的结构体数据对齐去寻找到首地址的。在鸿蒙Lite os中是通过LOS_DL_LIST_ENTRY宏函数实现的。
2023-04-16 18:59:49 1205
原创 C语言contiue、break、return、exit()函数有什么区别
break 强制退出循环或者switch,程序会执行循环后面的语句,每个分支下加一个break可以防止直接进入下一个分支执行,从一个分支进入下一个分支的做法并不健全;exit() 函数将会结束当前进程,同时删除子进程所占用的内存空间,把返回信息传给父进程。return 仅表示调用堆栈的返回,其作用是返回函数值,并且退出当前执行的函数体;contiue 用于循环语句,跳出本次循环,程序会开始下一次循环;
2023-04-15 19:30:19 312
原创 双向循环链表
双向循环链表优点:通过1个指针变量,就可以找到前向节点和后向节点,方便写程序,可以从任意节点位置开始遍历整个链表。在学习单向链表时,创建的结构体只用了1个指针,指向下一个节点首地址;添加和删除节点用了两个指针,分别指向被操作节点的前节点与后节点。这样可以保证链表在只有1个头节点的情况下,也是一个双向循环链表。在实际使用中相比于单向链表,双向链表才是比较常用的数据结构。将尾节点next指向NULL改为指向头节点首地址;将头节点的prev指向尾节点的首地址。在双向链表的基础上设计双向循环链表。
2023-04-15 15:49:27 99
原创 嵌入式c语言单向链表
注意:这种方法是判断prev指向的是不是尾节点,current保存的地址是不是尾节点的下一项NULL,current本身指向的就是尾节点的next,当current指向NULL时循环已经退出了,此时prev保存的就是为尾节点,prev的next指向的就是新的节点。注意:这种方法是判断current保存的下一个地址是不是NULL,current本身指向的是尾节点,在current后面就是新的节点。链表是结合结构体和指针的综合应用,学习之前务必复习结构体和指针的相关知识。找到尾节点后添加新节点到链表尾部。
2023-04-13 17:16:27 213
原创 strlen()函数
strlen()函数的原理就是判断字符串是不是结尾的\0不是就++,是就停止。strlen()函数用于返回字符串长度,但不包括字符串结尾\0。编译器在处理字符时,会自动在函数末尾添加ASCII码'\0'。
2023-04-09 22:12:37 87
原创 字符串的本质
/这样时改写不了的,因为5中说过不可以改写。//使用指针变量访问第0个元素,将m改写成M。字符串是一种特殊的数据类型,是一些ASCII码的集合,包含在" "里。ASCII码和字符串有区别,'A'是一个字符。
2023-04-09 22:03:46 385 1
原创 指针与动态内存申请
一文教你指针与动态内存申请,包括常见使用场景和野指针的定义。void *malloc(unsigned int size)//动态内存分配函,用于在堆上申请一块指定大下连续的内存区域,单位时字节,申请成功返回分配区的起始地址,分配失败返回NULL,返回结果为viod*需要自己强制转换为需要的类型。场景1:指针变量p使用完没有指向NULL,但是内存空间free了,当指针变量m指向新申请的内存后,p仍然可以改写m的数据,p就是野指针。
2023-04-02 21:52:20 648
原创 常见硬件接口的区别
I2C 通信的起始信号(Start)后,首先要发送一个从机的地址,这个地址一共有 7位,紧跟着的第 8 位是数据方向位(R/W),“0”表示接下来要发送数据(写),‘“1”表示接下来是请求数据(读)。I2C 没有固定波特率,但是有时序的要求,要求当 SCL 在低电平的时候,SDA 允许变化,也就是说,发送方必须先保持 SCL 是低电,平,才可以改变数据线 SDA,输出要发送的当前数据的一位;T568B(只用了四根线)是橙白、橙、绿白、蓝、蓝白、绿、棕白、棕,10/100全半双工。
2023-01-13 17:08:58 1687
转载 嵌入式软件测试的基本方法
但是全数字模拟测试有较大的局限性,使用不同语言编写的嵌入式软件需要不同的仿真程序来执行,通用性差,实时性与准确性难以反映出嵌入式软件的真实情况,当并发事件要求一定的同步关系时,维护统一、精确地系统时钟,理顺时序关系相当困难。大量统计资料表明,软件测试的工作量往往占软件开发总工作量的40%以上,在极端情况,测试那种关系人的生命安全的重要的行业中的嵌入式软件所花费的成本,可能相当于软件工程其他开发步骤总成本的三倍到五倍。在软件开发的不同时期进行动态测试,测试又分为单元测试、集成测试、确认测试、系统测试。
2023-01-12 10:52:41 1331
DSP开发环境CCS代码自动补全
2023-11-28
28335修改can发送邮箱id接收邮箱中断进不去
2024-08-05
DSP28335怎么在执行的过程中修改CAN邮箱ID
2024-08-03
研旭提供的DSP例程编译后CMD文件有很多报错怎么解决?
2024-01-10
#Python#读RTU线圈的问题,如何解决?
2022-06-07
请问三极管基极作为开关基极电阻和集电极电阻怎么计算?
2021-09-16
TA创建的收藏夹 TA关注的收藏夹
TA关注的人