C语言知识点
文章平均质量分 50
实例为主
匠在江湖
这个作者很懒,什么都没留下…
展开
-
嵌入式工程师面试知识总结
a) 一个整型数?b) 一个指向整型数的指针?c) 一个指向指针的的指针,它指向的指针是指向一个整型数?d) 一个有10个整型数的数组?e) 一个有10个指针的数组,该指针是指向一个整型数的?f) 一个指向有10个整型数数组的指针?g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数?h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数?答:a) int a;b) int *a;...原创 2022-08-14 13:25:50 · 6460 阅读 · 1 评论 -
中断与其他函数共享变量、临界资源的保护
volatile(英译:易变的)是一个特征修饰符关键字,防止编译器对修饰的变量相关代码进行优化,每次使用都重新读取变量的值,而不是使用寄存器里的备份。volatile字面意思不太好理解,其实它是提醒编译器这个变量是易变的,不要去优化它!对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一地进行编译并产生相应的机器代码(产生四条代码)。原创 2022-06-21 20:57:56 · 1702 阅读 · 0 评论 -
while(1)和for(;;)区别有多大
功能相同都是死循环;不同的是编译器生成汇编代码数量不同,也就是效率不同。编译前 编译后 分析 while (1); mov eax,1 test eax,eax je foo+23h jmp foo+18h 死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。 for (;;); jmp foo+23h 两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 结论:for(;;) 指令少 ..原创 2022-05-11 15:31:02 · 357 阅读 · 0 评论 -
什么是回调函数、钩子函数
这两个函数常常出现在操作系统中,有些相近很容易混淆,这两个名词都是站在操作系统为主体的角度根据功能特性命名的名称 定义 区别 回调函数 系统运行中,需要调用用户编写的函数,该函数通过函数指针方式注册给系统,这样的函数就是回调函数。用户通常都是调用系统函数的,而系统反过往回调用了用户函数,所以命名回调函数。 函数名和函数内容都是用户定义 钩子函数 系统定义了函数同时编写了部分函数体或函数名,函数内容需要用户编写的函数叫钩子函数。如同钩子样伸出了部分给用户,钩住用户编写原创 2022-05-10 21:15:06 · 477 阅读 · 0 评论 -
BC3.1精简版win7/10下不兼容问题的解决
在学习 任哲《嵌入式实时操作系统 uCOS-II 原理及应用》中出现BC3.1版本不兼容问题,查阅了大量资料是使用DOSBOX来解决此问题。为了学习UCOS-II,参考任哲老师的,但是在WIN10下安装uCOS-II时出现了版本不兼容的问题,于是使用DOSBOX来解决此问题。此篇文章完全是写来自己看,为自己加深映像。解决问题的方法来源于此两篇文章:https://blog.csdn.net/qq_36847641/article/details/80825303https://blog.csdn原创 2022-04-27 22:29:31 · 1309 阅读 · 4 评论 -
将STM32 函数和常量存到Flash指定地址、 变量存到SRAM指定地址
MDK中定义unsigned char ary[3] __attribute__((at(0x20000000))) = {0, 1, 3}; //MDK中定义变量指定SRAM地址const unsigned char buf[2] __attribute__((at(0x08035800))) = {9, 7}; //MDK中定义常量指定Flash地址void fun(void) __attribute__((at(0x08075800))); //MDK中定义函数指定Flash地址GC原创 2022-05-12 20:44:33 · 4955 阅读 · 0 评论 -
C语言 printf 打印double、float类型
#include <stdio.h> //库头文件 /** ****************************************************************************** * @brief 主 函数 * @param None * @return None * @note ***************************************************************...原创 2022-01-16 18:18:57 · 9898 阅读 · 0 评论 -
大小端转换代码(宏、函数方式)(浮点、整数)
宏实现大小端转换#define BIG_LITTLE_SWAP16(x) ( (((*(short int *)&x) & 0xff00) >> 8) | \ (((*(short int *)&x) & 0x00ff) << 8) )#define BIG_LITTLE_SWAP32(x) ( (((*(long int *)&x原创 2022-01-16 17:20:36 · 4955 阅读 · 0 评论 -
float、double 数字精度(小数后几位)
float 是32位 ,具有7位十进制数字精度。(1位符号,8位为指数,值23 位)double是64位 ,具有15位十进制数字精度。(1位符号,11位为指数,值52 位)原创 2022-01-16 17:18:04 · 16385 阅读 · 0 评论 -
卡尔曼滤波算法 C语言实现
/** ****************************************************************************** * @brief 卡尔曼滤波器 函数 * @param inData - 输入值 * @return 滤波后的值 * @note r值固定,q值越大,代表越信任测量值,q值无穷大,代表只用测量值。 * q值越小,代表越信任模型预测值,q值为0,代表只用模型预测值。 * ...原创 2021-12-08 19:52:54 · 3659 阅读 · 0 评论 -
sizeof() 代码示例详解(变量,数组,指针,结构体)
sizeof() 是一种内存容量度量函数,功能是返回一个变量或者类型的大小(以字节为单位);在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符。测试代码:#include<stdio.h>typedef struct{ char c1; short int c2; short int c[3];}Test1TypeS;#pragma pack(push) // 将当前pack设置压栈保存#pragma pack(1)// 必须在结构体定义之前原创 2021-12-02 10:02:19 · 2315 阅读 · 0 评论 -
printf()输出格式详解(Keil C51 、标准C)
1.printf()简介printf() 是 式样化 输出函数, 简单说 就是 规定式样输出消息 的函数。printf() 是 C语言标准库函数,用于将格式化后的字符串输出到标准输出(即标准输出文件,对应终端的屏幕)。printf() 所在头文件 stdio.h#include <stdio.h>函数原型:int printf ( const char * format, ... );返回值:正确情况下 返回 输出的 字符总数 错误情况下 ..原创 2021-11-29 21:50:11 · 18166 阅读 · 2 评论 -
程序代码 注释框架模板
main.c/** @copyright Copyright(c)2014-2011 XXXX Co.,Ltd. All rights reserved. ****************************************************************************** * @mainpage XXX程序 * <table> * <tr><th>Project <td>XXX * &l原创 2021-11-19 13:25:09 · 403 阅读 · 0 评论 -
常见编程代码命名风格
附件5 常见标识符命名风格种类 常见 编程标识符命名风格 种类 类别 别称 命名法逻辑 特点 举例 优缺点 常见应用场合 帕斯卡 大驼峰 大小写混排,每个单词的首字母大写。 voidGetKey(void);intTimeCount; ..原创 2021-11-18 15:41:29 · 929 阅读 · 0 评论 -
程序、代码、硬件常见的英文缩写
附件1 常用单词缩写(英文)(元音:aeiou) 全词 缩词/简写 中译 全词 缩词/简写 中译 指令内核相关类 source src 源头 default def 默认 destination原创 2021-11-18 15:35:55 · 6446 阅读 · 0 评论 -
堆(Heap)栈(Stack)的区别
堆栈的概念: 堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。 单片机应用中,堆栈是个特殊存储区,堆栈属于RAM空间的一部分,堆栈用于存储 函数调用、中断切换时保存和恢复现场数据。堆栈中的数据具有一个特性:第一个放入堆栈中的数据总是被最后拿出来, 这个特性通常称为先进后出 (FILO—First-In/Last-Out)。 堆栈中...原创 2021-06-10 15:19:53 · 1310 阅读 · 0 评论 -
大小端概述,验证、转换方法,常见单片机、CPU、系统、文件模式
STM32单片机的存储方式为小端模式举个例子:0x87 65 43 21 在内存 0x20 00 00 00 中的表示形式。1)大端模式:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。(其实大端模式才是我们直观上认为的模式,和字符串存储的模式差类似)-------------------------低地址 ------------------------------------------------------------------> 高地址原创 2020-12-26 15:03:32 · 655 阅读 · 0 评论 -
结构体变量 存到24C02中 读出来不对 (结构体成员变量 字节对齐问题)
本想把 结构体 变量数据 保存 到24C02中, 再读取保存数据,验证保存是否成功。开始没加 #pragma pack (x) 对齐关键字,结果反复调试都是失败只有部分数据存进去了。若将成员变量一个一个存,再一个一个读就没问题。在单步调试发现成员变量的地址不连续。豁然开朗 原来字节 对齐问题,编译器默认是4字节对齐,所以就导致了成员变量地址不连续。成员变量中有1、2、4字节的公约数是1, 所以加 #pragma pack (1) 1字节对齐就解决了结构体成员变量地址不连续问题,让其连续。触摸屏校准原创 2020-07-04 12:17:50 · 798 阅读 · 0 评论 -
return, break, continue, goto 区别 和 作用 含实验代码验证
return:在此位置 直接结束本函数 , 本函数 后面程序不执行。(只能函数中用)break:在此位置 跳出本层循环体 或 跳出switch语句(无论层次多深),转去执行 循环体 或 switch语句外 后面程序continue:在此位置 结束本次循环,即不在执行本次循环后面的程序,转去执行下一轮循环,不跳出循环体。(只能循环体中用)goto:在此位置 无条件转移 到 标号位置 。不主张使用,容易造成程序流程混乱,理解和调试程序困难(好多世界500强企业,在企业编程规范中明确 不准 用)实验代码:原创 2020-07-04 10:24:23 · 201 阅读 · 0 评论 -
二维数组传参 实例详解
无论 一/二维数组 传递参数本质 都是首地址的传送, 无法带下标传送,只能单独传送下标(下标本质就是地址偏移量),或约定下标长度! 二维数组实际也还是一维数组,只是加了第二维寻址下标,在内存中存储同一维一样。二维数组:形式一:传第一维长度;限定第二维度长度形式一 示例1:数值数组传递#include <stdio.h>/** *****************************************************************************原创 2020-11-22 12:05:57 · 7398 阅读 · 1 评论 -
c 语言printf输出,位数不够补0
int x = 9;printf("%03d", x); //输出不够3位前面补0输出:009printf("%02d", x); //输出不够2位前面补0输出:09printf("%3d", x); //输出不够3位前面补空格输出:空格空格9printf("%d", x); //输出有效位输出:9...原创 2020-11-07 13:46:07 · 12142 阅读 · 2 评论 -
int 整型 、float浮点型、double双精度类型 求绝对值函数,及所在库头文件
@TOC#include <math.h> //所在头文件1、int abs(int a); // 处理int类型的取绝对值2、double fabs(double a); //处理double类型的取绝对值3、float fabsf(float a); //处理float类型的取绝对值欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知原创 2020-10-21 10:32:24 · 2849 阅读 · 0 评论