迪文 51单片机,全局变量、静态变量初始化失败,修正

1. 问题

  • 51单片机全局变量常量的初始化,static code const
  • 函数内部静态变量初始化也失败,例如
void fun()
{static int a = 5;printf("a %d\n", a); //输入的不一定是5,是之前这个地址的值(随机值)
}

2. 解决方案

替换STARTUP_MA.A51启动文件

3. 问题启动文件

$NOMOD51
;------------------------------------------------------------------------------
;  This file is part of the C51 Compiler package
;  Startup Code for the Capital Micro AS1E5 device
;  Copyright (c) 2001-2005 Keil Elektronik GmbH and Keil Software, Inc.
;  Version 1.00
;
;  *** <<< Use Configuration Wizard in Context Menu >>> ***
;------------------------------------------------------------------------------
;  STARTUP_AS1E5.A51:  This code is executed after processor reset.
;
;  To translate this file use A51 with the following invocation:
;
;     A51 STARTUP_CME3000.A51
;
;  To link the modified STARTUP_CME3000.OBJ file to your application use the following
;  Lx51 invocation:
;
;     Lx51 your object file list, STARTUP_CME3000.OBJ  controls
;
;------------------------------------------------------------------------------CSEG    AT  0F8HDB  0FFH,0FFHDB  'DWINT5'EXTRN CODE (?C_START)LJMP    ?C_STARTEND

4. 新的启动文件

