欢迎来到天天文库
浏览记录
ID:34460282
大小:196.09 KB
页数:4页
时间:2019-03-06
《一种工程机械控制器专用操作系统的设计与实现(2)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、繁穆蛳年11月万方数据_蠢潺程机械胁棚柳删衙相眦删咖8一稗工毽壤壤攮鼷簇专咫攥作系统酶设诗与寞瑰(2)拳湖南大学软件学院周继辉金敏三一重工股份有限公司周翔周继辉2.3消息机制本操作系统的任务问通信采用消息机制,一个任务可以向另一个任务(包括自已)发送一个字节长度的消息,值0表示无效消息,其余内容m用户自行定义。为了实现该项功能,系统在TDB中为每个任务保留一个字节的空间作为消息缓存,系统启动时将其初始化为0。如果任务q需要向任务j发送一个消息,内容为12,只需要调用函数:voidsmt_send—
2、ms甙j,12);该函数将消息(i2)直接写入任务i的TDB中,当调度函数调用任务J的时候,会先取出相应位置的消息,作为参数传递给任务j的任务函数,从而实现了任务间的消息传递。当任务i的任务函数返回后,调度函数自动清空该消息缓存,等待下一个消息到来。此机制的优点是简单、可靠,缺点是每个任务只有一个消息缓冲位置,所以不支持多个任务同时向一个任务发送消息。2.4内存管理内存管理模块的设计思想如下:首先用户需要在smt_conf.h中参考自己的硬件配置,定义可动态分配的内存的大小MAX—MAL_LOC—
3、BYTE,设置该参数时需要为操作系统保留8×MAXJASK—NUM个宁节,并至少为堆栈保留40个字节。系统首先定义一个内存块管理结构,使用双向链表管理连续内存块:$tructmemct
4、_tfuint8megie_num;//内存块标志b0018used;,,使用标志,false表示该块内存未被使用+基金项日:长沙市科技计划资助重点项目(KZB064002)uintl6len;structmemctl_【4p_pre;streetmcmctl_t+p_next;};然后在初始化的时候将用户设定的动
5、态内存分配到一个静态大数组中:uint8g_roem[MAX——MALLOC——BYTE];然后调用内存管理初始化函数:voidsmt_mm_init(void){streetmemctl—t4p_nlem;P-menl=(structmemctl_t+)&g-mem;p_mem一>megic_num=MEM_MAGIC_NUM;p_mem一>used=FALSE;p_mem一>p—pre=NULL;p_mem一>p_next=NULL;pmern一>len=MAX—MAL—LOC—BYTE—si
6、zeof(structmemed—D;//减去内存管理结构头所占的字节数)此时系统中只有一个内存块,长度为最大值。用户任务可以调用函数:void+smt_malloc(uintl6lenl{structmemetl_t+p_mem;struetmemetl_t4p_new;p_mem=rstructmemell_t8)g_mem;while(p_memf-NUI—L)(if(p_mem一>used)(p_mem2p_mem->p_next;continue;}if(p_mem—Men7、方数据脚∞∞mpl庙目r却脚。鲥嘲工程机械第S8誊∞咿隼1i{8、¨舟p_mem=P—them一>p—next;continue;】if(p_mem—Men>len+sizeof(struetmemctl_t1)f//剩余的还可以建一个新块p-ilew=(streetmemcd_t+)(((uint88)p_mem)+sizeof(structmemctl—O+len);p_new一>megic—nnlTl=MEM—MAG—IC—NUM;p_new一>len5p_mem一>len—len—slzeo9、f(structmemctl_t);p_new一>p—next2p_mem一>pnext;p_new一>p_we=P—mem;p_mem一>p—next。P—new;p_mem一>len=len;}return(uint8+)p—mem+sizeof(structmemetl_t);JreturnNULL;//内存申请失败)申请内存。该函数首先查找一个长度足够的内存块,如果找小到,返回空指针;如果找到,则计算该块满足此次申请厉剩余的长度,如果大十内存块控制结构,则将剩余部分新建一个内存块,插入内存10、管理链表。然后返同申请到的内存块的州户数据首地址。当用户使用完一块内存,需要将其释放的时候,可以调用如下函数:voidsmt_mfree(void4P){slruetlneiffled_t+pmem;structmemefl—t+p_pre;struetmemetl—t+p_next;p_mem=(structmemctl_t。)((uint8虬P—sizeof(structmemctl_t));if(p—mem一>meglc—Hum!=MEM—MAG—IC—NUM)return;
7、方数据脚∞∞mpl庙目r却脚。鲥嘲工程机械第S8誊∞咿隼1i{
8、¨舟p_mem=P—them一>p—next;continue;】if(p_mem—Men>len+sizeof(struetmemctl_t1)f//剩余的还可以建一个新块p-ilew=(streetmemcd_t+)(((uint88)p_mem)+sizeof(structmemctl—O+len);p_new一>megic—nnlTl=MEM—MAG—IC—NUM;p_new一>len5p_mem一>len—len—slzeo
9、f(structmemctl_t);p_new一>p—next2p_mem一>pnext;p_new一>p_we=P—mem;p_mem一>p—next。P—new;p_mem一>len=len;}return(uint8+)p—mem+sizeof(structmemetl_t);JreturnNULL;//内存申请失败)申请内存。该函数首先查找一个长度足够的内存块,如果找小到,返回空指针;如果找到,则计算该块满足此次申请厉剩余的长度,如果大十内存块控制结构,则将剩余部分新建一个内存块,插入内存
10、管理链表。然后返同申请到的内存块的州户数据首地址。当用户使用完一块内存,需要将其释放的时候,可以调用如下函数:voidsmt_mfree(void4P){slruetlneiffled_t+pmem;structmemefl—t+p_pre;struetmemetl—t+p_next;p_mem=(structmemctl_t。)((uint8虬P—sizeof(structmemctl_t));if(p—mem一>meglc—Hum!=MEM—MAG—IC—NUM)return;
此文档下载收益归作者所有