首先直接买教程看,确实难,无非就是那几本书,龙书,虎书,鲸书之类,但是这些书还是很难读懂的。我只对c语言感兴趣,因此,c语言作为开发语言,待编译语言也是c语言,推荐如下书:自己动手写编译器、链接器(看完了,感觉后面部分比较难搞了,待编译语言是c语言(简化版))c编译器剖析(UCC作为实战编译器,非常好,C语言完全版)作者也写了同步的系列博客(和书一一对应)C编译器剖析_2.2 词法分析_She
The syntax of C in Backus-Naur Form<translation-unit> ::= {<external-declaration>}* <external-declaration> ::= <function-definition> | <declaration&g
gcc的命令选项都是,-x1 xxx1内容 -x2 xxx2内容这样,比如头文件路径添加选项 gcc命令选项,顺序无关紧要 --xx和-,是用区别的,前者是选项的全
我们编译生成目标文件,子程序跳转时候,其实用的都是相对地址跳转,比如目标程序标号距离当前程序(pc指针的值)的偏移,然后跳转过去即可。访问全局变量也是如此,编译器分配的全局变量距离当前pc的相对偏移,访问就是了。但是,当我们的data段(全局变量)需要搬移到其它位置时候,这个相对偏移,就出错了。为了解决代码运行时重定位问题,我们的程序编译时候加上-fpic选项,生成的就是与地址无关的代码。编译器会在目标文件text段末尾加上一个全局符号表(程序中可以通过__rel_dyn_start引用)。所有
连接脚本将我整整蒙了1天零一个上午,做了很多实验,看了人家不少例子代码勉强能驾驭了,让linker按照我想要的来处理,做个笔记。
有空再写
*typedef函数指针用法char(*pFun)(int); charglFun(inta){return;} voidmain() { pFun=glFun; (*pFun)(2); }所以说pFun就是一个实实在在的指针变量,而不是一种类型2.使用typedef更直观更方便形式1:typedef 返...
程序中一个结构体struct A{char a;char b;bool c;}struct A v;v.a = 128;v.b = 16;v.c = 1;此时如果我们想把这个结构体变量v保存起来,就这样:W25QXX_Write((u8*)&v,ADDR,sizeof(v)); //保存在地址为ADDR的flash存储器里或者保存在一个文件里都...
32位cpu为例,cpu在访问内存的时候是以一个字进行传输的(计算机中,一个机器字长就是cpu位数,32位cpu,四个字节为一个字),那么也就是说cpu读取数据每次都是四个字节四个字节的读取,计算机最初是从地址0开始寻址,那么寻址也就是4个字节4个字节的地址依次往后找。如果我们只需要读取一个字节的char型变量,那么计算机也是读取它所在的4个字节出来,然后提取出那个目标字节就行了,因为32位计算机...
51单片机(8位):char 1int 2long 4float 4double 8指针类型所占字节和地址总线宽度有关系,8位机器的话就是1个字节stm32单片机(32位):char 1short 2int 4long 4float 4double 8指针类型所占字节和地址总线宽度有关系,32位机器的话就是4个字节...
先了解如下几点知识和过程:*冯诺伊曼体系计算机程序指令代码都是提前从硬盘加载进入内存从而执行的(如果是哈佛体系结构的计算机指令代码是直接在外存里面执行的,具体可以看我这篇文章,计算机冯诺伊曼体系结构和哈佛体系结构区别和处理器性能评判标准),这些指令代码是存放在内存中进程的代码段,同一个函数内的指令代码是按照地址顺序存储的(编译器决定的)(也就是说只要指令地址+1就可以自动得到下一条指令的地址...
这是我几年前做的一个电子设计比赛,获得了二等奖,就是实现一个老人机的九宫格输入法,可以输入数字与字符和常用汉字
交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别自己之前一直没搞清楚这两个交叉编译器到底有什么问题,特意google一番,总结如下,希望能帮到道上和我有同样困惑的兄弟…..一. 什么是ABI和EABI1) ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM
基础知识复习:正数在内存中的表示形式:以原码表示的,比如1在在32位机器上为0x00000001 负数:以补码表示的,比如-1在32位机器的表示是0xffffffff(最高位表示符号位,关于补码表示,看我后面的参考链接)
a.h#include<stdio.h>#ifndef _A_H#define _A_H只是解决头文件重复包含的问题的,但是头文件嵌套包含,就不代表不会出问题,就会关系错综复杂,出现标识符未定义,重定义等错误。(具体的错误和举例,自己百度搜索吧)所以C语言头文件包含原则如下:(头文件嵌套的话,会造成包含很多不必要的头文件,会造成编译速度变慢)文件中实现变量、函数的定义...
举例:str = " abc 123333 qqw 12 1 3 sadfd dfasfdsf "这样的字符串提取出指定的第几n的字符串内容。比如针对上面的字符串,想提取出第3个字符串,即"qqw",那就写为unsignedchar*res[10];getParaFromStrInstruction(str,3,res);printf(r...
这里是用链表实现的队列,主要注意一点,很难发现的隐形错误: // 1. 如果硬实时就绪队列前面的任务硬实时任务为挂起态,即已经执行完了,那么就从就绪队列里删除这个队首TAB if(IsEmpty(queueReadyHardTaskPtr)!=true) { for(i=0;i<queueReadyHardTaskPtr->Size;i+...
看到个写得比较好的博文,转给大家看看格式一:
为了代码简介高效,可以方便的被多个链表连接起来,而且这
#define 定义一个预处理宏#undef 取消宏的定义#if 编译预处理中的条件命
为了代码简介高效,可以方便的被多个链表连接起来,而且这个链表可以很方便的被各种不同类型数据域复用,我们实现单双链表时候(链表节点中不需要数据域),可以像下面这样子:typedef struct List{ struct List* next; struct List* pre; //注:这里面没有数据域}List_t;typedef struct Student{ char
#define 定义一个预处理宏#undef 取消宏的定义#if 编译预处理中的条件命令,相当于C语法中的if语句#ifdef 判断某个宏是否被定义,不能或运算,若已定义,执行随后的语句#ifndef 与#ifdef相反,判断某个宏是否未被定义,不能或运算#elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#eli...
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号