cfanzfr的个人空间 https://blog.eetop.cn/chriszhao [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

编写自己的RTOS(一)——内存管理

已有 1161 次阅读| 2006-10-5 17:39 |个人分类:RTOS

天气: 晴朗
心情: 平静
这个RTOS是在computer00发布ADuC7027的开发板上运行和调试的。
有了第一块arm开发板,就想在上面做一个操作系统。10.1没有出去玩,在家开始开发自己的RTOS。
开发工具:WinARM,Wiggler,OCDRemote。
首先是编写最基本的引导系统,参考WinARM给出的ADuC7026的例子,自己加了些串口发送字符的代码。
接下来就是编写内存管理部分,主要参考FreeRTOS。经过2两天的编写终于成功。有以下的收获:
  • OS管理的内存在OS的堆(heap)里,通过OS的malloc和free得到和释放的内存都在这里。在程序中的指针都必须用OS提供的malloc和free得到和释放内存。
  • 编译器是静态分配,函数的内部变量在生成目标文件时,其地址已经固定下来,所以每次调用函数,其内部变量的地址是一样的。对于可变的数据结构的操作,必须在堆中进行。
开始设想在堆的外面建立一个链表,描述内存的使用情况,结果发现每次建立的链表都是循环链表,跟踪了半天,才明白每次向链表上添加的新的元素的地址都是一样的。

内存管理的基本思路:
在堆的外面,定义了内存块链表的头和尾,内存快的每个元素定义如下:
typedef struct _os_mem_block
{
    struct _os_mem_block * ps_next_block; // 指向下一个快
    void * p_block_addr; // 本快的地址,是本结构体的地址+sizeof(os_mem_block)
    size_t block_size; // 本快的大小
    BOOL b_used; // 是否使用
} os_mem_block;
void * os_malloc(const size_t size):
用于分配内存。
首先检查是否初始化内存快。
然后根据申请的大小,在最近的一个合适(freesize>=size+sizeof(os_mem_block))分配内存。
如果有空间可以再新建一个新的内存快(即freesize>size+sizeof(os_mem_block)*2),插入一个新的内存快。
否则,直接使用这个块。
BOOL os_free(const void * addr);
用于释放申请的内存。
首先找到要释放的内存块,然后检查前一个和后一个内存快,如果是空闲的就合并。

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 2

    评论
  • 98

    访问数
关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-23 06:01 , Processed in 0.022581 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部