首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
default
runtime
datetime
nodejs
version
cmd
future
post
utf-8
instance
merge
require
join
fetch
schema
foreach
cSharp
import
uml
bash
shell
less
ascii
eval
triggers
byte
install
command
frameworks
netty
char
bytecode
php
hashset
usb
get
hash
search
typescript
blob
select
plugins
subset
ip
list
string
dockerfile
httprequest
audio
client
substring
golang
function
python3
javascript
web3
settings
php8
grid
yaml
random
hashcode
process
int
dagger
md5
perl
timestamp
text
httpclient
php7
split
solr
integer
metadata
expression
object
hook
stream
当前位置:
开发笔记
>
编程语言
> 正文
单片机(不基于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
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
byte
Apache Jena 中 Txn.executeWrite 方法详解与代码示例
本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ...
[详细]
蜡笔小新 2024-12-26 17:55:52
utf-8
2023年京东Android面试真题解析与经验分享
本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ...
[详细]
蜡笔小新 2024-12-26 17:45:48
byte
从 .NET 转 Java 的自学之路:IO 流基础篇
本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ...
[详细]
蜡笔小新 2024-12-26 17:37:25
install
Python 爬虫基础教程及代码实例
根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ...
[详细]
蜡笔小新 2024-12-26 10:42:40
install
深入理解 SQL 视图、存储过程与事务
本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ...
[详细]
蜡笔小新 2024-12-27 17:40:42
require
Yii2 GridView 实现列表页数据直接编辑的完整指南
本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ...
[详细]
蜡笔小新 2024-12-27 16:27:52
post
Android 渐变圆环加载控件实现
本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ...
[详细]
蜡笔小新 2024-12-27 13:34:19
import
Objective-C 编程中的关键语法点
本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ...
[详细]
蜡笔小新 2024-12-26 19:42:38
byte
计算机图形学实训:OpenGL入门与直线光栅化算法
本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ...
[详细]
蜡笔小新 2024-12-26 12:24:25
import
Java多线程并发控制:解决相同key的线程互斥问题
本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ...
[详细]
蜡笔小新 2024-12-25 14:15:29
join
Web前端开发中的HTML与CSS命名规范
作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ...
[详细]
蜡笔小新 2024-12-25 11:06:17
less
FinOps 与 Serverless 的结合:破解云成本难题
本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ...
[详细]
蜡笔小新 2024-12-24 12:44:26
install
QT预备式(包含MySql配置)未完成……
20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0 ...
[详细]
蜡笔小新 2024-12-24 09:50:00
byte
HTTP请求与响应机制详解
本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ...
[详细]
蜡笔小新 2024-12-23 20:40:08
default
深入解析Linux pinctrl子系统:数据结构详解
本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ...
[详细]
蜡笔小新 2024-12-23 19:52:26
牧高风_457
这个家伙很懒,什么也没留下!
Tags | 热门标签
default
runtime
datetime
nodejs
version
cmd
future
post
utf-8
instance
merge
require
join
fetch
schema
foreach
cSharp
import
uml
bash
shell
less
ascii
eval
triggers
byte
install
command
frameworks
netty
RankList | 热门文章
1
Android记事本项目开发
2
如何从WSL连接到Windows Postgres数据库
3
Android数据库LitePal的基本用法详解
4
SQL查询:没有聚合函数时如何创建小计行
5
性能问题-集合会提高性能吗?
6
Android断点续传下载器JarvisDownloader的示例
7
pgadmin 4.9'int'对象没有属性'replace'与编辑文本字段
8
如何检查弹性搜索无痛参数中是否存在键?
9
Android实现断点多线程下载
10
Android SharedPreferences实现记住密码和自动登录
11
SAS宏使用循环反规范化
12
android studio3.0以上如何通过navicat访问SQLite数据库文件
13
Android SQLite数据库连接实现登录功能
14
Android 数据库打包随APK发布的实例代码
15
Android开发之Sqliteopenhelper用法实例分析
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有