【小技巧】Keil C51 报错“*** ERROR L107: ADDRESS SPACE OVERFLOW****

软件:Keil C51 C51V961版本
电脑:Win10

报错提示:

compiling System.c... linking... *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: DATA SEGMENT: ?DT?LCD LENGTH: 0034H Program Size: data=174.0 xdata=17 code=1205 Target not created. Build Time Elapsed: 00:00:03

在这里插入图片描述

解决办法:
将以下代码放在.c文件中。

xdata unsigned char  LCD_SEG[SEGSIZE] _at_ 0x500; // LCD显示地址 指定位置为0x500//时间/频率/电压显示				               // 0     1    2    3    4    5    6    7    8    9
static volatile unsigned char Disp_Code[]={0xf5,0x05,0xd3,0x97,0x27,0xb6,0xf6,0x15,0xf7,0xb7,// 不带小数点显示
0xfd,0x0d,0xdb,0x9f,0x2f,0xbe,0xfe,0x1d,0xff,0xbf // 带小数点显示
};//显示数字译码//功率显示                                     // 0    1    2    3    4    5    6    7    8    9
static volatile unsigned char DispPower_Code[]={0xfd,0x85,0xdb,0x9f,0xa7,0xbe,0xfe,0x95,0xff,0xbf};// 数字译码  "POWER" ":" "."这几个符号常亮

原因分析:报错之前是因为将此段代码放在.h文件中。

追问:为什么这段代码放在.C文件就不会报错,放在.H文件就会报错ERROR L107: ADDRESS SPACE OVERFLOW ???


问题分析

错误 L107: ADDRESS SPACE OVERFLOW 通常表明数据段 (DATA 空间) 溢出。当这段代码放在 .c 文件中时,编译器只会在该文件中分配内存空间。而当这段代码放在 .h 文件中,并在多个 .c 文件中包含时,会导致每个包含该头文件的 .c 文件都试图分配这些变量的内存,造成重复分配和内存溢出。

解决方法

要解决这个问题,需要确保这些变量只被定义一次,并且所有包含该头文件的 .c 文件都能访问它们。

1. 使用 extern 关键字

可以在头文件中声明这些变量,而在一个 .c 文件中定义它们。这会确保这些变量只在一个地方被定义,并且可以在多个文件中使用。

在头文件中声明:

// dispower.h
#ifndef DISPOWER_H
#define DISPOWER_Hextern xdata unsigned char LCD_SEG[SEGSIZE]; // LCD显示地址 指定位置为0x500
extern const unsigned char Disp_Code[]; // 显示数字译码
extern const unsigned char DispPower_Code[]; // 功率显示数字译码#endif // DISPOWER_H

在一个 .c 文件中定义:

// dispower.c
#include "dispower.h"xdata unsigned char LCD_SEG[SEGSIZE] _at_ 0x500; // LCD显示地址 指定位置为0x500const unsigned char Disp_Code[] = {0xf5, 0x05, 0xd3, 0x97, 0x27, 0xb6, 0xf6, 0x15, 0xf7, 0xb7, // 不带小数点显示0xfd, 0x0d, 0xdb, 0x9f, 0x2f, 0xbe, 0xfe, 0x1d, 0xff, 0xbf  // 带小数点显示
}; // 显示数字译码const unsigned char DispPower_Code[] = {0xfd, 0x85, 0xdb, 0x9f, 0xa7, 0xbe, 0xfe, 0x95, 0xff, 0xbf // 数字译码  "POWER" ":" "."这几个符号常亮
}; // 功率显示

为什么 const 关键字?

Disp_CodeDispPower_Code 声明为 const 可以将它们放入只读内存(通常是代码空间),这不仅节省了 DATAXDATA 空间,还避免了误修改。这也是一种优化策略。

通过这种方式,可以确保这些变量只被定义一次,并且可以在其他文件中访问,从而避免 ADDRESS SPACE OVERFLOW 错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/336534.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware安装Ubuntu系统(超详细)

一.Ubuntu官网下载镜像 Ubuntu官网:Enterprise Open Source and Linux | Ubuntu 二.安装Ubuntu系统 选择文件->创建虚拟机新建虚拟机(ControlN),这里直接选择典型即可 选择稍后安装系统 选择linux Ubuntu 64位 填写虚拟机名称…

【机器学习】支持向量机(SVM)

一、概述 支持向量机(Support Vector Machine,简称SVM)是一种对数据进行二分类的广义线性分类器,是一种监督学习算法,其决策边界是对学习样本求解的最大边距超平面。 SVM使用铰链损失函数计算经验风险并在求解系统中…

什么叫USDT(泰达币)的前世今生!

一、引言 在数字货币的世界里,USDT(Tether USDT)以其独特的稳定机制,成为了连接传统金融市场与加密货币市场的桥梁。本文将带您了解USDT的诞生背景、发展历程、技术特点以及未来展望。 二、USDT的诞生背景 USDT是Tether公司推出…

关于 Spring 是什么

Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽庞⼤的社区,这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的…

gitlab 创建 ssh 和 token

文章目录 一、创建ssh key二、将密钥内容复制到gitlab三、创建token 一、创建ssh key 打开控制台cmd,执行命令 ssh-keygen -t rsa -C xxxxx xxxxx是你自己的邮箱 C:\Users\xx\.ssh 目录下会创建一个名为id_rsa.pub的文件,用记事本打开,并…

