登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

链表的使用构成了UC/OS II的所有核心机制。

作者:mikezhong 栏目:嵌入式系统
链表的使用构成了UC/OS II的所有核心机制。
各位好,在UC/OS II 中很多的链表,用这些链表的操作,从而完成事件控制块,信号量,队列,事件标志,任务等的多任务和信息传递机制,因此理解了链表的工作,那么将很容易地学习UC/OS II,这也是为什么很多大侠说UC/OS II 很简单的原故。我自已本身也正在学习UC/OS II,有较长的一段时间,但由于C语言的链表的内容始终不能悟透,造成进展有些困难,对于此,想请教各位大侠,给我这一类学习者一个正确引导,或者能否提供有助于学习这方面的资料,在下感激不尽!

* - 本贴最后修改时间:2006-3-2 11:31:15 修改者:mikezhong

2楼: >>参与讨论
eleven11
例子
/****************************************COPYRIGHT (c)**************************************************
**
**                                        Small IP
**                              
**
**--------------文件信息--------------------------------------------------------------------------------
** 文   件   名: Mem.c
** 最后修改日期: 2005.11.2
** 当 前 版  本: V1.5.7
** 文 件 描  述: Small IP - Mem.h
********************************************************************************************************/

/**********************************************************************************************************
*                                   定义与编译器无关的数据类型
**********************************************************************************************************/
#define BYTE                          unsigned CHAR
#define SBYTE                         signed CHAR
#define WORD                          unsigned SHORT
#define SWORD                         signed SHORT
#define LONG                          unsigned LONG
#define SLONG                         signed   LONG
#define BOOL                          unsigned CHAR

/**********************************************************************************************************
*                                      编译器关键字的宏定义
**********************************************************************************************************/
#define XDATA
#define REENTRANT
#define INTERRUPT
#define X1
#define X2
#define VOLATILE                      volatile
#define PACK_STRUCT_BEGIN             __packed
#define PACK_STRUCT_END
#define CODE                          
#define CONST                         const

/**********************************************************************************************************
*                                   定义编译器是小端模式还是大端模式
**********************************************************************************************************/
#define Little_End

