This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EK-TM4C123GXL:我的变量未在 RAM 中初始化?

Guru**** 2455360 points
Other Parts Discussed in Thread: SW-TM4C, EK-TM4C123GXL

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/635664/ek-tm4c123gxl-my-variables-are-not-initialized-in-ram

器件型号:EK-TM4C123GXL
主题中讨论的其他器件:SW-TM4C

大家好、我在编写 TM4C123GX Launch Pad 中的内容时遇到问题。 我对微控制器没有经验、因此我使用汇编语言来处理它。 我的问题是、我尝试使用其中一个 TivaWare 示例(startup_rvmdk.S)中提供的启动文件编写程序、它运行正常、但变量 I initialized (PM5_mask)为空。 我尝试在其他地方询问此问题、并被告知是引导加载程序。 我对微控制器的经验不多、因此我非常迷失在开始弄清为什么我的变量在 RAM 中为0、更不用说了解如何使用引导加载程序了。 当我使用仿真器进行调试并查看应该包含变量值的值时、除非我自己设置、否则它始终为0。 此问题的原因是什么?如何解决? 下面是我的代码。 我正在使用 Keil uVision。 提前感谢您!

主程序

;include 常量我定义到 main
include my_Constants.s
;include 变量我定义到 main
导入 PB5_mask

area |.text|,代码,只读
thumb
导出__main
项

;此子例程初始化 GPIO_Init
PROC...

;将端口 F 引脚1的"高电平"写入数据寄存器以打开红色 LED。 GPIODATA
LDR r0、=AHB_PORTB
LDR R1、[r0、#GPIODATAPB5]
LDR R2、=PB5_MASK;获取 PB5掩码(指针) LDR
R3、[R2]的 RAM 地址;获取 PB5掩码
ORR R3、R3、#0xF0
DATSTR、[R2]

ORR R1、GPIOR1[r5]r0、GPIOMR1[r5]r15………设置为高电平




BX LR

ENDP


;此子例程初始化 SysTick
SysTK_InitPROC...

ENDP



__MAIN

;调用 GPIO_Init 子例程并返回
BL GPIO_Init

;调用 SysTick _Init 子例程并返回
BL SysTick _Init

停止
B;while (1)

结束 

my_Constants.s

Area My_Constants,代码,readonly
thumb

;在此处为练习定义地址

;常规基址
SYS_CONTROLEQU 0x400FE000...


;偏移
GPIOHBCTLEQU 0x06C...


结束 

startup_rvmdk.s


;包括我定义到启动文件
的常量包括 my_Constants.s
包括我定义到启动文件
导入 PB5_mask 的变量

区域堆栈、NOINIT、READWRITE、ALIGN=3
StackMem
太空堆栈
__initial;

*********
;
;为堆分配空间。
;

区域堆、NOINIT、READWRITE、align=3
_heap_base
HeapMem
空间堆
_heap_limit

;*********
;
指示此文件中的代码保留堆栈的8字节对齐。
;

PRESERVE8


;
;将代码放入复位代码部分。
;

区域复位、代码、只读
拇指


;
;向量表。
;

导出__Vectors
__Vectors
DCD StackMem +堆栈 ;栈顶
DCD RESET_Handler ;重置处理程序
DCD NmiSR ; NMI 处理程序
DCD FaultISR ;硬故障处理程序
(笑声) ;保留
DCD IntDefaultHandler ; PendSV 处理程序
DCD SysTick 处理程序; SysTick 处理程序
(笑声)
;********
;
;这是处理器首次开始执行
时调用的代码;在复位事件之后。
;

导出 Reset_Handler
Reset_Handler
;
;启用浮点单元。 必须在此处执行此操作才能处理
; main()使用浮点且函数 prologueue 保存的情况
;浮点寄存器(如果浮点不是浮点则会出现故障)
;已启用)。 使用的浮点单元的任何配置
; DriverLib API 必须在浮点单元之前在此处完成
;正在启用。
;
;请注意,这不使用 DriverLib,因为它可能不包含在内
;在该项目中。
;
MOVW R0、#0xED88
MOVT R0、#0xE000
LDR R1、[R0]
OR R1、#0x00F00000
结构 R1、[R0]

;
;调用 C 库处理启动的足够点。 这将复制
;.data 段初始化闪存至 SRAM,并填充零
;.bss 段。
;
导入_main
B __主...


;我在这里添加了 SysTick 处理程序。 这会切换 GPIODATA、使 LED 闪烁
SysTick 处理程序PROC

导出 SysTick 处理程序

;将"high"写入数据寄存器、使端口 F 引脚1打开红色 LED。 GPIODATA
LDR r0、=AHB_PORTB
LDR R1、=PB5_MASK;获取 PB5掩码值
LDR R2、[R1]的 RAM 地址;PB5掩码
EOR R2、R2的抓取值 #0xF0;切换 mas 以切换 PB5
STR R2、[R1]



