【STM32】Keil MDK 中的 Code、RO-data、RW-dat、ZI-data 是什么?分别放在哪里?

          C语言中有栈、堆、bss、data、code段。具体每个段具体是存储什么数据的,直接百度吧。重点分析一下STM32以及在MDK里面段的划分。

  • Code存放在ROM
  • RO-data存放在ROM
  • RW-dat存放在RAM
  • ZI-data存放在RAM

单片机初始化时RW-data从flash拷贝到RAM

生成的map文件位于list文件夹下 (KEIL)

  • Total RO  Size (Code + RO Data)            
  • Total RW  Size (RW Data + ZI Data)             
  • Total ROM Size (Code + RO Data + RW Data)  

Code:通常是指编译器生成的机器指令,也就是程序的执行代码,这些内容会被存储到ROM区

RO-data:它指程序中用到的只读数据,因而程序不能被修改的内容,这些数据被存储在ROM区。 RO-data区典型:
例1、C语言中const关键字定义的变量。
例2、C语言中定义的全局常量。
例3、C语言中定义的字符串。

RW-data:即可读写数据区域,一定是初始化为“非0值”的可读写数据,而且应用程序可以修改其内容,这些数据被存储在RAM区
RW-data区典型:
例1、C语言中定义的全局变量,且初始化为“非0值”。
例2、C语言中定义的静态变量。且初始化为“非0值”。

ZI-data的栈空间 (Stack) 及堆空间 (Heap):编译器给出的 ZI-data 占用的空间值中包含了堆栈的大小 (经实际测试,若程序中完全没有使用 malloc 动态申请堆空间,编译器会优化,不把堆空间计算在内)。 可读写数据区域,一定是未初始化或初始化为“0值”的可读写数据,应用程序同样可以修改其内容,这些数据被存储在RAM区
ZI-data区典型:
例1、C语言中定义的数组,只定义了数组的大小,并没有给每个成员赋非0值。

以下数据节选于程序的.map文件结尾。

      Code (inc. data)      RO Data    RW Data    ZI Data      Debug   

     26260       1882        312           236             36628        656971   Grand Totals
     26260       1882        312           236             36628        656971   ELF Image Totals
     26260       1882        312           236             0                0             ROM Totals

=========================================================================

    Total RO  Size (Code + RO Data)                          26572 (  25.95kB)
    Total RW  Size (RW Data + ZI Data)                      36864 (  36.00kB)
    Total ROM Size (Code + RO Data + RW Data)      26808 (  26.18kB)

=========================================================================

总结: 在拿到一款单片机的时候,一定要明确单片机的ROM大小和RAM大小。
ROM的最小空间一定要大于: Code + RO Data + RW Data的总和;
RAM的最小空间一定要大于: RW Data + ZI Data之和

注意:
ROM就是单片机的FLASH大小
RAM就是单片机的运行内存大小
以STM32G070为例,ROM = 128kB;RAM = 36kB

————————————————
参考链接:https://blog.csdn.net/zhai17863966493/article/details/125311733

Keil 中的Code, RO-data , RW-data, ZI-data - 扁桃体也发言 - 博客园

这篇文章也不错,可以看看

http://t.csdn.cn/IdQ7Vicon-default.png?t=N176http://t.csdn.cn/IdQ7V

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 温湿度传感器是一种用于测量环境温度和湿度的设备,用于监控和控制室内环境的条件。下面是一个使用Keil5进行编程的温湿度传感器代码示例: 首先,我们需要定义一些常量和变量来存储传感器返回的温湿度数值: ```c #include <reg52.h> sbit DHT11_PIN = P1^0; unsigned char humidity; unsigned char temperature; unsigned char checksum; ``` 然后,我们需要编写一些函数来与传感器进行通信,并读取温湿度数据: ```c void dht11_start() { DHT11_PIN = 0; delay(18); DHT11_PIN = 1; delay(20); } bit dht11_response() { while(DHT11_PIN); while(!DHT11_PIN); while(DHT11_PIN); return 1; } unsigned char dht11_receive() { unsigned char i, dat=0; for(i=0; i<8; i++) { while(!DHT11_PIN); delay(20); if(DHT11_PIN == 0) dat <<= 1; else { dat <<= 1; dat |= 1; } while(DHT11_PIN); } return dat; } ``` 接下来,我们需要编写主函数来初始化传感器并读取温湿度数据: ```c void main() { dht11_start(); if(dht11_response()) { humidity = dht11_receive(); temperature = dht11_receive(); checksum = dht11_receive(); // 可以在这里对温湿度数据进行处理 } else { // 传感器无响应,进行错误处理 } } ``` 以上是一个简单的温湿度传感器的Keil5代码示例。在实际应用,可能需要根据具体的传感器型号和接口方式进行相应的修改和调试。 ### 回答2: 温湿度传感器常用的是DHT11或DHT22型,下面是一个基于Keil 5开发环境的温湿度传感器代码示例: ```c #include <stdio.h> #include <stdint.h> #include "DHT.h" #define DHT11_PIN P1.2 int main(void) { DHT11_Init(); while (1) { uint8_t check = DHT11_Read(); if (check) { printf("温度: %d℃ 湿度: %d%%\n", DHT11_Data[2], DHT11_Data[0]); } else { printf("数据获取失败\n"); } DelayMs(2000); } } ``` 上述代码,首先通过`DHT.h`库文件进行初始化,定义了DHT11数据引脚为`P1.2`。在主函数`main`,通过`DHT11_Init`函数初始化温湿度传感器。然后进入一个无限循环,通过调用`DHT11_Read`函数读取温湿度数据,并根据返回值进行判断,若数据读取成功,则通过`printf`函数打印温度和湿度值;若读取失败,则打印错误信息。最后,调用`DelayMs`函数进行延时约2秒,以保证温湿度数据的稳定读取。 需要注意的是,该示例代码的`DHT11_Init`、`DHT11_Read`等函数的具体实现需要根据具体的温湿度传感器型号进行相应的修改。此外,还需要根据具体的硬件平台配置引脚和延时函数。 ### 回答3: 温湿度传感器的Keil5代码主要是通过使用适合的传感器库函数来实现温湿度传感器的读取和处理。以下是一个基本的温湿度传感器的Keil5代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include "dht11.h" // 引入温湿度传感器相关的库 int main(void) { DHT11_Data_TypeDef DHT11_Data; // 定义温湿度传感器的数据类型 while (1) { if (DHT11_ReadData(&DHT11_Data) == SUCCESS) { // 读取温湿度传感器数据 printf("温度: %d°C\n湿度: %d%%RH\n", DHT11_Data.Temperature, DHT11_Data.Humidity); // 输出温湿度值 } else { printf("读取数据失败!\n"); // 读取传感器数据失败时的处理 } Delay_ms(2000); // 延迟2秒后进行下一次读取 } return 0; } ``` 上述代码调用了dht11.h库的函数来读取温湿度传感器的数据,DHT11_Data包含了温度和湿度的值。通过printf语句将温度和湿度值输出到串口。 需要注意的是,这只是一个基本的示例代码。具体的代码实现可能会根据具体的温湿度传感器型号和接口协议有所不同。因此,在写温湿度传感器的Keil5代码时,需要根据具体的传感器规格和习惯来选择适当的库和函数,并根据开发板的接口配置进行相应的配置和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值