首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
client
instance
uri
filter
web3
eval
actionscrip
c语言
netty
controller
copy
expression
usb
export
command
callback
datetime
dll
loops
const
ascii
fetch
typescript
blob
tree
heatmap
chat
cookie
input
scala
express
timezone
hook
search
stream
install
hashtable
bash
get
python3
testing
web
require
version
cPlusPlus
string
cpython
buffer
bytecode
uml
timestamp
object
utf-8
window
byte
dockerfile
jsp
hashset
match
process
cmd
integer
erlang
request
java
bit
default
list
spring
go
php5
settings
format
python
include
solr
schema
shell
triggers
当前位置:
开发笔记
>
编程语言
> 正文
单片机(不基于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
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
input
Java实现文本到图片转换,支持自动换行、字体自定义及图像优化
本文详细介绍了如何使用Java实现将文本转换为图片的功能,包括自动换行、自定义字体加载、抗锯齿优化以及图片压缩等技术细节。 ...
[详细]
蜡笔小新 2024-12-17 13:47:08
input
MapReduce原理是怎么剖析的
这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ...
[详细]
蜡笔小新 2024-12-16 18:23:06
copy
Manacher算法详解
本文详细介绍了Manacher算法,该算法能够在O(n)时间内找到字符串中的最长回文子串。通过对字符串进行预处理,并使用动态规划的思想,Manacher算法能够高效地解决这一问题。 ...
[详细]
蜡笔小新 2024-12-16 14:09:21
command
深入解析SSDP与WSD协议
本文探讨了SSDP(简单服务发现协议)和WSD(Web服务发现)协议,特别是SSDP如何通过固定多播地址239.255.255.250:1900实现局域网内的服务自发现功能。文中还详细介绍了SSDP协议的关键操作类型及其应用场景。 ...
[详细]
蜡笔小新 2024-12-18 19:07:24
chat
YB02 防水车载GPS追踪器
YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ...
[详细]
蜡笔小新 2024-12-18 14:59:54
chat
Java EE SDK 安装指南及常见问题解决
本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ...
[详细]
蜡笔小新 2024-12-18 12:09:19
controller
使用Java反射机制模拟Webwork URL解析
本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ...
[详细]
蜡笔小新 2024-12-18 10:06:40
const
C++ 中进度条的创新实现
本文介绍了一个使用 C++ 实现的进度条功能,通过自定义函数指针和控制台输出来展示任务完成的进度。 ...
[详细]
蜡笔小新 2024-12-18 09:14:59
uri
在Node.js中利用SOCKS5代理进行HTTP请求
本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ...
[详细]
蜡笔小新 2024-12-17 15:05:06
uri
Java中String类为何设计为final?其不可变性与其他包装类的特性
探讨Java中String类设计为final的原因及其不可变性,同时分析其他基本数据类型包装类及枚举类型的不可变性。 ...
[详细]
蜡笔小新 2024-12-17 15:01:13
uri
Shrio03Authenticator(认证)、配置多个Realm、ModularRealmAuthenticator(认证实现类)、AuthenticationStrategy(认证策略)
1Authenticator简介1.1层次结构图1.2作用职责是验证用户帐号,是ShiroAPI中身份验证核心的入口点;接口中声明的authenticate方法就是用来实现认证逻辑 ...
[详细]
蜡笔小新 2024-12-17 11:37:08
ascii
大数据基础:JavaSE_day06
大数据基础:JavaSE_day06 ...
[详细]
蜡笔小新 2024-12-17 09:19:57
input
Windows多声道音频采集解决方案
本文介绍了一个项目中如何在Windows平台上实现多声道音频数据的采集,特别是针对DANTE音频接口的8路立体声音频通道。文章详细描述了使用Windows底层音频API进行音频采集的方法,并提供了一个具体的实现示例。 ...
[详细]
蜡笔小新 2024-12-16 18:43:24
const
C++中的外部连接与内部连接及其源文件组织策略
本文探讨了C++编程语言中声明与定义的区别,以及如何通过内部连接和外部连接来组织源文件,确保代码的正确链接与编译。文章详细解析了不同类型、变量、函数以及类的连接属性,并提供了实用的示例。 ...
[详细]
蜡笔小新 2024-12-16 16:56:53
client
WPF/E CTP与SDK即将发布,引领RIA新时代?
Microsoft即将发布WPF/E的CTP(Community Technology Preview)和SDK,标志着RIA(Rich Internet Application)技术的新里程碑。更多详情及下载链接请参见MSDN官方页面。 ...
[详细]
蜡笔小新 2024-12-16 16:06:18
牧高风_457
这个家伙很懒,什么也没留下!
Tags | 热门标签
client
instance
uri
filter
web3
eval
actionscrip
c语言
netty
controller
copy
expression
usb
export
command
callback
datetime
dll
loops
const
ascii
fetch
typescript
blob
tree
heatmap
chat
cookie
input
scala
RankList | 热门文章
1
财政部宣布开通微信视频号、抖音号
2
android平板8英寸,8英寸安卓系统 Newpad P10平板电脑评测
3
使用分布式数据库 “你配吗”
4
讨厌的linuxvsftpd 匿名上传配置
5
请教安装dns时出现错误提示
6
「AI识别的是同性恋,警醒的是所有人的隐私安全」,斯坦福作者回应论文争议...
7
可观测实践|如何使用阿里云 Prometheus 观测 ECS 应用
8
开发笔记:使用labelImg制作自己的数据集(VOC2007格式)用于FasterRCNN训练
9
datafactory生成mysql数据_测试数据生成工具DataFactory的使用
10
IDEA的database使用教程(使用mysql数据库)
11
ios 自定义拍照页面_vivo X27只靠颜值和拍照吃饭?体验过后你也会被系统所折服...
12
9000款中文版PR黑科技一键安装,轻松制作短视频剪辑/特效pr手机设置
13
要学计算机买macbook,我是学平面设计的,买苹果电脑需要什么样的配置以上?...
14
[小说]汪建辉:她
15
ZT 而立和不惑之间- -
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有