自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 资源 (1)
  • 问答 (3)
  • 收藏
  • 关注

原创 手把手教你从开发进度划分测试

单元测试:软件单元测试的对象是可独立编译或汇编的程序模块。测试的对象是软件测试中的最小单位:模块。测试阶段:编码后或者编码前(TDD:测试驱动开发)注:一般编码后测试测试对象:最小模块测试人员:测试工程师或开发人员测试依据:代码和注释+详细文档测试方法:白盒测试测试内容:模块接口测试、局部数据结构测试、独立执行路径测试、错误处理路径测试、边界条件测试

2024-09-01 00:13:54 860

原创 C#——类与结构

在未学习面向对象语言时,我常常将类比作一种结构体,其实类与结构体也确实很相似,类用来做函数的集合,结构用来做变量的集合,接下来将从几个角度刨析类与结构的不同。

2024-09-01 00:13:08 1014

原创 C#数组与C数组的差异

与C的数组不同的是,C#数组是一个引用类型,所以需要使用new关键字来创建数组的实例。或者也可以在声明时直接初始化,这样就相当于直接创建了实例。

2024-08-29 21:57:50 165

原创 按输出传递参数

学习过c语言的都知道return 语句可用于只从函数中返回一个值在C#中也是这样,但是C#也可以使用。来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。在方法的声明与调用是在传参前加out修饰。在方法调用之后,a 的值: 7。在方法调用之后,b 的值: 8。按输出传递参数使用方法是。

2024-08-29 20:26:04 166

原创 C#按引用传递参数

实参和形参使用的是两个不同内存中的值不同,在方法声明和引用时在传参前加ref修饰。在交换前,a、b的值:100、200。在交换后,a、b的值:200、100。按引用传递参数的使用方式是。,引用参数是一个对变量的。,不会创建新的存储位置。

2024-08-28 23:31:06 353

原创 形参与实参

在历程中x,y作为函数的形参(形式主义的占位符,形参的作用域仅限于函数内部,函数执行完成后,形参所占用的内存会被释放),而a,b作为实参,不管形参怎么改变不会形象其变化。在C/C#中,函数/方法都可以按值的形式传递参数,实参和形参使用的是两个不同内存中的值。在交换前,a、b的值:100、200。在交换后,a、b的值:100、200。,从而保证了实参数据的安全。

2024-08-28 22:07:07 451

原创 C#中函数与方法的区别

在C#中,函数和方法都使用类似的关键字(如。

2024-08-21 22:25:04 334

原创 DSP28335中断配置——例can中断配置

以前一直看寄存器手册也没明白到底中断是怎么配置的,只是看例程上别人是这么用的,最近在使用CAN中断遇到了一些问题,才开始看中断配置的资料,DSP的中断是被TI封装好了的,我们都知道dsp中断分为三级,分别去配置三级中断使能就好了,简单的一批。2、使能外设级中断,不同外设的中断要去不同模块中查找。1、使能外设对应的PIE级中断。3、使能cpu级及全局中断。

2024-08-07 13:58:12 361

原创 CAN协议类比modbus学习法

CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议。在北美和西欧,CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。CAN协议经过ISO标准化后有两个标准ISO11898标准和IS011519-2标准。

2024-06-10 20:11:26 1088

原创 C语言中二维数组的地址空间分配

一维数组我们都知道是一块连续的内存空间,那么二维数组的分配很明显也是一块连续的内存空间,不一样的地方在于二位数组是有行、列两个下标(实际名字叫什么我记不清了知道的同学可以评论区评论一下),其分配地址是就是多个数组依次次分配。如上面是示例,NF_Data.Para[0][n],就保存在buff[n],NF_Data.Para[1][n],就保存在buff[2n],可以理解为一行就是一个数组然后每行都是连续的。

2024-02-05 11:16:20 183 1

转载 BootLoader升级程序

这里需要注意的是,普通的串口调试助手虽然能够发送bin文件,但是无法分包,如果APP程序不是特别大的话(RAM空间能将程序全部储存下来),可以直接用串口助手。如果RAM空间不足以存下所有的APP程序就需要自己写一个分包发送工具,或者使用可以设置发送延时的串口工具或超级终端都行。传输bin文件可以通过很多方式,这里笔者自己用QT写了一个串口bin文件的发送工具,将bin文件分包发送给单片机,单片机接收到数据后直接写入Flash即可。如果需要升级则进入接收程序,如果不需要则直接跳转到APP程序。

2023-09-15 14:19:18 264

原创 数据结构——栈的表示和操作的实现(二)

【代码】数据结构——栈的表示和操作的实现(二)

2023-08-14 20:25:07 69

原创 数据结构——栈的表示和操作的实现(一)

操作结果:若栈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 72

原创 数据结构——栈和队列应用案例

由运算符优先级确定运算顺序,例:# 3 * (7-2) #(一对#为界限符,表示表达式开始结束)3、)(右括号)于栈顶括号进行匹配,看看是否可以匹配上,匹配上就将栈顶右括号出栈。( [] () )或( { [ ] } )括号左右可以匹配上,正确;实现这个过程需要两个栈,一个是算符栈,另一个称为操作数栈。实现逻辑,将每一次的余数进栈,全部完毕后出栈。( [ ( ) )括号数量不对,格式错误。[ ( ] )只能嵌套不可以交叉,错误;4、](右括号)与栈顶对比,不匹配。检验( ( ) ] )是否匹配。

