硬汉嵌入式论坛

 找回密码
 立即注册
查看: 299|回复: 2
收起左侧

[MDK] MDK里面C文件调用汇编文件定义变量的方法

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 2025-10-10 15:51:35 | 显示全部楼层 |阅读模式
在汇编里面做个EXPORT即可,比如startup_stm32h743xx.s汇编文件里,比如我这里使用了C微库,我这里放在if里面即可

[C] 纯文本查看 复制代码
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      :DEF:__MICROLIB
                
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
                                 EXPORT  Stack_Size
                                 EXPORT  Heap_Size
                
                 ELSE
                
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

                 END


然后C文件里面就可以调用了

[C] 纯文本查看 复制代码
#include <stdio.h>

// 使用 extern 声明栈和堆相关的符号(这些符号在启动文件中定义)
extern unsigned int Stack_Size;    // 栈大小
extern unsigned int __initial_sp;  // 栈顶地址 (对于Cortex-M,栈通常是向下生长的满栈)

extern unsigned int Heap_Size;     // 堆大小
extern unsigned int __heap_base;   // 堆起始地址
extern unsigned int __heap_limit;  // 堆结束地址

void print_memory_info(void) {
    // 计算栈的起始地址(栈底):栈顶地址 - 栈大小 + 1
    // 注意:Cortex-M内核栈空间通常是向下生长的满栈:cite[1]
    void* stack_base = (void*)((char*)(&__initial_sp) - Stack_Size + 1); 
    
    printf("Stack Info:\n");
    printf("  Top (Initial SP): 0x%p\n", &__initial_sp);
    printf("  Size:              0x%X bytes\n", Stack_Size);
    printf("  Base (calculated): 0x%p\n", stack_base);

    printf("Heap Info:\n");
    printf("  Start (__heap_base):  0x%p\n", &__heap_base);
    printf("  End (__heap_limit):   0x%p\n", &__heap_limit);
    printf("  Size:                  0x%X bytes\n", (char*)(&__heap_limit) - (char*)(&__heap_base));
}





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
 楼主| 发表于 2025-10-10 16:14:50 | 显示全部楼层
使用下面方法也可以,但是链接器生成的符号要有这个STACK才可以

extern uint32_t Image$$STACK$$ZI$$Base;    // 栈起始地址
extern uint32_t Image$$STACK$$ZI$$Limit;   // 栈结束地址
extern uint32_t Image$$STACK$$ZI$$Length;  // 栈大小

[C] 纯文本查看 复制代码
#include <stdint.h>

// 方法1:声明为外部变量
extern uint32_t Stack_Size;
extern uint32_t Image$$STACK$$ZI$$Base;    // 栈起始地址
extern uint32_t Image$$STACK$$ZI$$Limit;   // 栈结束地址

// 方法2:使用链接器生成的符号(更可靠)
extern uint32_t Image$$STACK$$ZI$$Length;  // 栈大小

void print_stack_info(void) {
    printf("方法1 - Stack_Size: 0x%lX\n", (uint32_t)&Stack_Size);
    printf("方法2 - 栈大小: 0x%lX\n", (uint32_t)&Image$$STACK$$ZI$$Length);
    printf("栈起始: 0x%lX\n", (uint32_t)&Image$$STACK$$ZI$$Base);
    pr



回复

使用道具 举报

81

主题

1389

回帖

1632

积分

至尊会员

积分
1632
发表于 2025-10-10 22:13:21 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-11-21 21:03 , Processed in 0.037326 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表