天气: 晴朗
心情: 平静
这个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);
用于释放申请的内存。
首先找到要释放的内存块,然后检查前一个和后一个内存快,如果是空闲的就合并。