$NOMOD51
;------------------------------------------------------------------------------
;  This file is part of the C51 Compiler package
;  Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
;  Version 8.01
;
;  *** <<< Use Configuration Wizard in Context Menu >>> ***
;------------------------------------------------------------------------------
;  STARTUP.A51:  This code is executed after processor reset.
;
;  To translate this file use A51 with the following invocation:
;
;     A51 STARTUP.A51
;
;  To link the modified STARTUP.OBJ file to your application use the following
;  Lx51 invocation:
;
;     Lx51 your object file list, STARTUP.OBJ  controls
;
;------------------------------------------------------------------------------
;
;  User-defined <h> Power-On Initialization of Memory
;
;  With the following EQU statements the initialization of memory
;  at processor reset can be defined:
;
; <o> IDATALEN: IDATA memory size <0x0-0x100>
;     <i> Note: The absolute start-address of IDATA memory is always 0
;     <i>       The IDATA space overlaps physically the DATA and BIT areas.
IDATALEN        EQU     80H
;
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> 
;     <i> The absolute start address of XDATA memory
XDATASTART      EQU     0     
;
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> 
;     <i> The length of XDATA memory in bytes.
XDATALEN        EQU     0      
;
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> 
;     <i> The absolute start address of PDATA memory
PDATASTART      EQU     0H
;
; <o> PDATALEN: PDATA memory size <0x0-0xFF> 
;     <i> The length of PDATA memory in bytes.
PDATALEN        EQU     0H
;
;</h>
;------------------------------------------------------------------------------
;
;<h> Reentrant Stack Initialization
;
;  The following EQU statements define the stack pointer for reentrant
;  functions and initialized it:
;
; <h> Stack Space for reentrant functions in the SMALL model.
;  <q> IBPSTACK: Enable SMALL model reentrant stack
;     <i> Stack space for reentrant functions in the SMALL model.
IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.
;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
;     <i> Set the top of the stack to the highest location.
IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
; </h>
;
; <h> Stack Space for reentrant functions in the LARGE model.      
;  <q> XBPSTACK: Enable LARGE model reentrant stack
;     <i> Stack space for reentrant functions in the LARGE model.
XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.
;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
;     <i> Set the top of the stack to the highest location.
XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 
; </h>
;
; <h> Stack Space for reentrant functions in the COMPACT model.    
;  <q> PBPSTACK: Enable COMPACT model reentrant stack
;     <i> Stack space for reentrant functions in the COMPACT model.
PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.
;
;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
;     <i> Set the top of the stack to the highest location.
PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
; </h>
;</h>
;------------------------------------------------------------------------------
;
;  Memory Page for Using the Compact Model with 64 KByte xdata RAM
;  <e>Compact Model Page Definition
;
;  <i>Define the XDATA page used for PDATA variables. 
;  <i>PPAGE must conform with the PPAGE set in the linker invocation.
;
; Enable pdata memory page initalization
PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.
;
; <o> PPAGE number <0x0-0xFF> 
; <i> uppermost 256-byte address of the page used for PDATA variables.
PPAGE           EQU     0
;
; <o> SFR address which supplies uppermost address byte <0x0-0xFF> 
; <i> most 8051 variants use P2 as uppermost address byte
PPAGE_SFR       DATA    0A0H
;
; </e>
;------------------------------------------------------------------------------; Standard SFR Symbols 
ACC     DATA    0E0H
B       DATA    0F0H
SP      DATA    81H
DPL     DATA    82H
DPH     DATA    83H
CKCON		DATA	8EH
DPC		DATA	93H
DAGESEL   	DATA  	94H	
D_PAGESEL  	DATA  	95H
T2CON		DATA	0C8H
MUX_SEL		DATA	0C9H
RAMMODE		DATA	0F8HNAME    ?C_STARTUP?C_C51STARTUP   SEGMENT   CODE
?STACK          SEGMENT   IDATARSEG    ?STACKDS      30EXTRN CODE (?C_START)PUBLIC  ?C_STARTUPCSEG    AT      0
?C_STARTUP:     LJMP    STARTUP1CSEG    AT  0F8HDB  0FFH,0FFH		;加密写 00H 00HDB  'DWINT5'RSEG    ?C_C51STARTUPSTARTUP1:	;T5L 初始化必须的代码;MOV  	DAGESEL,#01H   ;MOV  	D_PAGESEL,#02H	;MOV	CKCON,#00H;MOV	DPC,#00H;MOV	T2CON,#70H;MOV	MUX_SEL,#60H	;WDT OFF;MOV	RAMMODE,#00H	;释放APP RAM	;, 在 startup.a51中添加MOV   DAGESEL,  #01H                        ;64K代码空间 MOV   D_PAGESEL,#02H                     ;32K xdata 空间 0x8000 -0xffff MOV   CKCON,    #00H                     ;cpu运行在1T模式MOV	DPC,	  #00H                                 ;标准模式,需要指令操作xdata 的 dptr 的增减MOV 	T2CON,	  #70H                             ;T2 自动填装;MOV 	MUX_SEL,  #00H                         ;WDT OFF,MOV 	MUX_SEL,  #60H                         ;WDT OFF,Uart2引出P04,P05  Uart3引出P06,P07MOV 	RAMMODE,  #00H 
;必须在 startup.a51中第一条MOVX 指令之前的任意位置.IF IDATALEN <> 0		  MOV     R0,#IDATALEN - 1CLR     A
IDATALOOP:      MOV     @R0,ADJNZ    R0,IDATALOOP
ENDIFIF XDATALEN <> 0MOV     DPTR,#XDATASTARTMOV     R7,#LOW (XDATALEN)IF (LOW (XDATALEN)) <> 0MOV     R6,#(HIGH (XDATALEN)) +1ELSEMOV     R6,#HIGH (XDATALEN)ENDIFCLR     A
XDATALOOP:      MOVX    @DPTR,AINC     DPTRDJNZ    R7,XDATALOOPDJNZ    R6,XDATALOOP
ENDIFIF PPAGEENABLE <> 0MOV     PPAGE_SFR,#PPAGE
ENDIFIF PDATALEN <> 0MOV     R0,#LOW (PDATASTART)MOV     R7,#LOW (PDATALEN)CLR     A
PDATALOOP:      MOVX    @R0,AINC     R0DJNZ    R7,PDATALOOP
ENDIFIF IBPSTACK <> 0
EXTRN DATA (?C_IBP)MOV     ?C_IBP,#LOW IBPSTACKTOP
ENDIFIF XBPSTACK <> 0
EXTRN DATA (?C_XBP)MOV     ?C_XBP,#HIGH XBPSTACKTOPMOV     ?C_XBP+1,#LOW XBPSTACKTOP
ENDIFIF PBPSTACK <> 0
EXTRN DATA (?C_PBP)MOV     ?C_PBP,#LOW PBPSTACKTOP
ENDIFMOV     SP,#?STACK-1; This code is required if you use L51_BANK.A51 with Banking Mode 4
;<h> Code Banking
; <q> Select Bank 0 for L51_BANK.A51 Mode 4
#if 0   
;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
EXTRN CODE (?B_SWITCH0)CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0
#endif
;</h>LJMP    ?C_STARTEND

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

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