Vue3解决“找不到模块“@/components/xxx.vue”或其相应的类型声明”

文章目录 前言背景问题描述解决方案总结 前言 在使用 Vue 3 开发项目时,遇到“找不到模块 ‘/components/xxx.vue’ 或其相应的类型声明”的错误是一个常见问题。这通常与 TypeScript 和模块解析相关的配置不当有关。本文将详细介绍如何解决此问题,确保…

XDebug配置极简教程,phpstorm实现http请求断点调试

写这篇的文章的初衷:网络上配置XDebug的文章有很多,XDebug也有官方的文档, PhpStorm也有官方的文档,为什么还要写那? 相信不少人,都有一种感觉,虽然教程很多,但是按教程走一遍,自己的确不能正常调试。 问题出在下面几个方面: 1. 对调试过程中,没有一定的认识,因此…

Pandas-中axis的用法

在Pandas中,min(axis)方法是计算DataFrame或Series中每行或每列的最小值的函数。该函数可以接受一个参数axis,用于指定计算最小值的方向。当axis0时,表示沿着行的方向计算最小值;当axis1时,表示沿着列的方向计算最小值…

【数据结构与算法 | 链表篇】力扣876

1. 力扣876 : 链表的中间节点 (1). 题 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表…

YOLOv10真正实时端到端目标检测(原理介绍+代码详见+结构框图)| YOLOv10如何训练自己的数据集(NEU-DET为案列)

💡💡💡本文主要内容:真正实时端到端目标检测(原理介绍代码详见结构框图)| YOLOv10如何训练自己的数据集(NEU-DET为案列) 博主简介 AI小怪兽,YOLO骨灰级玩家,1&#xff0…

QT截图程序,可多屏幕截图二,增加调整截图区域功能

上一篇QT截图程序,可多屏幕截图只是实现了最基本的截图功能,虽然能用但是缺点也有,没办法更改选中的区域,这在实际使用时不太方便。这篇增加了这个功能。先看看效果。 实现代码为: 头文件 #ifndef MASKWIDGET_H #de…

NTLite深度Windows系统镜像文件修改定制

计算机爱好者和技术宅的圈子里,NTLite是一个广受欢迎的名字,一款强大的Windows系统定制工具,允许用户对Windows安装镜像进行深度修改,从而打造出一个更加个性化、高效且精简的操作系统。无论是为了优化系统性能、移除不必要的组件,还是集成最新的更新和驱动,NTLite都能成…

2024 最新版 Navicat 17 下载与安装步骤及演示 (图文版)

Navicat 是一款专业的数据库管理工具,支持多种数据库类型,包括 MySQL、Oracle、SQL Server、PostgreSQL、MariaDB、Redis、MongoDB 和 SQLite。Navicat17包含的版本如下Navicat Premium 17, Navicat 17 for MySQL, Navicat 17 for Oracle, Navicat 17 fo…

React中 将UI 视为树

当 React 应用程序逐渐成形时,许多组件会出现嵌套。那么 React 是如何跟踪应用程序组件结构的? React 以及许多其他 UI 库,将 UI 建模为树。将应用程序视为树对于理解组件之间的关系以及调试性能和状态管理等未来将会遇到的一些概念非常有用。…

网络故障与排除(一)

一、Router-ID冲突导致OSPF路由环路 路由器收到相同Router-ID的两台设备发送的LSA,所以查看路由表看到的OSPF缺省路由信息就会不断变动。而当C1的缺省路由从C2中学到,C2的缺省路由又从C1中学到时,就形成了路由环路,因此出现路由不…

cocos creator 3.x 手搓背包拖拽装备

项目背景: 游戏背包 需要手动 拖拽游戏装备到 装备卡槽中,看了下网上资料很少。手搓了一个下午搞定,现在来记录下实现步骤; 功能拆分: 一个完整需求,我们一般会把它拆分成 几个小步骤分别造零件。等都造好了…

MGR集群模拟故障切换

说明: 1、MGR集群搭建起来,但不知道是否能进行启动切换,故要手动模拟故障并且验证 2、停止主库master服务,登录mysql查看MGR是否进行自动切换。 3、主库切换完成以后,手动将宕机的服务器添加到MGR集群中。 一、模拟故障…

【Unity AR开发插件】五、运行示例程序

专栏 本专栏将介绍如何使用这个支持热更的AR开发插件,快速地开发AR应用。 链接: Unity开发AR系列 热更数据制作:制作热更数据-AR图片识别场景 插件简介 通过热更技术实现动态地加载AR场景,简化了AR开发流程,让用户可…

Java整合ELK实现日志收集 之 Elasticsearch、Logstash、Kibana

简介 Logstash:用于收集并处理日志,将日志信息存储到Elasticsearch里面 Elasticsearch:用于存储收集到的日志信息 Kibana:通过Web端的可视化界面来查看日志(数据可视化) Logstash 是免费且开放的服务器端数…

视频智能分析平台LntonAIServer视频监控管理平台裸土检测算法的重要性与应用

随着科技的飞速发展,人工智能技术在各个领域的应用越来越广泛。其中,LntonAIServer裸土检测算法作为一种先进的技术手段,已经在农业、环境保护等领域取得了显著的成果。本文将探讨LntonAIServer裸土检测算法的重要性及其在实际应用中的优势。…