keil使用 define的使用及上电某些区域不初始化

Keil的使用:

在程序中经常会看到如下图所示的定义,#if defined (_MCB2300_),你查遍整个代码也没有找到_MCB2300_,其实_MCB2300_是在keil中定义的

 


 

 

知识点14

使用定义在头文件 absacc.h中的 __at宏,可以将变量以如下方式定位到绝对地址处:

C 例子:

#include <absacc.h>  

uint32 unStartFlag __at (0x40007FE0);

uint32 unBatteryRam __at (0xE0084000);

通过对keil进行如下设置,可以让特定区域的值上电后不初始化


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Keil 中,使用 `malloc` 函数进行内存分配时,需要为其提供一个堆空间,否则会出现内存分配失败等问题。以下是在 Keil初始化堆空间的步骤: 1. 首先在代码中定义堆空间的起始地址和大小,例如: ```c #define HEAP_START 0x20000000 #define HEAP_SIZE 0x1000 ``` 这里定义了堆空间的起始地址为 `0x20000000`,大小为 `0x1000` 字节。 2. 在代码中添加 `malloc` 函数的实现。可以使用 Keil 提供的 `rt_misc.c` 文件中的 `__user_heap_extend` 函数作为 `malloc` 函数的实现,例如: ```c #include <stddef.h> #include <stdint.h> #define HEAP_START 0x20000000 #define HEAP_SIZE 0x1000 static uint8_t heap[HEAP_SIZE] __attribute__((section(".heap"))); void* __user_heap_extend(size_t incr) { static uint8_t* heap_end = NULL; uint8_t* prev_heap_end; if (heap_end == NULL) { heap_end = heap; } prev_heap_end = heap_end; if (heap_end + incr > heap + HEAP_SIZE) { // 内存不足,返回 NULL return NULL; } heap_end += incr; return prev_heap_end; } void* malloc(size_t size) { return __user_heap_extend(size); } void free(void* ptr) { // 空函数,不需要实现 } ``` 这里使用 `__attribute__((section(".heap")))` 将 `heap` 数组放在 `.heap` 段中,以便在链接时将其放置在指定的地址。 3. 在代码中调用 `malloc` 函数进行内存分配,例如: ```c int main() { int* p = (int*) malloc(sizeof(int)); if (p == NULL) { // 内存分配失败 return 1; } // 使用分配的内存 *p = 123; // 释放内存 free(p); return 0; } ``` 这样就完成了在 Keil初始化堆空间的操作,可以使用 `malloc` 函数进行动态内存分配了。需要注意的是,由于 `malloc` 函数实现中使用了静态变量,因此需要在 `__user_heap_extend` 函数中将其声明为 `static` 变量,以避免链接时出现重复定义的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值