相关文章

Lua两个点号连接字符串

在Lua中&#xff0c;两个点号 .. 代表字符串连接操作符。当你想要将两个或多个字符串拼接在一起时&#xff0c;可以使用这个操作符。 以下是使用 .. 操作符的一些示例&#xff1a; local str1 "Hello, " local str2 "World!" local result str1 .. str2…

提示工程(Prompt Engineering)和代码生成

文心一言 提示工程&#xff08;Prompt Engineering&#xff09;和代码生成之间的关系主要体现在如何通过精心设计的提示来指导或优化代码生成的过程。以下是关于提示工程和代码生成的详细解释&#xff1a; 一、提示工程&#xff08;Prompt Engineering&#xff09; 提示工程…

路径操作函数

System.SysUtils.AnsiCompareFileName 根据当前语言环境比较文件名。 在 Windows 下不区分大小写&#xff0c;在 MAC OS 下区分大小写。 在不使用多字节字符集 (MBCS) 的 Windows 区域设置下&#xff0c;AnsiCompareFileName 与 AnsiCompareText 相同。在 MAC OS 和 Linux 下&…

KotlinConf 2024:深入了解Kotlin Multiplatform (KMP)

KotlinConf 2024&#xff1a;深入了解Kotlin Multiplatform (KMP) 在近期的Google I/O大会上&#xff0c;我们推荐了Kotlin Multiplatform (KMP)用于跨移动、网页、服务器和桌面平台共享业务逻辑&#xff0c;并在Google Workspace中采用了KMP。紧接着&#xff0c;KotlinConf 2…

【设计模式深度剖析】【7】【结构型】【享元模式】| 以高脚杯重复使用、GUI中的按钮为例说明,并对比Java类库设计加深理解

&#x1f448;️上一篇:外观模式 | 下一篇:结构型设计模式对比&#x1f449;️ 设计模式-专栏&#x1f448;️ 目录 享元模式定义英文原话直译如何理解&#xff1f;字面理解例子&#xff1a;高脚杯的重复使用例子&#xff1a;GUI中的按钮传统方式使用享元模式 4个角色1. …

锻压设备智能制造工厂物联数字孪生平台,推进制造业数字化转型

锻压设备智能制造工厂物联数字孪生平台&#xff0c;推进制造业数字化转型。随着全球制造业的飞速发展&#xff0c;数字化转型已经成为企业提升竞争力、实现可持续发展的关键。在锻压设备智能制造领域&#xff0c;工业物联数字孪生平台以其强大的数据集成、分析和管理能力&#…

国际物流管理系统的选择:花钱不怕,就怕花冤枉钱

现在市场上的国际物流管理系统还是非常多的&#xff0c;想在这么多类型的系统中选择一套适合自己的系统确实不是个简单的事情。 尤其是现在很多物流商其实都是比较小的国际物流商&#xff0c;很多大型的&#xff0c;过于复杂的系统并不适合这个群体。那这个群体应该怎么选择国…

什么是Java序列化?它有什么用途?

Java序列化&#xff08;Serialization&#xff09;是将Java对象转换为字节流的过程&#xff0c;反序列化&#xff08;Deserialization&#xff09;则是将字节流恢复为Java对象的过程。Java的序列化机制使得对象的持久化和跨网络传输成为可能。 Java序列化的用途 持久化存储&am…

mfc140u.dll丢失的解决方法有哪些?怎么全面修复mfc140u.dll文件

mfc140u.dll丢失其实相对来说不太常见到&#xff0c;因为这个文件一般是不丢失的&#xff0c;不过既然有人遇到这种问题&#xff0c;那么小编一定满足各位&#xff0c;给大家详细的唠叨一下mfc140u.dll丢失的各种解决方法&#xff0c;教大家以最快最有效率的方法去解决mfc140u.…

【Redis】Redis分片集群中数据的存储和读取

