
C补习
真的改完最后一个bug就下班
一日不读书,无人看的出;一周不读书,开始会动粗;一月不读书,笨的像头猪。
展开
-
IAR下enum处理
所以,enum采用的最小的有符号数据类型来搞得,非标准int。1、iar下的enum,默认配置使用的是。4、为什么要定义成int类型呢?这样最少就是int类型了。3、用标准的可以这么做。原创 2024-12-31 11:58:17 · 239 阅读 · 0 评论 -
union的实际使用
这里定义一个64位变量 i2creg_rev,然后通过共用体定义两个位变量bits和bits_reverse,通过bit可以访问指定位的值大小,不需要自己再左移右移转换。先定义一个union变量,然后用i2c去读的值,赋值给rev_time,之后利用union特性,直接可以提取时分秒,年月日了。bits_reverse是bits的对端转换,是用来处理大小端定义位的,免得取位值时,取反顺序了。1、定义一个共用体变量。原创 2024-12-30 17:37:44 · 395 阅读 · 0 评论 -
boot跳转app遇到的问题,keil转iar的app工程
boot跳转app时,keil编译生成的app可以正常运行,而iar编译生成的app死活不能运行成功,不能正常跳转到app。主要注意的就是这两个地方,其他的源代码是相同的(汇编启动代码不一样,用官方提供的就行)3、最后通过gdlink调试发现gd32一直挂死在cache初始化这里然后不停复位。原来在boot时有初始化cache的,所以重新初始化就出了问题?4、把cache_enable()屏蔽了,程序就可以跑了。1、今天将keil的app工程转为iar的app工程。5、那么为啥keil生成的程序可以呢?原创 2024-08-21 10:50:45 · 274 阅读 · 0 评论 -
程序进入错误时调试,如hardfault
1、如果不是在仿真情况下,出现进入了死机程序,可以通过R0~R15大概判断下程序出问题的地方。3、读出PSP地址值存储PC,LR值:这里存的是,进入异常前,压入堆栈的PC和link信息。从PC值看到值为00000007,基本是系统开始的地方啊,说明异常退出?原创 2024-08-12 17:22:39 · 583 阅读 · 0 评论 -
当和三方库的宏定义冲突怎么解除
回头试试,是不是随便在一个宏定义前面增加就可以。假如A中也宏定义了X,这里也需要定义一个宏X。在一个冲突的地方,加上这段代码。原创 2024-07-22 18:07:14 · 437 阅读 · 0 评论 -
typedef重复定义的一种解决方法
与#define不同,typedef没有类似#undef的方法取消定义,如果两个库中同时使用typedef定义了某个类型,便会编译失败。一个解决方法是,在包含第二个库时使用#define将重复定义的类型名改掉。原创 2024-07-22 16:53:43 · 917 阅读 · 2 评论 -
最简单的方法,连续打印多个空格
1、大家都知道,c语言中,我们打印语句时,如果使用\t来控制打印间隔,可能会出现排版错乱问题,所以一般都会使用空格来控制间隔,这样不管在哪个工具上面显示,打印的信息都不会错乱。表示宽度由参数列表中的下一个参数指定,我们将需要输出的空格数量(5)作为参数传递给。2、控制间隔的空格,一般需要多个,如果打印语句较多是,输入起来真的很麻烦。3、所以,有没有快捷方法,能连续打印多个空格字符呢,函数,从而实现输出多个空格的目的。在这个示例中,我们使用了。作为格式字符串,其中。原创 2024-06-12 09:44:10 · 1873 阅读 · 0 评论 -
crc16计算
/ 调用CRC函数计算CRC值。printf("crc16_2 分段计算出 value: %X\n", result);// 调用CRC函数计算CRC值。crc16计算,以生成式G(x)=x16+x15+x2+1,为例。原创 2024-03-01 16:09:03 · 1148 阅读 · 0 评论 -
const和指针结合 记录
uint8 const* sPtr:表示sPtr指向的内容为常量,也就是说,const uint8 * sPtr,和上面一样,放在类型前后无关;,指针地址无法修改,在定义时初始化好的,无法指向其他对象!原创 2024-01-30 11:12:06 · 452 阅读 · 0 评论 -
明明我在头文件写了宏定义,为啥还提示未找到use of undeclared identifier
如果NUMBER_OF_INTERFACES是在一个特定的作用域内定义的(例如函数内部),那么在外部作用域中可能无法访问该宏。确保在board.c文件中包含了包含NUMBER_OF_INTERFACES定义的头文件。一直提示NUMBER_OF_INTERFACES宏未定义,我找这个错误找了好久,可明明我在头文件已经包定义了#define NUMBER_OF_INTERFACES 2。在代码中直接使用NUMBER_OF_INTERFACES作为数组的长度,但是没有加上中括号[],因此编译器无法正确展开宏。原创 2023-12-11 09:34:40 · 5511 阅读 · 0 评论 -
如何在case中定义局部变量
众所周知,在switch case结构中,定义变量,编译器会报错,那有什么办法能在case中定义变量,不让报错吗?原创 2023-12-08 11:39:55 · 427 阅读 · 0 评论 -
一个有意思的宏,可以注释代码
当调用时,comment_class1(/),在代码中可以实现//可以在有些场合简化代码。原创 2023-01-12 10:01:17 · 133 阅读 · 0 评论 -
位域相关知识
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域的数据结构。转载 2022-11-23 09:19:02 · 199 阅读 · 0 评论 -
不要被main函数迷惑了
话不多说,上代码!#include int test(int x);int j = test(3);int test(int x){int i;printf("are your sure?%d\n",x);i = x;return i;}void main(){; //the result is?test(6)原创 2016-11-10 15:44:13 · 550 阅读 · 1 评论 -
【转载】浮点数精度间隔(大小)是多少?
日常处理float数据时,我们知道他是有精度损失的,但是精度损失的具体大概值是多少,怎么计算,一直不是很清楚,今天这篇文章介绍的很清楚原创 2022-10-17 16:20:17 · 1872 阅读 · 0 评论 -
fscanf读内容后发生错误,文件指针变成乱码(野指针)
fscanf出问题,fscanf无法继续读,无法fclose原创 2022-03-30 17:15:28 · 1792 阅读 · 0 评论 -
如何在不同c文件中强制跳转-- setjmp 和 longjmp 的使用
setjmp和longjmp和goto一样,尽量避免用。一般goto只能在本地c文件使用,setjmp和longjmp可以在整个程序中使用,具体介绍用法如下:首先需要包含头文件#include 一、setjmp 1、setjmp( jump_buf j )必须首先被调用,它表示“使用变量j记录现在的位置,函数返回零”; 二、longjmp longjmp( jump_buf j, int i )可以接着被调用。它表示“回到 j 所记录的位置,让它看上起像是从原先的setjmp() 函...原创 2022-03-23 09:49:23 · 648 阅读 · 1 评论 -
局部变量升级为全局变量后程序的影响
开发程序时,有时会关注不同的资源重点,需要将全局和局部变量互相转化以使程序资源不紧张。一般情况下,编译程序后会关注两大点:程序大小和RAM使用大小比如编译后信息如下: Program Size: Code=57686 RO-data=2726 RW-data=1320 ZI-data=25660 则程序大小=code+RO-dataRam使用大小=RW-data+ZIdata下面测试变量不同位置对上述两个关注点的影响,以作为后续开发优化过程中备用:1、定义一个数组:120个.原创 2021-07-20 15:22:50 · 510 阅读 · 0 评论 -
结构体嵌套构造链表
结构体嵌套构造链表时,要使用指针的原因,原理原创 2021-05-15 11:23:19 · 680 阅读 · 4 评论 -
[难题3] 宏定义的重定义可以用一行代码实现吗?
宏定义的重定义可以用一行代码实现吗?比如下面功能,将原先定义的宏赋个新值:#define Redef(x,Reval) do{ #ifdef x \ #undef x \ #endif \ #ifndef x \ #define x ...原创 2021-04-12 21:34:50 · 117 阅读 · 0 评论 -
do while(0)在开发中的使用
1、起因: 今天看代码时,看到有个宏定义是这样的:#define setup_timer(timer, fn, data) \do { \static struct lock_class_key __key; \setup_timer_key((timer), #timer, &__key, (fn), (data));\} while (0)当时比较疑问为啥这个宏定义要加个do{ }while(0),直接{}不行吗?后来一查才发现有大学问,下面分析:2...原创 2020-10-09 17:44:11 · 226 阅读 · 0 评论 -
关于结构体字对齐
1、问题引入在16位MCU中,如果定义这样的结构体typedef struct{int16 c_aging;//=aging*100uint8 c_Decay_f;//=factor*100int16 c_phase26th;//=phaselag26h}cmstate ;当需要通过指针访问该结构体时,uint8 *p_cmstate;con原创 2018-02-03 11:17:32 · 392 阅读 · 0 评论 -
记录一下restrict关键字作用
restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容。...原创 2018-09-17 09:56:54 · 312 阅读 · 0 评论 -
typedef void (*int_handler) ()形式函数
typedef void (*int_handler) (这里面也可以加参数); //定义了一个指向 void funName(这里跟前面参数一样) 这一类型函数的指针类型。void paint1(){printf("function paint1\n");}void paint2(){printf("function paint2\n");}voi原创 2016-02-02 09:22:38 · 1931 阅读 · 0 评论 -
C常见的常识
1、*的优先级高于原创 2014-12-14 20:30:57 · 561 阅读 · 1 评论 -
C中结构体的初始化
1、结构体类型定义typedef struct _CMProcessCtrl{ uint8 PhaseOk; uint8 PPSPulseIn;}CMProcessCtrl;typedef struct _CMControlData{ CMProcessCtrl CmpCtrl;}CMControlData;2、定义一个结构体并初始化CMControlData CMCtrlData = { .Cm...原创 2018-04-11 15:10:43 · 289 阅读 · 1 评论 -
数组定义起始地址的问题
加入有如下代码行: uchar rad[6]={0}; Read_InfNFlashSegment(Flash_InfD_BaseAddr,DGsensor_RadX_Offset,rad,6); //读出rad的值 gSlopeBaseAngle.rad_x=*((int*)&rad[0]); //rad_x,rad_y,rad_z是int类型的...原创 2018-05-08 16:41:26 · 4785 阅读 · 0 评论 -
memset初始化结构体
memset可以方便的清空一个结构类型的变量或数组。 如: struct sample_struct { char csName[16]; int iSeq; int iType; }; 对于变量 struct sample_strcut stTest; 一般情况下,清空stTest的方法: stTest.csName[0]='\0'; stTest.iSeq=0; st...转载 2018-05-15 17:37:19 · 7647 阅读 · 0 评论 -
#define怎么将多个常量字符串连接起来
1、在日常编程中,可能遇到通过#define将多个常量字符串连接起来,可使用下述方法:#define CompanyID "my company"#define ProductItem "0123456789"#define HardVersion "PCB-101011"#d...原创 2019-08-16 15:22:16 · 5560 阅读 · 1 评论 -
标准的求数组的长度
有时候需要用到数组的长度,并且想写成通用的形式求数组的长度标准可这样求:float str[100]={0);则数组长度strlen=sizeof(str)/sizeof(float)原创 2019-08-22 09:17:57 · 585 阅读 · 0 评论 -
强制类型转换是四舍五入吗?
答案不是,1)将浮点数 强制类型转换为整数 是只取整数部分,如下:printf("%d,",(uint16_t)52.62)会输出522)如果想实现四舍五入:可在原来浮点数基础上+/-0.5,即可实现四舍五入printf("%d,",(uint16_t)52.62+0.5) 结果是53正数+0.5,负数-0.5,然后取整即可...原创 2019-08-29 16:13:53 · 12575 阅读 · 0 评论 -
enum与typedef enum的用法
1、传统的用字符代替数字定义是用#define如:#define MON 1#define TUE 2#define WED 3#define THU 4#define FRI 5#define SAT 6 #define SUN 7而可以使用enum代替(枚举)enum DAY{ MON=1, TUE原创 2016-01-28 15:34:49 · 1055 阅读 · 0 评论