;存储切换的掩码以正确切换下一次 STR R2、[r0、#GPIODATAPB5] LDR R2、[r0、#GPIODATAPB5]
BX 返回至__main;LR

ENDP

...
结束 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Fuahua、

    我不清楚您尝试对应用程序执行什么操作、但在任何情况下、您都应该使用我们的 TivaWare 软件包中提供的软件。

    TivaWare 的编写旨在提供大量 API、使您能够设置 TM4C 器件并启用应用、而无需担心如何初始化/配置外设的所有微小细节。 由于我们投入了大量时间来使 TivaWare 可用于客户面临的所有应用、因此我们不支持汇编级代码。 因此、为了获得 TM4C 器件的支持、我们要求您使用 TivaWare 作为起点。 如果您在这方面遇到挑战、我们很乐意为您提供帮助。 此外、TivaWare 还提供了许多预制示例、可帮助您快速上手、这可能也很有用。

    您可以从 www.ti.com/tool/SW-TM4C 下载最新的 TivaWare 版本
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复! 我知道有可用的 API、但我想了解硬件和练习汇编。 我用汇编语言编写了程序、它工作正常; 它使用 SysTick 切换外部 LED。 我不明白为什么应该启动的变量在 RAM 中为空。 有人告诉我、这是因为我没有引导加载程序、而且我不了解引导加载程序、因此我很迷路了。 抱歉、我忘记在前面的帖子中添加变量 PB5_MASK 的代码。

    my_Variable.S:

    Area My_Variables、data、READWRITE
    Thumb
    
    导出 PB5_MASK
    PB5_MASK DCD 240;0x000000F0
    
    结束 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Fuahua"]当我使用仿真器进行调试并查看值时

    正如您"拥有"实际硬件(EK-TM4C123GXL)一样、很难证明您使用(任何)仿真器是合理的。   根据过去的经验-仿真可能不会证明是您使用和监控"真正的 MCU 硬件!"的"令人信服"   (再次说明-您有的!)   您对 Keil 站点的扫描/搜索应显示(多个、相似)"仿真产生的问题"。

    现在、此类供应商代理已经"痛苦"地描述了其公司对(许多)因使用"经过试用、测试/验证和广泛的 API "而带来的优势的承诺和理由。   然后(显示)取消该设置-并按 w/asm。

    我们是否可以要求您考虑"论坛的需求"、而不是(仅)您自己的需求?   如果此处的"多/多"(类似)要求进行"仅 ASM "分析和响应、会发生什么情况?   是否不清楚论坛响应时间会大幅延长-而且所提供的海报要少得多?   这不可能是好的-可以吗?

    您当然可以"免费"使用 ASM -在您认为合适的时间/地点/地点。   但这种专注和少数群体使用的支持-当一个极好的"替代"就在"准备就绪"时-与"不合理"相边界。

    没有任何东西会阻止您通过使用"有效的 API"深入到 MCU 寄存器和存储器内容中。   请注意、您 "想学习硬件"-但您的"ASM 专有方法"尚未证明自己"学习有效"-是否有?    相比之下、使用 API (经过测试/验证和扩展)和现成的示例(不带 ASM)提供了一 种可靠(和长期)且经过验证的方法真正"学习硬件!"    (和-何时和/或如果需要-获得快速/有效/详细的支持!)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Fuahua"]我不明白为什么应该启动的变量在 RAM 中为空。当从基于闪存的微控制器启动代码启动程序时,需要从闪存运行的启动代码来初始化 RAM 中的变量。 对于用 C 语言编写的程序、运行时库启动代码会根据作为  startup_rvmdk.s 文件一部分的 Reset_Handler 函数中的以下注释执行此初始化:

    ;
    ;调用 C 库处理启动的足够点。 这将复制
    ;.data 段初始化闪存至 SRAM,并填充零
    ;.bss 段。
    ;
    导入_main
    B _main 

    对于汇编器中编写的程序、RAM 中变量的初始化需要由程序明确处理。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你的答复。 我对 MCU 非常陌生。 我参加了一个课程、但我们使用仿真器进行了调试、因此我不会使用实际的硬件。 我将来会这样做。

    我没有解雇代理。 我感谢他的答复,但我想在大会中实践。 这并不意味着我不会使用 API。 我不明白你所说的"论坛需要"是什么意思。 我认为海报会为自己而不是其他人提出问题。 我刚才也这样做了。 我会记住、如果我在汇编语言中进行编程、我是我自己的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复! 我看到、说实话、我对这部分的理解不是很清楚。 因此、我必须自己进行初始化。 再次感谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Fuahua"]不理解"论坛需要"多个"的含义

    远端-"C"证明是海报所用的最大资源。   ASM 和 DRM "在噪音中降低了"、因此这种"严格限制的发布"的"大量吸引力"大大降低。   注意-供应商代理或我们的外部人员需要花费更多的精力和时间来费力地检查每行海报的 ASM/ME DRM 代码。   从不容易,从不快,从不有趣!

    现在、当海报采用"正常/流行的"C"语言"时、许多人会受益、"问题的解决速度(通常)要快得多、并且大大简化了!   结果是,"正在协助更多的海报----满足论坛"许多!"的需要。

    至于您已验证的帖子-请谨慎操作-如果您继续使用"仅模拟器"、则问题可能仍然存在。   同样、当您"拥有硬件"时、最好进行练习...

    另请注意、您对 API 的审查将提供对 MCU 寄存器和控制位的深入了解-您的学习可能会尽可能深入- ASM 证明、"不是深入了解的唯一途径..."