Linux_C
文章平均质量分 87
Makefile,Linux 以及C语言
SOC罗三炮
嵌入式软件开发,ARM CPU架构研究,某厂芯片SOC系统验证工程师
展开
-
如何利用好cache写出高性能的代码(Make your programs run faster by better using cache )
笔者在学习cache时总结了一些在软件层面充分利用cache,来写出高性能代码方法。如何利用好cache写出高性能的C代码一,当线性访问数据(需要遍历数据结构)时,使用数组(arrays)而不是链表(Linked lists)二,经常使用的变量应该放在一起声明定义,(Variables you access often together should be close to one-another in memory)三,内存对齐:优化访问结构体或者类数组四,高效地访问矩阵(二维数组)Access原创 2023-10-12 23:31:33 · 3131 阅读 · 1 评论 -
C语言结构体字节对齐(内存对齐)之#pragma pack和__attribute__((packed)的使用
在不使用和本文主要讨论如何使用#pragma pack和__attribute__((packed)等选项来自定义字节对齐大小。使用pack功能将数据结构进行打包,以减小应用程序对内存的占用,这一点在嵌入式系统中,尤其是需要存储和访问大量的时候,显得尤其重要。如果没有使用#pragma pack和__attribute__((packed)等选项,将数据结构进行打包。编译器为了提高对数据成员的访问速度,通常会在不同大小的数据成员之间插入空白内存(padding),进行补齐操作,即内存对齐。原创 2023-07-01 23:07:54 · 5765 阅读 · 0 评论 -
ARM嵌入式编程优化之内联函数(inline)
内联函数的本质是以空间换时间:增加了代码量,但减少了函数调用时带来的性能损耗。默认情况下,编译器会自己决定是否将一个函数内联。在编译优化时,默认情况下编译器会根据时间对性能进行优化。如果编译器决定内联一个函数,它会确保避免大量的代码增长。当使用-Oz或-Os等编译优化选项来限制代码大小时,编译器对内联做出智能的判断,并旨在将代码量保持在最小。原创 2023-05-22 22:38:18 · 3948 阅读 · 0 评论 -
Trace32 SRST和TRST、system.attach 和 system.up的区别
下图为Trace32工具为ARM debug设计的 JTAG pin 脚图:其中,TRST和SRST信号是可选的。原创 2023-05-19 20:12:57 · 4897 阅读 · 0 评论 -
ARM嵌入式编译器-volatile关键字对编译器优化的影响
智能的(进行优化的)编译器可能会把变量的值临时储存在寄存器上,便于下次读取,以节约时间,这个过程被称为高速缓存。但是有一些agent在内存上改变了变量的值,寄存器上的还是旧数据,这样就出错了。如果被volatile 关键字修饰,编译器不会进行高速缓存,直接去内存中读取该变量的数据。编译器会优化什么将内存变量缓存到寄存器中。调整指令顺序,充分利用CPU指令流水线,进行指令重新排序读写指令。原创 2023-05-07 17:14:26 · 3998 阅读 · 0 评论 -
C++七种序列容器类型
七种序列容器1,vector-向量2,deque-双端队列3,list-双向链表4,forward_list-单链表(C++11)5,queue-队列(适配器),6,priority_queue-优先队列7,stack-栈8,array-数组类(非STL容器)1,vector-向量vector模板类是最简单的序列类型,除非其他类型的特殊优点能更好地满足需求,否则应默认使用vector。自动内存管理随机访问元素在尾部插入或删除元素,固定时间–O(1)在头部插入和删除元素,线性时间—O(n)可反原创 2020-10-30 18:24:22 · 1010 阅读 · 0 评论 -
C/C++标准格式、输入输出及main函数的作用
//#include这行代码是一条C预处理指令,相当于把stdio.h文件中所有内容都输入到该行所在位置//实际上是一种复制粘贴//stdio.h-->标准输入输出头文件 standard input output #include<stdio.h>//从main函数开始执行int main(void) //标准写法{//可以用大小写字母、数字和下划线来命名,首字符必须是字母或者下划线 int num = 1; printf("Number is %d \n",num);原创 2020-09-06 16:14:37 · 1728 阅读 · 0 评论 -
C语言位操作
在C语言中,可以单独操控变量的位(bit),一般高级语言不会处理这级别的细节,C在提供高级语言便利的同时,还能为汇编语言所保留的级别上工作,这使其成为编写设备驱动程序和嵌入式代码的首选语言。...原创 2020-09-23 20:19:18 · 709 阅读 · 0 评论 -
在 1G 内存的计算机中能否 malloc(1.2G)
作者:牛客192239号链接:https://www.nowcoder.com/discuss/20610?type=0&order=0&pos=6&page=1来源:牛客网问题:在 1G 内存的计算机中能否 malloc(1.2G) ?为什么?【解答要点】:malloc能够申请的空间大小与物理内存的大小没有直接关系,仅与程序的虚拟地址空间相关。程序运行时,堆空间只是程序向操作系统申请划出来的一大块虚拟地址空间。应用程序通过malloc申请空间,得到的是在虚拟地址空.转载 2021-05-09 18:12:20 · 1405 阅读 · 4 评论 -
C语言基础-从源代码到可执行文件的转换过程(编译和链接)
C语言基础知识C是编译型语言:编写C程序的7个步骤:1.定义程序的目标2.设计程序3.编写代码4.编译5.运行程序6.测试和调试程序7.维护和修改程序C编程的基本策略:用程序将源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)典型的C实现通过编译和链接两个步骤来完成。编译器把源代码转化成中间代码链接器把中间代码和其他代码合并,生成可执行文件1,源代码(.c文件)通过编译器转换为机器语言代码,并把结果放在目标代码文件(.obj文件)在编译之前还有预编译:处理原创 2020-09-06 09:27:01 · 5059 阅读 · 0 评论 -
C语言高级数据表示
通常,程序开发最重要的部分是找到程序中表示数据的好方法:选择数据类型如何存储数据设计管理数据的函数算法:操控数据的方法/*list.h,简单链表类型的头文件*/#ifndef LIST_H_#define LIST_H_#include<stdbool.h>#define TSIZE 45struct film{ char title[TSIZE]; int rating; };//一般类型定义typedef struct film Item;typed原创 2020-10-07 19:30:58 · 515 阅读 · 0 评论 -
C语言联合(union)和枚举(enum)学习
联合(union)联合是一种数据类型,它能在同一个内存空间储存不同的数据类型(不是同时储存),其典型用法是,设计一种表以储存既无规律、实现也不知道顺序的混合类型。其中联合的大小都相等,每个联合可以储存各种数据类型。#include<stdio.h>union hold { int digit; double bigfl; char letter;};/*该联合只可储存一个int类型、一个double类型或一个char类型的值。只能储存一个*/int main(void){原创 2020-09-22 11:32:15 · 1437 阅读 · 0 评论 -
C语言预处理器
C预处理器在程序执行之前查看程序,根据程序中的预处理指令,预处理器把符号缩写替换成其表示的内容。基本上他的工作就是文本替换。翻译程序的第一步首先,编译器把源代码中出现的字符映射到源字符集。第二,定位每个反斜杠后面跟着的换行符实例,并删除它们。将多个物理行替换成一个逻辑行://两个物理行printf("That is wond\ erful!\n");//转换成一个逻辑行:printf("That is wonderful!\n");第三,编译器将文本划分成预处理记号序列、空白序列原创 2020-09-25 21:16:47 · 220 阅读 · 0 评论 -
C语言和C++指针常量和常量指针
指针常量指针常量,用指针修饰的常量,它的本质是一个常量 int a = 111, b = 222; int * const p = &a; printf("%p\n",p); printf("%d\n",*p); *p = 333; printf("%d\n",*p); p = &b; //报错,p的值不能更改,[Error] assignment of read-only variable 'p' 结果 000000000024FE3C 111 333这原创 2020-09-27 20:20:28 · 498 阅读 · 0 评论 -
C/C++数组和指针学习总结
指针是一个存储内存地址的变量(或数据对象)与指针相关的运算符地址运算符 &后跟一个变量名时,&给出该变量的地址。&a表示变量a的地址地址运算符 *后跟一个指针名或地址时,* 给出存储在指针地址上的值。*b=a;//表示把a指向的地址上的值赋给b。声明指针声明指针变量时,必须指定指针所指向变量的类型,因为不同的变量类型占用不同的存储空间。一些指针操作需要知道操作对象的大小。另外,程序必须知道储存在指定地址上的数据类型。int * pi;//pi是指向int类型变原创 2020-09-13 20:21:16 · 461 阅读 · 1 评论 -
C/C++保留指定小数位数输出和取整方式
#原创 2021-03-29 23:08:41 · 11497 阅读 · 0 评论 -
【C++面试宝典】C/C++知识点补充
目录C++补充补充知识语言对比C和C++Java和C++Python和C++C和C++中struct判断结构体是否相等可变参数模板switch中case里不能自定义变量char和int转换malloc的底层实现C语言检索内存情况异常处理try/catchfork()epollC/C++C语言补充printfswitch动态内存管理malloc函数realloc函数calloc函数...原创 2022-01-11 00:00:00 · 2264 阅读 · 0 评论 -
《C陷阱与缺陷》读书笔记与总结
《C陷阱与缺陷》读书笔记目录《C陷阱与缺陷》读书笔记一,函数指针和指针函数二,C语言数组三,空指针并非空字符串四,整数溢出五,为main函数提供返回值六,声明和定义(extern)七,命名冲突与 static修饰符八,形参、实参和返回值九, 检查外部变量类型十,预处理器-不能忽视宏定义中的空格十一,预处理器-宏不是函数十二,宏不是类型定义十三,比较时把常量写在左边一,函数指针和指针函数float *g() , (*h)();()的优先级大于 * , 因此 *g() 为 *( g() ) ,该函原创 2022-04-03 12:02:41 · 11897 阅读 · 0 评论 -
C/C++字符串输入输出和字符串函数基础学习
字符串常量(字符串字面量)用双括号括起来的内容称为字符串字面量,也叫做字符串常量。属于静态存储类别,如果在函数中使用字符串常量,该字符串只会被储存一次,在整个程序的生命周期内存在,计时函数被调用多次。**被双引号括起来的内容被视为指向该字符串储存位置的指针。/* 输出结果: We, 0000000000404000, t 根据%s打印出We,根据%p转换说明打印出一个地址,因此"are"代表一个地址 最后,*"the best"表示字符串所指向地址时储存的值,为该字符串的首字母 t */原创 2020-09-16 14:49:43 · 2246 阅读 · 0 评论 -
C语言储存类别和内存分配malloc、calloc和realloc函数
可修改的左值如果可以使用左值修改对象中的值,则该左值就是一个可修改的左值。cosnt char * pc = "Behold a string literal!";程序根据声明,把相应的字符串常量存储在内存中,内含这些字符值的数组就是一个对象,由于数组中的每一个字符都能被单独访问,所以每个字符也是一个对象,该声明还创建了一个标识符为pc的对象,储存着字符串的地址。由于可以设置pc重新指向其他字符串,所以标识符pc是一个可以修改的左值,const只能保证被pc指向的字符串内容不被修改,但是无法保证p原创 2020-09-21 13:32:27 · 659 阅读 · 0 评论 -
C语言简单判断是大端还是小端(字节序)以及网络字节序
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。简单来说,就是:小端——低地址存储低位,高地址存储高位 大端——低地址存储高位,高地址存储低位判断原理:使用..原创 2021-05-26 11:00:02 · 1902 阅读 · 0 评论 -
C/C++加减乘除运算效率分析
运算效率移位 > 赋值 > 大小比较 > 加法 > 减法 > 乘法 > 取模 > 除法。使用移位来代替乘除法,提高运算效率 int a = 64; cout << "a / 2 = " << (a >> 1) << endl; cout << "a / 4 = " << (a >> 2) << endl; cout << "a / 8原创 2021-03-21 10:09:36 · 9534 阅读 · 0 评论 -
C/C++中操作符sizeof和函数strlen()的区别
对于字符串,sizeof关注的是字符串所占的空间,strlen关注的是字符串的实际长度。strlen(char*)函数求的是字符串的实际长度,直到遇到第一个’\0’,然后就返回计数值,且不包括’\0’。1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。2.sizeof是算符,strlen是函数。3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’’\0’'结尾的。原创 2020-12-05 11:27:49 · 624 阅读 · 0 评论 -
链表和数组的优缺点对比
数组和链表比较数组优缺点C/C++直接支持提供随机访问在编译时确定大小插入和删除元素费时链表优缺点运行时确定大小快速插入和删除元素不能随机访问用户必须提供编程支持删除和插入元素过程在数组中插入元素,必须移动其他元素以腾出空位,然后再插入,插入的元素离数组开头越近,要被移动的元素越多。在链表中插入节点却非常简单,只需要给两个指针赋值。在数组中删除一个元素同样要移动许多相关元素,但是链表删除节点只需要重新设置一个指针并释放被删除节点占用的内存即可。访问元素对于数组而言,原创 2020-10-01 12:03:23 · 938 阅读 · 0 评论 -
C语言可变参数函数(printf/scanf)
C 语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function)。这种函数需要固定数量的强制参数(mandatory argument),后面是数量可变的可选参数(optional argument)。这种函数必须至少有一个强制参数。可选参数的类型可以变化。可选参数的数量由强制参数的值决定,或由用来定义可选参数列表的特殊值决定。平时我们写C语言函数时,一般是固定参数的,但是像打印输出格式化内容时,其参数个数就不确定了,类似如下:printf("This is a s.转载 2021-04-22 10:38:32 · 3749 阅读 · 0 评论 -
C++标准模板库STL学习总结
STL提供了一组表示容器、迭代器、函数对象和算法的模板。容器,是一个与数组类似的单元,可以存储若干个值,STL容器是同质的,即存储值的类型相同。算法,是完成特定任务(比如完成排序和查找)的处方。迭代器,能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。函数对象,是类似函数的对象,可以是类对象或函数指针(包括函数名,因为函数名被用作指针)。迭代器迭代器是一个广义指针,它可以是指针,也可以是一个可对其执行类似指针操作(如解引用和递增)的对象。通过指针广义化为迭代器,让STL能够为不同原创 2020-10-29 20:36:19 · 388 阅读 · 0 评论 -
C++关于命名空间namespace的理解
在C++中经常要用到标准库中的cout、cin和endl。一般有三种方法来引用:直接使用using namespace std语句使用std::前缀: std::cout std::cin std::endl有选择性地用using语句: using std::cout using std::cin using std::endl这种语法的一般形式是:using 前缀::符号;有了这个语句,指定的符号可以随后不加std::前缀而被引用。一个复杂的程序可能会使用多原创 2020-10-12 19:41:49 · 967 阅读 · 0 评论 -
C/C++关键字总结学习
然而,在文件间共享const数据要小心,可以采用两个策略:第一,遵循外部变量的常用规则,即在一个文件中使用定义式声明,在其他文件中使用引用式声明(用extern关键字)。但是有一些代理在内存上改变了变量的值,寄存器上的还是旧数据,这样就出错了。如果要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(单定义规则),但在使用该变量的其他所有文件中,都必须使用extern关键字声明它;数组名是个地址,函数有可能会更改数组的数据,加了const关键字之后,使函数只能读取array数组的值,而不能修改它。原创 2020-10-12 20:50:34 · 1305 阅读 · 0 评论 -
Qt入门基础知识 pro项目文件、QApplication和信号和槽机制
Qt入门pro项目文件QApplication应用程序类信号和槽机制自定义信号槽信号槽的更多用法pro项目文件QT += core gui Qt包含的模块greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //大于4版本以上 包含 widget模块TARGET = 01_FirstProject //目标 生成的.exe程序的名称TEMPLATE = app //模板 应用程序模板 Application原创 2020-11-09 17:15:46 · 1665 阅读 · 0 评论 -
C语言结构体(struct)学习
结构初始化#include<stdio.h>#include<string.h>char * s_gets(char * st, int n);#define MAXTITL 41#define MAXAUTL 31//结构体 struct book{ char title[MAXTITL]; char author[MAXAUTL]; float value;};int main(void){ struct book library;//把librar原创 2020-09-22 09:56:42 · 852 阅读 · 0 评论 -
C语言复杂的声明(数组指针和函数指针)
指针数组和数组指针:int a[8][8]; //一个内含int数组的数组int ** ptr;//指向指针的指针,被指向的指针指向intint * b[10];//指针数组,内含10个元素的数组,每个元素都是指向int类型的指针int (* b)[10];//数组指针,一个指向数组的指针,该数组有10个int类型的值int * c[3][4];//二维指针数组,每个元素都是指向int类型的指针int (* d)[3][4];//一个指向二维数组的指针,该数组中含int类型值int (* d[原创 2020-09-22 16:36:01 · 818 阅读 · 0 评论 -
ARM AArch32 立即数范围以及合法立即数
笔者在写汇编代码时曾遇到过立即数不合法的问题,12bits可以表示的无符号数范围为:`0~4095`,有符号数的范围为:`-2048 ~ +2047`,如果不在这12 bits的立即数上增加点创作性,而直接硬解码用来表示立即数是远远不够的。所以在ARM中将这12 bits分为 8-bit 常数(0~255)和 4-bit旋转位移值(0~15),8 bits 常数可以按照循环位移值的2倍(0~30)向右进行循环位移,位移的步进值是以2为单位,可以是:`0、2 、4 、6 、… 、30`。...原创 2022-06-20 21:31:55 · 9160 阅读 · 0 评论 -
Linux中tcsh/tcsh和bash的环境变量的配置以及切换shell版本
Linux中tcsh/tcsh和bash的环境变量的设置文章目录Linux中tcsh/tcsh和bash的环境变量的设置一,前言二,tcsh/csh中设置环境变量:set和setenv三,bash中更改环境变量:export四,使用chsh命令更改当前使用的shell五,关于永久更改环境变量的问题一,前言笔者最近在工作环境内使用export命令设置环境变量时,出现了:export:Command not found.的错误,经研究才发现Linux内支持多种Shell,比如sh、bash、csh、tcs原创 2022-04-24 14:48:35 · 12459 阅读 · 0 评论 -
劳德巴赫仿真测试工具Trace32的脚本语言Practice的基本使用(cmm文件)
Practice Script Language文章目录Practice Script Language为什么使用PRACTICE 脚本(.cmm)相关参考文档PRACTICE 脚本架构函数 Function变量和PRACTICE 宏(PRACTICE Macros)之间的区别PRACTICE MacrosPRACTICE 脚本元素标签Labels注释Comments行延续字符脚本流条件脚本流脚本嵌套块结构PRACTICE 宏GLOBAL 宏LOCAL 宏PRIVATE 宏打开或关闭PRACTICE翻译 2022-04-16 13:17:50 · 16207 阅读 · 0 评论 -
C/C++预处理过程详细梳理(预处理步骤+宏定义#define/#include+inline函数+宏展开顺序+条件预处理+其它预处理定义)
C/C++预处理过程的详细梳理(宏定义+条件预处理+其它预处理)目录C/C++预处理过程的详细梳理(宏定义+条件预处理+其它预处理)1 预处理的步骤1.1 把源代码中出现的字符映射到源字符集1.2 将多个**物理行**替换成一个**逻辑行**1.3 将注释替换为空格1.4 将**逻辑行**划分成预处理记号(Token)和空白字符1.5 宏展开,处理#include预处理指示1.6 将转义序列替换1.7 连接相邻字符串1.8 丢弃空白字符,如空格和Tab等2 宏定义2.1 变量宏定义和函数宏定义:#defi原创 2022-04-10 13:00:00 · 7989 阅读 · 2 评论 -
C语言内联inline函数(C99)与普通函数在汇编代码视角下的区别
内联函数(C99)C99引入一个新关键字inline,用于定义内联函数(inline function)。通常函数的调用都有一定的开销,因为函数的调用包括建立调用、传递参数、跳转到函数代码并返回。内联函数就是以空间换时间,使函数的调用更加快捷。标准规定:具有内部链接的函数可以成为内联函数,还规定了内联函数的定义与调用该函数的代码必须在同一个文件中。因此最简单的办法是使用inline和static修饰。通常,内联函数应定义在首次使用它的文件中,所以内联函数也相当于函数原型。关于内联函数的细节描述,可以参原创 2022-04-09 10:45:00 · 7805 阅读 · 0 评论 -
和宏一样快的内联函数( An Inline Function is As Fast As a Macro)
和宏一样快的内联函数( An Inline Function is As Fast As a Macro)原文链接:https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/Inline.html#Inline通过声明一个函数 内联,你可以使用 GCC 编译器更快地调用这个函数。GCC能实现这一点的一种方法是:将该函数的代码集成到其调用方的代码中。通过消除函数调用开销(建立调用、传递参数、跳转到函数代码并返回),来加速代码的执行;此外,如果函数有实参为常量,那么这些翻译 2022-04-08 16:07:42 · 8671 阅读 · 0 评论 -
C语言多文件编译总结:extern和static关键字+.h头文件包含规则+不能包含.c文件原因分析
多文件编译链接与.h头文件包含规则extern 和 static 关键字使用头文件封装一,尖括号和双引号二,头文件路径查找三,头文件重复包含四,为什么要包含头文件而不是 .c 文件多文件编译链接与.h头文件包含规则如下示例程序,stack.c中定义了一个栈,以及栈的一些简单功能函数:push(),pop()以及is_empty()等。main.c为程序主函数,主要测试了栈的这些功能。// stack.cchar stack[512];int top = -1;void.原创 2022-04-06 21:18:04 · 13328 阅读 · 0 评论 -
C/C++自动化编译工具Makefile的基本使用
本文主要为陈皓的《跟我一起写Makefile》读书笔记。一,前言笔者在初学C语言时使用的开发工具是VC++6.0,后来学习C++时,使用的是DEV-C++,再后来使用Visual Studio做软件开发。原创 2022-03-25 21:09:27 · 12762 阅读 · 1 评论