/*********************************************************************************************************
                                          内存控制结构体定义
*********************************************************************************************************/
typedef struct mem_pcb
{
LONG                MemBlkSize;        /* 该内存块可用内存的大小                                       */
struct mem_pcb XDATA *pPrevPCB;        /* 指向上一个内存控制结构体的指针,NULL为空                     */
struct mem_pcb XDATA *pNextPCB;        /* 指向下一个内存控制结构体的指针,NULL为空                     */
BYTE                  *MemAddr;        /* 指向可用内存的起始地址                                       */
WORD                  UsedSize;        /* 用户已用内存的大小,可忽略                                   */
BYTE                    PARTNO;        /* 该内存所在的分区号                                           */
unsigned                Used:1;        /* 置1标记已用                                                  */
unsigned              Locked:1;        /* 置1标记该内存被锁,无法释放                     &nbs
3楼: >>参与讨论
eleven11
1
/****************************************COPYRIGHT (c)**************************************************
**
**                                        Small IP
**                              
**
**--------------文件信息--------------------------------------------------------------------------------
** 文   件   名: Mem.c
** 最后修改日期: 2005.11.2
** 当 前 版  本: V1.5.7
** 文 件 描  述: Small IP - Mem.c
********************************************************************************************************/
#ifndef IN_MEM
#define IN_MEM

#include "SmallIP.h"

MEM_PART_FLAG_TYPE XDATA PartUsingFlag;
LONG XDATA MemFreeSize;
static BYTE XDATA MemRAM[MEM_PART_NUM][MEM_PART_SIZE];
static MEM_PCB XDATA * XDATA MemPCBLists[MEM_PART_NUM];
/*********************************************************************************************************
** 函数名称: MemInit
** 功能描述: 内存初始化函数
**
** 输   入: 无
**
** 输   出: 无
**         
** 全局变量: MemFreeSize, PartUsingFlag
** 调用模块: 无
********************************************************************************************************/
void MemInit(void) REENTRANT
{
   BYTE i;
   
   for (i=0; i<MEM_PART_NUM; i++) //内存控制结构体第一个控制结构体的参数初始化
   {
      MemPCBLists[i] = (MEM_PCB XDATA * XDATA)(&MemRAM[i][0] + MEM_PART_SIZE - sizeof(MEM_PCB));
      MemPCBLists[i]->MemBlkSize = MEM_PART_SIZE - sizeof(MEM_PCB);
      MemPCBLists[i]->pPrevPCB = NULL;
      MemPCBLists[i]->pNextPCB = NULL;
      MemPCBLists[i]->MemAddr = &MemRAM[i][0];
      MemPCBLists[i]->Used = FALSE;
      MemPCBLists[i]->Locked = FALSE;
      MemPCBLists[i]->PARTNO = i;
      MemPCBLists[i]->Flag = 0;      
   }
   
   MemFreeSize = (MEM_PART_SIZE - sizeof(MEM_PCB))*MEM_PART_NUM; //可用内存空间初始值
   PartUsingFlag = 0;
}

/*********************************************************************************************************
** 函数名称: MemAlloc
** 功能描述: 内存分配函数
**
** 输   入: Size :需要分配的内存大小, 大小不得大于64KB
**
** 输   出: 分配到的内存控制结构体
**         
** 全局变量: MemFreeSize, PartUsingFlag
** 调用模块: 无
********************************************************************************************************/
MEM_PCB XDATA *MemAlloc(WORD Size) REENTRANT
{
   MEM_PCB XDATA *pMem;
   MEM_PCB XDATA *pNewMem;
   WORD NewMemSize;
   BYTE MinSize = RAM_MIN_SIZE-1;
   BYTE i;

   Size = (Size + MinSize) & (~MinSize); //需要分配的内存大小进行字或字节取整
   NewMemSize = Size + sizeof(MEM_PCB); //要分配的内存+控制结构体总共需要的内存大小
         
   for (i=0; i<MEM_PART_NUM; i++) //内存分区循环检测
   {   
      if (MEM_PART_USING(i)) //若该内存分区已经标记正在使用,跳到下一个内存分区
      {
         continue;
      }      
      
      MEM_PART_SET_USING_FLAG(i); //内存分区标记正在使用
      pMem = MemPCBLists[i]; //获取该内存分区第一个内存控制结构体的指针
   
      while ( pMem != NULL ) //若已经没有内存控制结构体检测,则跳出
      {
         if ( pMem->MemBlkSize >= Size ) //当前内存控制结构体的可用内存大小适合,同时是空闲内存
         if ( pMem->Used == FALSE )
         {
            if ( pMem->MemBlkSize >= (NewMemSize + RAM_MIN_SIZE) ) //若该内存控制结构体的可用内存至少还可以再分配一个控制结构体+最小内存
            {
               pNewMem = (MEM_PCB XDATA *)(pMem->MemAddr + Size); //计算分配的控制结构体的指针
               pNewMem->pPrevPCB = pMem->pPrevPCB; //分配的控制结构体的参数赋值
               pNewMem->pNextPCB = pMem;
               pNewMem->MemAddr = pMem->MemAddr;               
               pNewMem->MemBlkSize = Size;
            
               pMem->pPrevPCB = pNewMem; //当前控制结构体的参数改变
               pMem->MemAddr += NewMemSize;
               pMem->MemBlkSize -= NewMemSize;
            
               if( pNewMem->pPrevPCB != NULL ) //若当前控制结构体的上一个内存控制结构体存在
               {
                  pNewMem->pPrevPCB->pNextPCB = pNewMem; //需要改变该内存控制结构体的下一个内存控制结构体的参数
               }
            
               MemFreeSize -=  NewMemSize; //空闲可用内存的值需要减去分配的内存+控制结构体总共需要的内存大小
            }
            else //否则将该内存控制结构体整个分配出去
            {
               pNewMem = pMem;
            &n
4楼: >>参与讨论
eleven11
配置
/**********************************************************************************************************
*                                       
**********************************************************************************************************/
                                   /* 内存所有分区大小总和不得大于0xFFFFFFFF                             */
#define MEM_PART_SIZE     0x4000   /* 内存分区的大小,必须4字节对齐,若是51,则可字对齐                  */

#define MEM_PART_NUM           3   /* 内存分区的数目,最大支持分区数由内存分区标记的数据类型决定          */

#define MEM_PART_FLAG_TYPE  BYTE   /* 定义分区正在使用标记的数据类型                                     */

#define RAM_MIN_SIZE           4   /* 内存分配的最小单元:ARM为4,51为2                                   */

参与讨论
昵称:
讨论内容:
 
 
相关帖子
SD卡的初始化不成功,做过的朋友可指点一下?
我该咋办?
使用uC/OS-II时出现的问题
EasyARM2131与12864J
[求助]调试UC/OS 2遇到的奇怪问题
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号