linuxc开发教程,送给初学者:嵌⼊式LinuxC⼊门⼤全
原标题:送给初学者:嵌⼊式Linux C⼊门⼤全
嵌⼊式系统专业是综合了计算机硬件技术、计算机软件技术以及电⼦电路技术的⼀门综合学科,所涉及的内涵和知识⾮常⼴泛,包括:数字电路,模拟电路,计算机组成原理,单⽚机基础,C语⾔基础,操作系统,数据结构,编译原理,计算机控制,计算机⽹络等知识。
在真正学习嵌⼊式开发之前,⾸先要打好基础。其中最重要的是C语⾔基础、数字电路、计算机组成原理三门课程。下⾯我们就来讲下嵌⼊式Linux C的基本知识点。
⼀、 基本开发环境
Linux下C语⾔开发环境
使⽤⼯具:程序⽣成⼯具GCC、程序调试⼯具GDB、⼯程管理⼯具为make和Makefile。
开发流程:使⽤编辑⼯具编写C语⾔源⽂件,然后编译⽣成机器代码为主的⼆进制可执⾏程序。
编译流程:C语⾔经过编译-汇编-链接,最终⽣成可执⾏程序格式。可执⾏程序包含两部分内容:程序头和程序主体。
linux下的sleep函数嵌⼊式C语⾔的开发环境
程序的⽣成⼀般使⽤的是从x86到⽬标机的编译⼯具,程序的开发⼯具是运⾏于x86机器上的可执⾏程序,⽽是⽤开发⼯具⽣成的⽬标是以⽬标机器代码为实体的映像⽂件或者可执⾏程序,这个⼯程称为“交叉编译“。
和普通Linux环境下开发相⽐,更需要掌握⼀些⼏点:
* 库函数和系统调⽤ * C语⾔⾼级应⽤* C语⾔在嵌⼊式中的特殊语法(⼤⼩端,内存对齐等)* 资源性能考虑(运⾏效率与存储空间)
⼆、 基本开发⼯具
Linux⽂本编辑⼯具VI
主要这个掌握VI三种模式的切换:命令模式、⽂本输⼊模式、和末⾏模式,以及VI编辑器的各种命令与操作。
学习VIM的使⽤,编辑vimrc⽂件,gedit ~./vimrc修改功能(⽐如显⽰⾏数、颜⾊加亮等)。
GCC程序开发⼯具
GCC能完成从C、C++、Objective-C等源⽂件向运⾏在特定CPU硬件上的⽬标代码的转换。对于通⽤计算机,⼀般使⽤GCC⽣成x86的可执⾏代码;对于嵌⼊式开发系统使⽤交叉编译的GCC,⽣成⽬标机可以运⾏的程序。
利⽤GCC/G++⽣成应⽤程序可以分为以下四步:
(1) 预处理:⽣成.i⽂件(预处理器cpp)
(2) 编译:将预处理后的⽂件转换为汇编语⾔,⽣成.s⽂件(编译器gcc)
(3) 汇编:由汇编代码⽣成⽬标代码,即机器代码,⽣成.o⽂件(汇编器as)
(4) 链接:由各个⽂件的⽬标代码,⽣成可执⾏程序(链接器ld)
这⾥涉及到另外⼀个知识点就是静态链接库和动态链接库的⽣成。
Make⼯程管理⼯具
Makefile是⼀个决定怎样编译⼯程的⽂本⽂件,有⼀定的书写规则。在⼯程更新的时候,使⽤GNU的make⼯具根据当前的Makefile对⼯程进⾏有选择的编译。
⾃动⽣成Makefile的⼯具有autoconf、automake。其他的类似⼯具⽐如cMake等。
GDB调试⼯具
在使⽤GDB之前,需要对源程序增加-g编译选项,此时编译出来的程序包含需要调试的信息,可以利⽤GDB进⾏调试。主要使⽤的命令是run(开始运⾏程序)、break(设置断点)、next(执⾏⼀⾏且不进⼊函数)、step(进⼊函数)、continue(继续程序运⾏)。
调试分为本地GDB调试和远程GDB调试,远程GDB更适合嵌⼊式系统的调试⼿段,使⽤个⽬标机端的GDB服务器和主机端的GDB调试器完成调试⼯作。
三、 基本学习函数
C语⾔标准库函数
(1) 标准输⼊/输出类函数 scanf printf putchar getchar putc getc puts ungetc等。
(2) 字符处理及转换函数
isdigit isalpha sprint strncat stncpy strlen strchr strstr strrev memset memmove memcpy memcpy等。
(3) 数学计算类函数 div acos/asin pow exp log ceil abs floor fmod等
(4) 数据结构和算法类函数 bsearch lfind lsearch qsort rand srand等
(5) ⽂件I/O操作类函数 fopen fclose fgetc fputs fseek fwrite ffush等
(6) 时间⽇期类函数 clock time gmttime mktime asctime 等
(7) 错误处理及⼯具函数 clearer feof perror errno assert setjmp longjmp等
Linux C中C语⾔的扩展库函数
(1) ⽂件I/O操作函数 open close read write lseek ioctl fcntl mmap dup create等
(2) ⽂件权限相关函数 access chown chmod utime umask link stat unlink等
(3) ⽤户操作函数 getgid/setgid getegid/setegid geteuid/seteuid 等
(4) 信号及进程类函数 kill raise alarm signal getpid fork sleep exec _exit等
四、 C语⾔⾼级编程
C语⾔运⾏过程中所使⽤的内存总体分为静态存储区和动态存储区两种。
静态存储区
C语⾔程序中静态数据存储区分为三类:只读存储器(RO)、已初始化读写数据区(RW Data)、未初始化读写存储器(BSS)。在程序运⾏初始化阶段开辟,在运⾏过程中不会变化(⼤⼩和位置固定),程序退出时被系统回收。
动态存储区
动态存储区分为堆和栈两类,在程序运⾏过程中动态分配(位置和⼤⼩动态变化),常见动态内存管理是栈内存从⾼地址向低地址分配,堆内存从低地址向⾼地址分配,⼀般来说堆使⽤链表实现,栈使⽤线性存储⽅式。
在C语⾔程序中,栈空间是由编译器管理的,在程序中可以体现栈空间使⽤的例⼦是参数的传递、返回值的使⽤以及⾃动变量空间。⼀般来说如果栈空间是从⾼地址向低地址增长的。
参数⼊栈的顺序是:后⾯的参数在⾼地址处、前⾯的参数在低地址处。
⾃动变量在栈空间,前⾯的变量放⼊栈的⾼地址,后⾯的⾃动变量放⼊栈的低地址。
在函数退出时函数栈上的内容将被释放。因此,⾃动变量的地址不可以作为函数返回值
在C语⾔中,堆内存区域的分配和释放是通过调⽤库函数完成的,malloc、calloc、realloc、free4个库函数实现堆内存的分配、释放和管理。分配内存后要记得⼿动释放,否则其资源是不会被系统回收的,会造成内存泄漏。同时指针被释放后,指针应该被设置为NULL,避免野指针。
总的来说,栈内存是由编译器分配和释放,堆内存是由程序分配和释放。
函数指针的使⽤
函数指针是⼀个指向函数的指针(本质上是⼀个代码区的地址),⽽函数本⾝代表了算法,此时C语⾔的算法就可以通过指针的形式,像普通变量⼀样被使⽤。函数指针可以作为⼀个结构体的成员,也可也作为⼀个参数传递给其他的函数,同样也可以作为函数的返回值。返回搜狐,查看更多
责任编辑:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论