
C 语言
暖暖的时光
这个作者很懒,什么都没留下…
展开
-
gcc针对部分代码取消编译优化
为了提高编译和运行速度,或者为了减少代码段大小,我们常常需要使用编译优化。默认是-O0, 我们可以修改为-O1, -O2,-Os,-O3等。但是编译优化有时候并不一定优化到最佳的效果,或者优化的结果需要某些支持才能正确执行。我曾经碰到过一个现象:在函数func1()内部定义一个数组:void func1(){ uint8_t slot_table[2][8] = {{0,4,1,5,2,6,3,7},{8,12,9,13,10,14,11,15}}; ...... uin原创 2020-06-29 10:12:30 · 7221 阅读 · 0 评论 -
RISC-V 使能、禁止、恢复全局中断
RISC-V的全局中断标志是在mstatus的MIE字段中。所以对全局中断进行操作时,配置MIE字段即可。禁止中断#define disable_irq() do {asm volatile ("csrr mstatus, 0x0");} while(0)使能中断:0x8表示mstatus的第3bit,即MIE字段,设置为1表示使能全局中断#define enable_irq() do {asm volatile ("csrr mstatus, 0x8");} while(0)不过这种简单粗暴原创 2020-06-15 15:19:30 · 4811 阅读 · 1 评论 -
RISC-V 不定长的指令周期
在实际cpu的运行过程中,由于CPU存在分支预测功能,beq指令的周期不是固定的。比如有8级流水的CPU,beq的指令周期有1-8个时钟周期(还是7个?目前我调试的时候发现最多的是7个)。另外,即使对于lw指令,其指令周期也不是固定的。...原创 2020-06-08 18:42:47 · 3094 阅读 · 3 评论 -
RISC-V GCC下使用inline
目前在做性能优化,就是在最短的时间内能跑完一个完整的神经网络,因此对代码的执行时间比较敏感。今天发现在头文件中定义的static inline函数,编译之后在两个源文件中分别定义了static函数,并没有实现inline该有的功能。甚至比普通的函数还差,因为同样的代码拷贝了两份,代码段变大了。于是考虑把static去掉看看,发现直接报告"undefined reference"。为了排除多文件使用的影响,写了一个inline测试函数do_something(),直接仅仅在一个c源文件(test.c)中定义和原创 2020-06-08 18:03:35 · 503 阅读 · 0 评论 -
Vim常用命令
一般模式下操作o: 在当前行之下新开一行,并把光标置于行首v/ctrl+v: 可以分块拷贝,列模式hjkl: 光标移动1gg: 跳到第一行的行首,即文件头2gg: 跳到第二行的行首G:跳到文件尾在某一行中跳到某列:0(数字零):行首$: 行末fx:搜索当前行中下一个出现字母x的地方。比如fb复制、粘贴:yy: 复制nyy: 复制当前行...原创 2019-09-26 17:44:13 · 146 阅读 · 0 评论 -
从编译原理的角度看C语言是如何转换成汇编语言的?
大家都知道计算机只能处理和识别二进制指令,而我们利用各种高级编程语言所编写的程序,要经过一些列的处理步骤,最终转变为汇编指令,再最后转变为机器指令。以上这些转变是如何发生的就属于大名鼎鼎的“编译原理”所研究的范畴,作为计算机专业学生,它的重要性毫无质疑,自然也是必修课。而我们几年所要给大家讲的是高级编程语言到汇编语言这一转变的过程,后面就以C语言为例。...转载 2019-09-26 17:41:48 · 1774 阅读 · 0 评论 -
对于数组名取地址
对普通变量取地址我们很熟悉,可是对于数组名取地址是个什么东西呢?数组名可是指向数组第一个元素的地址啊。前两天有个同事这么写:void func(char *name);main(){ char ifname[16] = "abcd"; func((char*)&ifname);}以前一直认为,数组名做函数参数时,被转换为指针类型,再对它取地址,那就是地原创 2012-02-12 23:23:10 · 354 阅读 · 0 评论 -
异或
<br />任何值与0异或,值不变。<br />任何值只有与其本身异或,异或结果才为0。原创 2010-11-15 16:50:00 · 323 阅读 · 0 评论 -
变量名与变量值
<br />研一时,很偶然的翻开谭浩强老先生的《C程序设计》(是师姐的书,俺的老早就卖了,估计当时觉得这本书写得不够好),很偶然的看到关于变量名的一段话:“变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。”<br />当时很震惊上课的时候居然没有发现这句蛮有深意的话语,可是研一的时候还是没有完全明白,只是知道有这么几个东西:变量名、内存地址、变量值。后来看到指针的地方,说到了“符号表”的这原创 2010-11-13 22:06:00 · 4779 阅读 · 2 评论 -
速记
210=1024=1K216=64K220=1024K=1M原创 2010-12-08 22:20:00 · 384 阅读 · 0 评论 -
lint
<br />今天早上用lint时发现一个错误,在文件ccc中报错:函数read(int a,tu b, int c)有太多参数,错误显示read函数只有两个参数。检查了好久,read()函数的调用肯定没问题,可是就是找不出错误的原因。<br />tu结构是在文件aaa.h中定义的一个结构,read()函数是在文件bbb.h中声明,在bbb.c中定义的一个函数,然后在bbb.c中#include aaa.h。lint bbb.c时没有发现错误,但是lint ccc.c时就出错了。后来用tornado来进行编译原创 2010-12-07 14:20:00 · 317 阅读 · 0 评论