2023-08-07 20:28:23 150

原创 数据结构——栈和队列

作为最常用的数据结构类型,栈和队列其实也是线性表,栈和队列是限定插入和删除只能在表的“端点”进行的线性表。队列(queue)是一种先进先出(Frist In First Out),的线性表,简称FIFO结构。队列只能在表的一端进行插入(表尾),在表另一端(表头)进行删除的线性表(头删尾插)。栈的存储方式分为顺序栈和链栈,顺序栈更常见,两种存储方法的实现不同。

2023-08-06 21:40:36 39

原创 将正点原子LCD实验源码移植到STM32QUBEIDE

这里比较关键的是类型,这个我卡到这里很久,这里有个LCD interface类型,不要被误导;地址和数据直接按照源码配置就好;

2023-06-25 20:19:48 78

原创 数据结构与算法——基本概念和术语

定义:数据类型是一组性质相同(取值范围相同)的值的集合以及定义这个值集合上的一组操作的总称。(介于伪码和C语言之间)作为描述工具(上机时要用具体的语言实现,如C或C++等)。而另外一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示。在C语言中,一些基本数据结构可以用数据类型来实现,如数组、字符串等。使用高级语言时,必须对每个变量、常量或表达式,明确所属的数据类型。还包括定义在数据模型上的一组抽象运算(相关操作)用已有的数据类型定义描述它的存储结构。{数据对象:

2023-06-07 21:35:17 74

原创 数据结构与算法——数据结构基本概念

(1)集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其它关系。(4)图状结构或网状结构:结构中的数据元素之间存在着多对多的任意关系。对于做显示行业来说,主要应用的数据结构有:队列、栈、图、矩阵、空间索引树、检索;(2)线性结构:结构中的数据元素之间存在着一对一的线性关系。(3)树形结构:结构中的数据元素之间存在着一对多的层次关系。数据元素及其关系在计算机内存中的表示(又称为映像),称为数据的。数据结构描述的是如:表、树、图之类的逻辑关系的数据。例如:线性表、栈、队列、串。

2023-06-05 22:47:09 48

原创 不学会指针就不算学会C语言

指针在定义时会被分配空间用来保存地址,这个空间的大小只取决于硬件平台的位数,对于ARM32,指针变量用于保存地址空间是4个字节,它与定义时的数据类型无关。程序运行时,变量数据保存在RAM内存中,变量保存的数据被分配到内存地址空间由CPU和编译器自动分配内存空间。解释一下这句话,也就是说你想保存一个int8_t的地址类型的数据,指针类型要是int8_t *首先讲解以下指针变量的一个重要符号。使用指针做传参可以修改变量的数值。不说废话这章我直接发干货。2、通过指针访问寄存器。指针变量常见定义错误。

2023-05-10 23:29:15 69

原创 C语言通用链表

通用链表数据块是由list成员串联起来的,它的next和prev指向的是业务数据结构体中list成员的首地址,所以需要根据list成员的首地址得到业务数据结构体的首地址,才能进行访问其它成员的数据。通用链表把初始化分为两部分,指针域和数据域分开初始化,大大提高了通用性,用户可以根据自己的业务需求创建业务数据域。单纯的通用链表是没有意义的,要结合业务类型。通过结构体成员获取结构体首地址宏定义。

2023-04-16 20:57:58 352

原创 C语言通用链表

通用链表把初始化分为两部分,指针域和数据域分开初始化,大大提高了通用性,用户可以根据自己的业务需求创建业务数据域。通用链表数据块是由list成员串联起来的,它的next和prev指向的是业务数据结构体中list成员的首地址,所以。需要根据list成员的首地址得到业务数据结构体的首地址,才能进行访问其它成员的数据。单纯的通用链表是没有意义的,要结合业务类型。通过结构体成员获取结构体首地址宏定义。

2023-04-16 19:38:04 231

原创 如何根据结构体中成员的地址获取整个结构体的首地址

LOS_DL_LIST_ENTRY通过结构体内某个成员变量的地址和该成员的名字,以及数据结构体类型,找到该结构体变量的首地址。根据结构体成员地址,获取整个结构体的首地址,在Linux系统、鸿蒙lite os操作系统中是一个很重要的功能。container_of通过结构体内某个成员的地址和该成员的名字,以及结构体类型,找到该结构体变量的首地址。具体的实现其实就是我前面结构体与动态内存章节开始说的结构体数据对齐去寻找到首地址的。在鸿蒙Lite os中是通过LOS_DL_LIST_ENTRY宏函数实现的。

2023-04-16 18:59:49 1144

原创 C语言contiue、break、return、exit()函数有什么区别

break 强制退出循环或者switch,程序会执行循环后面的语句,每个分支下加一个break可以防止直接进入下一个分支执行,从一个分支进入下一个分支的做法并不健全;exit() 函数将会结束当前进程,同时删除子进程所占用的内存空间,把返回信息传给父进程。return 仅表示调用堆栈的返回,其作用是返回函数值,并且退出当前执行的函数体;contiue 用于循环语句,跳出本次循环,程序会开始下一次循环;

2023-04-15 19:30:19 251

原创 双向循环链表

双向循环链表优点:通过1个指针变量,就可以找到前向节点和后向节点,方便写程序,可以从任意节点位置开始遍历整个链表。在学习单向链表时,创建的结构体只用了1个指针,指向下一个节点首地址;添加和删除节点用了两个指针,分别指向被操作节点的前节点与后节点。这样可以保证链表在只有1个头节点的情况下,也是一个双向循环链表。在实际使用中相比于单向链表,双向链表才是比较常用的数据结构。将尾节点next指向NULL改为指向头节点首地址;将头节点的prev指向尾节点的首地址。在双向链表的基础上设计双向循环链表。

2023-04-15 15:49:27 87

原创 嵌入式c语言单向链表

注意:这种方法是判断prev指向的是不是尾节点,current保存的地址是不是尾节点的下一项NULL,current本身指向的就是尾节点的next,当current指向NULL时循环已经退出了,此时prev保存的就是为尾节点,prev的next指向的就是新的节点。注意:这种方法是判断current保存的下一个地址是不是NULL,current本身指向的是尾节点,在current后面就是新的节点。链表是结合结构体和指针的综合应用,学习之前务必复习结构体和指针的相关知识。找到尾节点后添加新节点到链表尾部。

2023-04-13 17:16:27 187

原创 strlen()函数

strlen()函数的原理就是判断字符串是不是结尾的\0不是就++,是就停止。strlen()函数用于返回字符串长度,但不包括字符串结尾\0。编译器在处理字符时,会自动在函数末尾添加ASCII码'\0'。

2023-04-09 22:12:37 75

原创 字符串的本质

/这样时改写不了的,因为5中说过不可以改写。//使用指针变量访问第0个元素,将m改写成M。字符串是一种特殊的数据类型,是一些ASCII码的集合,包含在" "里。ASCII码和字符串有区别,'A'是一个字符。

2023-04-09 22:03:46 347 1

原创 结构体指针与动态内存

结构体成员包含指针类型与动态内存。首先讲解以下结构体数据对齐。结构体指针变量与动态内存。

2023-04-03 21:23:56 496 1

原创 指针与动态内存申请

一文教你指针与动态内存申请,包括常见使用场景和野指针的定义。void *malloc(unsigned int size)//动态内存分配函,用于在堆上申请一块指定大下连续的内存区域,单位时字节,申请成功返回分配区的起始地址,分配失败返回NULL,返回结果为viod*需要自己强制转换为需要的类型。场景1:指针变量p使用完没有指向NULL,但是内存空间free了,当指针变量m指向新申请的内存后,p仍然可以改写m的数据,p就是野指针。

2023-04-02 21:52:20 622

原创 常见硬件接口的区别

I2C 通信的起始信号(Start)后,首先要发送一个从机的地址,这个地址一共有 7位,紧跟着的第 8 位是数据方向位(R/W),“0”表示接下来要发送数据(写),‘“1”表示接下来是请求数据(读)。I2C 没有固定波特率,但是有时序的要求,要求当 SCL 在低电平的时候,SDA 允许变化,也就是说,发送方必须先保持 SCL 是低电,平,才可以改变数据线 SDA,输出要发送的当前数据的一位;T568B(只用了四根线)是橙白、橙、绿白、蓝、蓝白、绿、棕白、棕,10/100全半双工。

2023-01-13 17:08:58 1576

转载 嵌入式软件测试的基本方法

但是全数字模拟测试有较大的局限性,使用不同语言编写的嵌入式软件需要不同的仿真程序来执行,通用性差,实时性与准确性难以反映出嵌入式软件的真实情况,当并发事件要求一定的同步关系时,维护统一、精确地系统时钟,理顺时序关系相当困难。大量统计资料表明,软件测试的工作量往往占软件开发总工作量的40%以上,在极端情况,测试那种关系人的生命安全的重要的行业中的嵌入式软件所花费的成本,可能相当于软件工程其他开发步骤总成本的三倍到五倍。在软件开发的不同时期进行动态测试,测试又分为单元测试、集成测试、确认测试、系统测试。

2023-01-12 10:52:41 1281

TMS320F2837xD中文手册 技术手册资料合集

适用于嵌入式软件工程师、DSP工程师,寄存器解释,外设初始化全中文,可提高开发速度

2024-07-04

DSP开发环境CCS代码自动补全

DSP开发环境CCS代码自动补全,支持关键字补全,变量补全,不需要快捷键自动补全,CCS原本的补全需要使用快捷键很不方便,安装本插件可以实现自动补全,详细安装方式均在压缩包中

2023-11-28

HAL库FreeRTOS工程模板

已移植到HAL库,直接可以在线程添加任务运行

2023-08-01

STM32F1xxHAL库使用手册

STM32F1xxHAL库使用手册

2022-02-07

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除