Redis 分片集群&#xff08;Sharded Cluster&#xff09;通过将数据分散到多个节点上来实现高可用性和可扩展性。它采用一致性哈希&#xff08;Consistent Hashing&#xff09;或其他哈希算法来将键分配到不同的分片中。每个分片由一个或多个 Redis 实例组成&#xff0c;这些实…

Spring MVC 源码分析之 DispatcherServlet#getHandlerAdapter 方法

前言&#xff1a; 前面我们分析了 Spring MVC 的工作流程源码&#xff0c;其核心是 DispatcherServlet#doDispatch 方法&#xff0c;我们前面分析了获取 Handler 的方法 DispatcherServlet#getHandler 方法&#xff0c;本篇我们重点分析一下获取当前请求的适配器 HandlerAdapt…

C语言练习题之——从简单到烧脑(13)(每日两道)

打印爱心 1.1:普通输出爱心 #include<stdio.h> int main() {printf(" ********* *********\n"); //7&#xff08;代表边上的空格&#xff09;printf(" *************** ***************\n"); //4printf(" ************…

AI播客下载:a16z (主题为AI、web3、生物技术等风险投资)

a16z播客是一个综合性的科技和创新领域的媒体平台&#xff0c;通过多种节目形式和丰富的内容&#xff0c;为广大听众提供了一个了解最新科技趋势和创新思维的窗口。a16z播客是由安德里森霍罗威茨&#xff08;Andreessen Horowitz&#xff0c;简称a16z&#xff09;推出的一个科技…

汽车MCU虚拟化--对中断虚拟化的思考(1)

目录 1.中断虚拟化的困惑 2.从R52入手 3.小结 1.中断虚拟化的困惑 在车控类控制器里&#xff0c;中断对于我们来说是非常宝贵的资源&#xff0c;可大幅提高系统实时性。 这些中断基本都属于实际物理硬中断(软中断另说)&#xff0c;例如对一个按键按下的中断响应&#xff0…

ClickHouse知识点

Clickhouse clickhouse是一款列式存储数据库。 主要应用于OLAP领域。 OLAP&#xff1a;联机分析处理&#xff0c;主要做数据分析。 OLTP&#xff1a;联机事务处理&#xff0c;主要处理事务。 clickhouse索引和分区&#xff1a; clickhouse可以进行分区操作&#xff0c;对…

上海公司吊销不管了会有影响吗?

上海公司吊销不管了会有影响吗&#xff1f; 上海公司&#xff0c;工商显示吊销状态&#xff0c;不管了有影响吗&#xff1f; 我的回答是有影响的。 公司吊销之后&#xff0c;公司股东、高管人员会进入工商三年黑名单。三年之后&#xff0c;不得担任其他公司高管&#xff0c;当…

基于单片机的恒流开关电源 BUCK电路设计

1 前言 1.1课题研究意义 开关电源顾名思义&#xff0c;开关电源便是使用半导体开关器件&#xff08;如晶体管、场效应管、可控硅闸流管等&#xff09;&#xff0c;经过控制电路&#xff0c;使半导体开关器件不停地“导通”和“关闭”&#xff0c;让半导体开关器件对输入的电压…

python 卡尔曼滤波算法

卡尔曼滤波&#xff08;Kalman Filter&#xff09;是一种有效的递归滤波器&#xff0c;用于线性动态系统的状态估计。它通过考虑先前的估计和当前的观测来提供下一个状态的最佳估计。卡尔曼滤波器广泛应用于导航系统、机器人定位、信号处理等领域。 下面是一个简单的Python实现…

AI炒股-批量爬取网易财经的要闻板块

工作任务和目标&#xff1a;批量爬取网易财经的要闻板块 在class"tab_body current"的div标签中&#xff1b; 标题和链接在&#xff1a;<a href"https://www.163.com/dy/article/J2UIO5DD051188EA.html">华为急需找到“松弛感”</a> 第一步&…

AR编程入门:解锁虚拟与现实交融的新世界

AR编程入门&#xff1a;解锁虚拟与现实交融的新世界 在数字化浪潮的推动下&#xff0c;增强现实&#xff08;AR&#xff09;技术正逐渐走进我们的日常生活&#xff0c;为我们带来前所未有的体验。对于初学者而言&#xff0c;AR编程可能显得既神秘又充满挑战。本文将从四个方面…