首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
hook
node.js
express
export
plugins
python2
subset
bitmap
golang
default
tree
lua
hashtable
heatmap
java
bash
php
replace
usb
loops
command
spring
datetime
function
case
sum
eval
httpclient
typescript
dagger
client
config
vba
web
match
frameworks
include
byte
hashset
less
vbscript
audio
tags
instance
version
cpython
foreach
scala
import
cmd
runtime
integer
uri
int
iostream
数组
netty
php7
rsa
cookie
settings
main
merge
filter
ascii
header
range
timestamp
const
shell
timezone
bytecode
callback
expression
substring
list
join
dockerfile
install
当前位置:
开发笔记
>
编程语言
> 正文
单片机(不基于os)下如何实现简单的内存管理(malloc,realloc和free函数的重新实现)
作者:牧高风_457 | 来源:互联网 | 2024-10-14 17:37
实现的原理是将内存分成小的片段进行管理,代码如下:[cpp]viewplaincopy#defineMEM_BLOCK_SIZE4096#defineMEM_LARGE_BLOCK_TH
实现的原理是将内存分成小的片段进行管理,代码如下:
[cpp]
view plaincopy
#define MEM_BLOCK_SIZE 4096
#define MEM_LARGE_BLOCK_THRESHOLD 40960 //>MEM_LARGE_BLOCK_THRESHOLD :requested size is large block
#define MEM_BASE_ADDRESS (0x90000000)
#define MEM_ALLOC_TABLE_FIRST_ENTRY 0
#define MAX_MEM_SIZE 7*1024*1024
#define MEM_ALLOC_TABLE_SIZE (MAX_MEM_SIZE/MEM_BLOCK_SIZE)
static
INT16 memory_map[MEM_ALLOC_TABLE_SIZE];
static
char
isMemoryManagementReady=0;
void
*memset(
void
*s,
int
c,
size_t
count)
{
char
*xs = s;
while
(count--)
*xs++ = c;
return
s;
}
INT32
ssd_mem_init(
void
)
{
memset(memory_map, 0,
sizeof
(memory_map));
isMemoryManagementReady=1;
}
INT16 ssd_mem_percentage_used()
{
int
used=0;
int
i;
for
(i=0;i
{
if
(memory_map[i])
{
used++;
}
}
return
used*100/MEM_ALLOC_TABLE_SIZE;
}
//return -1:FAIL
//>=0: return allocated address offset
INT32
ssd_mem_malloc(
UINT32
size)
{
int
offset=0;
int
startEntry=MEM_ALLOC_TABLE_FIRST_ENTRY;
int
nmemb;
int
i;
if
(!isMemoryManagementReady)
{
ssd_mem_init();
}
if
(size==0)
{
return
-1;
}
nmemb=size/MEM_BLOCK_SIZE;
if
(size%MEM_BLOCK_SIZE)
{
nmemb++;
}
if
(size > MEM_LARGE_BLOCK_THRESHOLD)
{
for
(offset=startEntry;offset
{
if
(!memory_map[offset])
{
int
vacantSize=0;
for
(vacantSize=0;vacantSize
if
(vacantSize==nmemb)
{
for
(i=0;i
{
memory_map[offset+i]=nmemb;
}
return
(offset*MEM_BLOCK_SIZE);
}
}
}
}
else
{
for
(offset=MEM_ALLOC_TABLE_SIZE-1;offset>=0;offset--)
{
if
(!memory_map[offset] && ((offset+nmemb)<=MEM_ALLOC_TABLE_SIZE))
//search start of vacant block
{
int
vacantSize=0;
for
(vacantSize=0;vacantSize
if
(vacantSize==nmemb)
{
for
(i=0;i
{
memory_map[offset+i]=nmemb;
}
return
(offset*MEM_BLOCK_SIZE);
}
}
}
}
puts(
"malloc size erorr="
);
putInt32(size);
return
-1;
}
//return 0:OK
//return 1:Out of bound
INT32
ssd_mem_free(
INT32
offset)
{
int
i;
if
(!isMemoryManagementReady)
{
ssd_mem_init();
return
1;
}
if
(offset
{
int
index=offset/MEM_BLOCK_SIZE;
int
nmemb=memory_map[index];
for
(i=0;i
{
memory_map[index+i]=0;
}
return
0;
}
else
{
return
1;
//out of bound
}
}
void
free(
void
*ptr)
{
if
(ptr==NULL)
return
;
INT32
offset;
offset=ptr-MEM_BASE_ADDRESS;
ssd_mem_free(offset);
}
void
* malloc(
UINT32
size)
{
INT32
offset;
offset=ssd_mem_malloc(size);
if
(offset==-1)
{
return
NULL;
}
else
return
MEM_BASE_ADDRESS+offset;
}
void
*realloc(
void
*ptr,
UINT32
size)
{
INT32
offset;
offset=ssd_mem_malloc(size);
if
(offset==-1)
{
puts(
"realloc error/n"
);
return
NULL;
}
else
{
memcpy((
void
*)(MEM_BASE_ADDRESS+offset),ptr,size);
free(ptr);
return
MEM_BASE_ADDRESS+offset;
}
}
view
copy
request
static
int
char
search
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
java
Apache Jena 中 Txn.executeWrite 方法详解与代码示例
本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ...
[详细]
蜡笔小新 2024-12-26 17:55:52
java
2023年京东Android面试真题解析与经验分享
本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ...
[详细]
蜡笔小新 2024-12-26 17:45:48
java
从 .NET 转 Java 的自学之路:IO 流基础篇
本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ...
[详细]
蜡笔小新 2024-12-26 17:37:25
php
Python 爬虫基础教程及代码实例
根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ...
[详细]
蜡笔小新 2024-12-26 10:42:40
php
深入解析C++对象模型中的细节问题
本文深入探讨了C++对象模型中的一些细节问题,特别是虚拟继承和析构函数的处理。通过具体代码示例和详细分析,揭示了书中某些观点的不足之处,并提供了更合理的解释。 ...
[详细]
蜡笔小新 2024-12-25 19:29:03
php
Android 渐变圆环加载控件实现
本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ...
[详细]
蜡笔小新 2024-12-27 13:34:19
php
Objective-C 编程中的关键语法点
本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ...
[详细]
蜡笔小新 2024-12-26 19:42:38
php
计算机图形学实训:OpenGL入门与直线光栅化算法
本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ...
[详细]
蜡笔小新 2024-12-26 12:24:25
eval
中央电视台电影频道节目预告及优化分析
本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ...
[详细]
蜡笔小新 2024-12-25 21:01:14
tree
深入了解 Windows 窗体中的 SplitContainer 控件
SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ...
[详细]
蜡笔小新 2024-12-25 17:20:08
java
Java多线程并发控制:解决相同key的线程互斥问题
本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ...
[详细]
蜡笔小新 2024-12-25 14:15:29
sum
Web前端开发中的HTML与CSS命名规范
作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ...
[详细]
蜡笔小新 2024-12-25 11:06:17
function
FinOps 与 Serverless 的结合:破解云成本难题
本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ...
[详细]
蜡笔小新 2024-12-24 12:44:26
default
QT预备式(包含MySql配置)未完成……
20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0 ...
[详细]
蜡笔小新 2024-12-24 09:50:00
default
HTTP请求与响应机制详解
本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ...
[详细]
蜡笔小新 2024-12-23 20:40:08
牧高风_457
这个家伙很懒,什么也没留下!
Tags | 热门标签
hook
node.js
express
export
plugins
python2
subset
bitmap
golang
default
tree
lua
hashtable
heatmap
java
bash
php
replace
usb
loops
command
spring
datetime
function
case
sum
eval
httpclient
typescript
dagger
RankList | 热门文章
1
Win10注册表关闭自动更新方法分享
2
java.util.AbstractSet.toString()方法的使用及代码示例
3
Linux下Google Test (GTest)测试环境搭建步骤
4
给硬件工程师的入门课系统框图的设计
5
WIN7LITE7.658EX (240M) 免费企业版
6
看官_在GitHub Actions上进行Flutter 的测试和部署
7
lightgbm过去版本安装包_集成学习算法LightGBM
8
如何证明js中的function是引用类型?
9
ENV变量不通过godotenvDocker
10
20150928Javascript(一)
11
使用代理ip防止爬虫被封ip(附蘑菇代理开发过程)
12
695岛屿最大面积leetcode深度优先搜索
13
Storm集成Kakfa
14
[源码和文档分享]基于JAVA和MYSQL数据库实现的小型公司工资管理系统
15
树莓派python3.7安装tensorflow_树莓派安装TensorFlow
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有