程序人生
灵哎惹,凌沃敏
“任何一个傻瓜都能写出计算机可以理解的代码,唯有写出人类容易理解的代码,才是优秀的程序员。”
展开
-
记录一个GD32E230的ADC+DMA的重大问题
经过各种研究都没发现问题:正常和不正常情况下ADC和DMA的寄存器值都是一样的,内存也没有越界访问;确认flash读写函数无问题;而且最离谱的是,有的时候开机是正常的,有的时候是异常的,也就说是同一个程序有的时候启动正常,有的时候异常;虽然最后发现了问题,但是也没发现问题,因为还是没搞懂为啥会跟flash读写有关,更没有搞懂为啥同一个程序有时启动就没问题有时就有问题!,即7个通道的数据位置错了,原本1通道的数据到了5通道,5通道的到了3通道!把这一句注释掉了就再也不会出问题了~原创 2024-04-26 11:37:46 · 461 阅读 · 0 评论 -
关于SVC和PendSV
实时操作系统(Real Time Operating System,简称RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。原创 2023-07-21 14:10:11 · 871 阅读 · 0 评论 -
面向过程和面向对象编程详解
面向对象是把跟要处理的事情相关的所有事物封装成一个对象,每个对象内有各种属性、行为(函数)和变量,然后用这些对象的属性、行为、变量去完成事情;所有高级语言都是面向对象的或者说能够面向对象编程的,然后几乎所有高级语言都是在C的基础上发展起来的,所以说面向对象编程是正确的编程语言发展方向,是大势所趋,因为面向过程更符合机器的思维(机器就是想让你告诉他一步一步该怎么做),而面向过程更符合人类的思维,而编程语言的发展肯定是要让人类更加方便快速的编程,所以发展面向对象编程是理所应当的。原创 2023-03-10 17:23:21 · 201 阅读 · 0 评论 -
git学习记录/菜鸟教程(基于Gitcode)
本文章记录了从零开始使用git的操作原创 2023-02-28 15:53:20 · 708 阅读 · 0 评论 -
关于CM3/CM4位带操作的总结
位带操作定义、优越性和使用原创 2022-12-13 15:34:49 · 1069 阅读 · 0 评论 -
关于VSCode编码:自动猜测编码字符集
VSCode有自动猜测打开文件的编码的功能,设置如下:点击 文件->首选项->设置搜索设置处搜索“编码”图中红框处打钩即可.原创 2021-08-24 16:24:45 · 1946 阅读 · 0 评论 -
总结:Unicode、GBK、UTF-8之间的区别
Unicode:所有字符都是两个字节,对于英文字符,高字节为0,低字节与ASCII码相同GBK:中文字符为两个字节;英文字符为1个字节,且与ASCII码相同。原创 2021-06-05 15:06:15 · 4382 阅读 · 0 评论 -
记录:从一个函数里向另一个函数传递参数要用指针变量,不能用局部非指针变量
如题,从A函数中调用B函数向C函数传递参数,传递完A函数会结束时不能用局部非指针变量,因为局部非指针变量在函数结束后会被回收的,这回导致传递过去的参数为空;但是局部指针变量是malloc在堆区的,要主动free才会消失; 所以,此时要注意的是,在C函数中用完该指针变量后要记得free掉,否则造成内存泄漏!...原创 2021-03-26 10:40:58 · 247 阅读 · 0 评论 -
fatfs如何判断一个文件的打开关闭状态
为了防止重复关闭一个文件,我们在关闭之前需要判断该文件是否已经打开:1.在f_close函数中加入对文件指针fp中的文件大小成员清零的代码:2.然后就可以通过判断此成员是否为0来获知该文件是否打开了:...原创 2021-02-03 10:47:44 · 1297 阅读 · 0 评论 -
关于C/C++编译时明明包含了某头文件,却仍然提示该头文件中的某类型未定义
问题原因:在A.h中包含了B.h,B.h中包含了C.h,然后C.h中包含了A.h,这样就相当于A.h自己包含了自己,然后在编译A.h时(确切的说应该是编译包含A.h的c文件时)A.h就会被展开两次,第二次展开的时候就会报错。解决:不在C.h中包含A.h,编译通过总结:其它出现这种问题的肯定都是因为在复杂的头文件包含关系中出现自己包含自己的情况...原创 2020-12-30 10:34:47 · 18024 阅读 · 4 评论 -
关于XR872编译出现问题“gcc-arm-none-eabi-4_9-2015q2/bin/arm-none-eabi-gcc: 无法执行二进制文件”
怀疑是gcc编译器问题或者版本问题,正好在网上找到个“q3”版本的,于是换了下,问题解决, 有需要请邮件:X_Q_Wei@163.com原创 2020-12-09 14:34:23 · 711 阅读 · 0 评论 -
C/C++ 往指定地址读写的三种方式
嵌入式编程中免不了要往指定地址读/写数据,如配置各种外设时需要写外设的寄存器,下面我总结了三种读写指定地址的方式:我们这次准备使用的是STM32F4的串口3的数据寄存器:USART3->DR,地址0x40004804;1.使用强制转换: 写:*(u16*)0x40004804=0x55; 读:u16 k=0; k=*(u16*)0x40004804;C/C++的强制转换是一个非常重要的知识点,学好了可以为你的编程带来很大的方便,以上就是使用强制转换将数字0x40...原创 2020-09-14 14:50:12 · 8100 阅读 · 1 评论 -
数据存储的大小端格式问题记录
大小端定义:大端格式:即数据的高位存在低地址,如0x11223344,在存储器中从低到高的存储顺序就是0x11,0x22,0x33,0x44小端格式:即数据的高位存在高地址,如0x11223344,在存储器中从低到高的存储顺序就是0x44,0x33,0x22,0x11大端格式会更好理解一点,因为它是顺序的;小端格式会需要转换一下。STM32的内存和flash都是按照小端格式存储的。如何判别大小端:1.判别RAM的大小端方法1:定义一个32位变量,给其赋值0x11223344,再定原创 2020-09-08 13:59:01 · 1434 阅读 · 0 评论 -
C/C++位处理总结
1.判断变量A的第“x”位是否为1(读取第x位) if(A&(1<<x))2.将变量A的第"x"位置1,而不影响其他位 A|=(1<<x)3.将变量A的第"x"位置0,而不影响其他位 A&=~(1<<x)4.将变量A的第"x"和"x+1"位置1,而不影响其他位 A|=(3<<x)5.将变量A的第"x"和"x+1"位置0,而不影响其他位 A&=~(3<<x)...原创 2020-09-07 11:33:29 · 406 阅读 · 0 评论 -
嵌入式代码稳定/抗干扰性增强措施
1.了解自己程序大概占用的堆栈大小,设置足够的堆栈余量,防止堆栈溢出2.尽量少用大数组,必要时可以将一个大数组分成几个3.对于关键的变量用 Volatile关键字修饰,尤其是会在多个线程/中断中调用的变量,否则你很可能取到错误的变量值4.对于在多个线程/中断中都调用了的函数,最好保证其不会被同时调用(即该函数在一个线程被执行时被另外一个高优先级线程/中断打断,进入该高优先级线程...原创 2019-04-12 19:31:29 · 794 阅读 · 0 评论