c语言data
㈠ c语言中,关键字data是什么意思
这是单片机C语言中特有的关键字,表示数据存储区,标准C语言中是没有的,如
int data x ;
表示将 x 定义在数据存储区。
单片机的C语言采用C51编译器。由C51产生的目标代码短,运行速度高,存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言PL/M51语言目标代码混合使用。
(1)c语言data扩展阅读:
单片机的C语言:
单片机软件设计使用C语言作为编程开发软件,采用模块化的程序结构,设计了按键模块程序、RFID模块程序、日历时钟模块程序、GPRS模块程序、显示存储模块程序等,并编写系统主程序,将五个程序模块组合在一起,实现单片机控制系统的整体功能。
51单片机支持三种高级语言,即PL/M,C和BASIC。C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,是使用较广的单片机编程语言。
单片机的C语言采用C51编译器(简称C51)。有C51产生的目标代码短,运行速度高,所需存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言或PL/M51语言目标代码混合使用。
㈡ C语言代码组成 - BSS、Data、Stack、Heap、Code、Const
一段C语言经过编译连接后,成为一段可以运行的代码,可运行的代码可以分为以下四个部分组成:全局变量/静态变量区、堆、栈、代码区。其中全局变量/静态变量区又分为未初始化变量区和初始化变量区,代码区又分为代码和常量区。即汇总下来,代码可以分为6部分组成,包括:BSS区(未初始化的全局变量/静态变量区)、Data区(实始化的全局变量区)、Stack区(栈区)、heap区(堆区)、Code区(代码区)、const区(常量区)。
一、BSS区和Data区
C语言编程中定义的全局变量、静态局部变量,就是分配在全局变量/静态变量区域,但是为什么又要分为BSS区域和Data区域呢?其实我们在定义全局或者静态变量区,有时我会对它赋初始值,有的又不会赋初始化,比如我们定义的全局变量,初始化的赋值,是怎么样写到变量区域中的,我们定义的静态局部变量,在定义时初始化后,为什么后面函数被调用,又不会再初始化呢?这个局部静态变量是怎么样实始化的,什么时候初始化的?
如果分析编译后的汇编代码,就会发现在代码运行起来后,会有一段给变量赋值的指令,这一段代码,不是我们C代码对应的汇编,而是C编译器生成的汇编译代码,这段代码的作用就是给初始化了的静态变量和全局变量进行初始化。这也是为什么全局/静态变量区域,要分BSS和Data的原因。
二、Stack区
栈是一种先进后出的数据结构,这种数据结构正好完美的匹配函数调用时的模型过程,比如函数f(a)在运行过程中调用函数f(b),f(a)在运行过程中的变量就是分配在栈中,通过在调用f(b)前,会将代码中用到的R0~Rn寄存器的值保存到栈中,同时将函数的传入参数写入到栈中,然后进入f(b)函数,函数f(b)的变量b分配在栈中,当函数运行完毕后,释放变量b,将栈中存放的f(a)函数的运行的R0~Rn寄存器值恢复到寄存器中,同时f(b)的返回结果存入到栈中,这样f(a)继续运行。当一个函数运行完毕后,它在栈中分配的临时变量会全部释放。
对于中断也是一样的,中断发生时,也是一个函数打断了另一个函数的运行,这种现场的保存(即寄存器的值),都是通过栈来完成的。所以栈的作用有:
三、Heap区
全局变量分配的内存在代码整个运行周期内都是有效的,而在栈区分配的内存在函数调用完成后,就会释放。这两种内存模型都是由编译器决定它的使用,代码是无法控制的。那有没有内存是由用户控制的,要用时,就自由分配,不用时,就自行释放?答案是肯定的,这部分内存就是堆。
用户需要使用的动态内存,就是通过malloc函数,调用分配的,在没有释放前,可一直由代码使用。当这部分内存不再需要使用时,可以通过free函数进行释放,将它归还到堆中。从这中可以看出,堆的内存,是按需分配的。这就是赋予了代码很大的自由度,但这也是会带来负作用的,比如:内存碎片化导致的malloc失败;忘记释放内存导致的内存泄露,而这些往往是致命的失误。
四、Code区
代码区就是编译后机器指令,这些指令决定了功能的执行。我们编译的代码一般是下载进flash中,但是运行,却有两种方式:在RAM中运行和在ROM中运行。 在RAM中运行,即是boot启动后,将flash中的代码复制到RAM中,然后PC指针在指到RAM中的代码中开始运行。 有时在调试时,我们可以直接将代码下载进RAM中运行进行调试,这样加快调试速度。便是大部分的情况我们的代码是从flash中开始运行的。
五、常量区
代码中的常量,一部分是作为立即数,在代码区中,但是像定义的字符串、给某数组赋值的一串数值,这些常量,就存在常量区,我们常用const来定义一个常量,即该变量不能再必变。这部分的变量,编译器一般将它定义的flash中。
六、各个区域大小的是如何决定的:
code区和const区:是由代码的大小和代码中常量的多少来决定的。
bss区和data区:这是由代码中定义的全局变量和局部变量的多少来决定的。
stack区:这个可以由使用都自行定义大小,但使用都要根据自已代码的情况,评估出一个合理的值,再定义其大小,如果定义的太小,很容易爆栈,导至代码异常,但是如果定义的太大,就容易浪费内存。
heap区:RAM剩下的部分,编译器就会作为堆区使用。
七、嵌入式代码一般启动过程
以STM32为例,通过分析其汇编启支代码,大致可以分为以下几个步骤:
如果大家想看编译扣,代码文件的组成,可以查看统后生的map文件,里面有详细的数据,包括各个函数的分配内存,BSS,Data,Stack,Heap,Text的分配情况。
如果相要了解详细的代码启动过程,可看它的启动汇编文件。
㈢ 详细讲解C语言五大内存分区与可执行程序的三段(Text段、Date段、Bss段)【建议收藏】
本文详细讲解C语言五大内存分区与可执行程序的三段(Text段、Data段、Bss段)。
首先,C语言五大内存分区包括:静态内存、动态内存、栈内存、堆内存和文件I/O内存。静态内存用于存储全局变量和静态变量,动态内存由new和malloc函数分配,栈内存用于函数调用时的局部变量和函数参数,堆内存用于动态分配和管理,文件I/O内存用于文件读写操作。
其次,可执行程序的三段分别为:Text段、Data段、Bss段。Text段存储了程序的机器代码,Data段存储了程序的全局变量和静态变量的初始值,Bss段用于存放未初始化的全局变量和静态变量。Text段和Data段是只读的,而Bss段是可读可写的。
在可执行程序内存空间与逻辑地址空间的映射与划分上,执行文件通常被映射到进程的逻辑地址空间中。执行文件的文本、数据和Bss段分别映射到进程的文本、数据和Bss段。
接着,存储类型关键字定义了变量的存储类型,如static、extern、auto和register。这影响了变量的作用域和生命周期。静态变量在全局或文件级作用域中,其生命周期在程序运行期间一直存在;外部变量在文件级作用域中,其值在程序运行期间始终存在;自动变量在函数作用域中,其值在函数调用结束后释放;寄存器变量在函数调用期间使用,以提高执行效率。
在堆与栈的区别上,堆和栈在申请方式、申请后的系统响应、申请大小限制、申请效率、存储内容以及存取效率上有所不同。在运行时刻赋值的变量通常在堆中分配,而编译时已经确定的变量通常在栈中分配。在存取效率上,栈上的数组比指针指向的字符串更快。