亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? os_mem.c

?? avr ucos 代碼 測試環(huán)境:source insight WINAVR 4個進(jìn)程
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*                                            MEMORY MANAGEMENT
*
*                          (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
*                                           All Rights Reserved
*
* File : OS_MEM.C
* By   : Jean J. Labrosse
*********************************************************************************************************
*/

#ifndef  OS_MASTER_FILE
#include "includes.h"
#endif

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)//允許包含內(nèi)在管理代碼且內(nèi)在分區(qū)數(shù)大于0
/*
*********************************************************************************************************
*                                        CREATE A MEMORY PARTITION
*
* Description : Create a fixed-sized memory partition that will be managed by uC/OS-II.
*
* Arguments   : addr     is the starting address of the memory partition
*
*               nblks    is the number of memory blocks to create from the partition.
*
*               blksize  is the size (in bytes) of each block in the memory partition.
*
*               err      is a pointer to a variable containing an error message which will be set by
*                        this function to either:
*
*                        OS_NO_ERR            if the memory partition has been created correctly.
*                        OS_MEM_INVALID_ADDR  you are specifying an invalid address for the memory 
*                                             storage of the partition.
*                        OS_MEM_INVALID_PART  no free partitions available
*                        OS_MEM_INVALID_BLKS  user specified an invalid number of blocks (must be >= 2)
*                        OS_MEM_INVALID_SIZE  user specified an invalid block size
*                                             (must be greater than the size of a pointer)
* Returns    : != (OS_MEM *)0  is the partition was created
*              == (OS_MEM *)0  if the partition was not created because of invalid arguments or, no
*                              free partition is available.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
                                                           建立一個內(nèi)存分區(qū)
描述:建立一個可由ucosII管理的大小固定的內(nèi)存塊
參數(shù):addr :內(nèi)存分區(qū)的起始地址
          nblks:從分割區(qū)中要建立內(nèi)在塊的數(shù)目
          blksize:內(nèi)在分割區(qū)中每塊內(nèi)存的大小(用字節(jié)表示)
           err:是由下列函數(shù)決定的,包含錯誤信息的可變指針:
               OS_NO_ERR:如果內(nèi)存塊建立正確
               OS_MEM_INVALID_ADDR:你為分割區(qū)的內(nèi)在空間指定了不可用地址
               OS_MEM_INVALID_PART:沒有多余的區(qū)域了。
               OS_MEM_INVALID_BLKS:用戶指定分割數(shù)目不合法(必須大于等于2)
               OS_MEM_INVALID_SIZE:用戶指定了非法的內(nèi)存塊大小(必須大于指針的大小)
返回: != (OS_MEM *)0:分區(qū)已經(jīng)建立
            == (OS_MEM *)0:因為非法參數(shù)或者沒有空余塊而沒有建立分區(qū)

*********************************************************************************************************
*/


OS_MEM  *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
    OS_CPU_SR  cpu_sr;//typedef unsigned int OS_CPU_SR
#endif    
    OS_MEM    *pmem;//內(nèi)存控制塊數(shù)據(jù)結(jié)構(gòu)
    INT8U     *pblk;
    void     **plink;//指向指針的指針
    INT32U     i;


#if OS_ARG_CHK_EN > 0//允許參數(shù)檢驗
    if (addr == (void *)0) {                          /* Must pass a valid address for the memory part. */
        *err = OS_MEM_INVALID_ADDR;//要為內(nèi)存塊建立一個合法地址,即地址要有效
        return ((OS_MEM *)0);//返回
    }
    if (nblks < 2) {                                  /* Must have at least 2 blocks per partition      */
        *err = OS_MEM_INVALID_BLKS;//內(nèi)存分塊太少了,必須最小兩塊
        return ((OS_MEM *)0);
    }
    if (blksize < sizeof(void *)) {                   /* Must contain space for at least a pointer      */
        *err = OS_MEM_INVALID_SIZE;//每個內(nèi)存塊至少要容不得得下一個指針,因為
        //同一分區(qū)中的所有空余內(nèi)在塊是由指針鏈串聯(lián)起來的。
        return ((OS_MEM *)0);
    }
#endif
    OS_ENTER_CRITICAL();
    pmem = OSMemFreeList;                             /* Get next free memory partition                */
	//從系統(tǒng)中的空余內(nèi)存控制塊鏈表中取得一個內(nèi)存控制塊,該項內(nèi)存
	//控制塊中包含相應(yīng)內(nèi)在分區(qū)的運(yùn)行狀態(tài)信息。
    if (OSMemFreeList != (OS_MEM *)0) {               /* See if pool of free partitions was empty      */
		//內(nèi)存分區(qū)的空鏈表指針是否為空,如不為空,
        OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;//這是什么意思?將空余塊賦給空余內(nèi)存塊?
    }
    OS_EXIT_CRITICAL();
    if (pmem == (OS_MEM *)0) {                        /* See if we have a memory partition             */
        *err = OS_MEM_INVALID_PART;//看是否有多余的內(nèi)存控制塊
        return ((OS_MEM *)0);
    }
    plink = (void **)addr;             /* Create linked list of free memory blocks  當(dāng)條件都滿足時    */
    pblk  = (INT8U *)addr + blksize;//所要建立的內(nèi)存分區(qū)內(nèi)的所有內(nèi)存塊鏈按成一個單向
    //鏈表。因為在單向鏈表中插入和刪除元素都是從鏈表的頂端開始向下執(zhí)行的。
    for (i = 0; i < (nblks - 1); i++) {
        *plink = (void *)pblk;
        plink  = (void **)pblk;//這兩句為什么要這么寫?
        pblk   = pblk + blksize;//這個我懂。
    }
    *plink              = (void *)0;                  /* Last memory block points to NULL              */
	//單向鏈表從上分到下,最后一塊指向零。
	//下面這幾句是保存相關(guān)的信息
    pmem->OSMemAddr     = addr;                       /* Store start address of memory partition       */
    pmem->OSMemFreeList = addr;                       /* Initialize pointer to pool of free blocks     */
    pmem->OSMemNFree    = nblks;                      /* Store number of free blocks in MCB            */
    pmem->OSMemNBlks    = nblks;
    pmem->OSMemBlkSize  = blksize;                    /* Store block size of each memory blocks        */
	//保存每一塊內(nèi)存塊的大小
    *err                = OS_NO_ERR;//沒有錯誤
    return (pmem);//操作完成后,返回指向該內(nèi)存控制塊的指針。該指針在以后對該
    //內(nèi)存分區(qū)的操作中使用。
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                          GET A MEMORY BLOCK
*
* Description : Get a memory block from a partition
*
* Arguments   : pmem    is a pointer to the memory partition control block
*
*               err     is a pointer to a variable containing an error message which will be set by this
*                       function to either:
*
*                       OS_NO_ERR           if the memory partition has been created correctly.
*                       OS_MEM_NO_FREE_BLKS if there are no more free memory blocks to allocate to caller
*                       OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
*
* Returns     : A pointer to a memory block if no error is detected
*               A pointer to NULL if an error is detected
*********************************************************************************************************
*/
 /*
 *********************************************************************************************************
                                             分配內(nèi)存塊
 描述:從分割區(qū)得到一塊內(nèi)存塊
 參數(shù):pmem:一個指向內(nèi)存分割控制塊的指針
			err:可以包含以下錯誤信息的指針:
					OS_NO_ERR:如果內(nèi)存分割正確創(chuàng)建
					OS_MEM_NO_FREE_BLKS:沒有多余的內(nèi)存控制塊調(diào)用
					OS_MEM_INVALID_PMEM:如果傳一個空指針給"pmem"
 
 返回:如果無錯誤則返回一個指向內(nèi)存控制塊的指針,如果有錯誤返回一個空指針	
備注:應(yīng)用程序應(yīng)該知道分配內(nèi)在大小,并在使用的時候不能超過它的大小
應(yīng)用程序不用的時候,應(yīng)當(dāng)將其釋放,重新回到相應(yīng)的相應(yīng)的內(nèi)在分區(qū)中
 *********************************************************************************************************
*/


void  *OSMemGet (OS_MEM *pmem, INT8U *err)
{//傳遞指針pmem,它指向希望從中分配到的內(nèi)存塊的內(nèi)存分區(qū)
#if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
    OS_CPU_SR  cpu_sr;
#endif    
    void      *pblk;


#if OS_ARG_CHK_EN > 0
    if (pmem == (OS_MEM *)0) {                        /* Must point to a valid memory partition         */
        *err = OS_MEM_INVALID_PMEM;//內(nèi)存塊地址為零,不可用
        return ((OS_MEM *)0);
    }
#endif
    OS_ENTER_CRITICAL();
    if (pmem->OSMemNFree > 0) {                       /* See if there are any free memory blocks       */
		//看是不是有多余的內(nèi)存塊
        pblk                = pmem->OSMemFreeList;    /* Yes, point to next free memory block          */
		//有多余的,指向向下一個內(nèi)存塊,即刪除第一塊
        pmem->OSMemFreeList = *(void **)pblk;         /*      Adjust pointer to new free list          */
       //調(diào)整新的鏈表指針
        pmem->OSMemNFree--;                           /*      One less memory block in this partition  */
	   //塊數(shù)減一
        OS_EXIT_CRITICAL();
        *err = OS_NO_ERR;                             /*      No error                                 */
		//沒有錯誤
        return (pblk);                                /*      Return memory block to caller            */
		//返回得到的內(nèi)存塊
    }
    OS_EXIT_CRITICAL();
    *err = OS_MEM_NO_FREE_BLKS;                       /* No,  Notify caller of empty memory partition  */
	//沒有多余的,
    return ((void *)0);                               /*      Return NULL pointer to caller            */
}
/*$PAGE*/
/*
*********************************************************************************************************

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲v日本v欧美v久久精品| 日韩 欧美一区二区三区| 欧美亚洲国产一卡| 国模冰冰炮一区二区| 亚洲日本青草视频在线怡红院 | 依依成人精品视频| 精品国偷自产国产一区| 不卡av在线免费观看| 日韩国产欧美在线观看| 亚洲女同女同女同女同女同69| 精品国产自在久精品国产| 色婷婷亚洲精品| 成人午夜电影网站| 久久国产欧美日韩精品| 五月开心婷婷久久| 亚洲永久精品大片| 亚洲视频在线一区观看| 久久久www免费人成精品| 欧美精品成人一区二区三区四区| 91蜜桃在线观看| 国产精品91一区二区| 人人超碰91尤物精品国产| 亚洲狼人国产精品| 国产精品盗摄一区二区三区| 精品久久国产97色综合| 91精品国产高清一区二区三区蜜臀| av午夜一区麻豆| 国产精品99久久久久久久女警| 美女视频黄频大全不卡视频在线播放 | 亚洲福利视频导航| 亚洲久本草在线中文字幕| 国产精品九色蝌蚪自拍| 欧美激情资源网| 久久久无码精品亚洲日韩按摩| 日韩一区二区三区在线观看| 欧美色图一区二区三区| 欧洲一区二区三区免费视频| 色中色一区二区| 欧美性猛交一区二区三区精品| 91久久精品一区二区二区| 色综合久久中文字幕| 一本色道综合亚洲| 色噜噜夜夜夜综合网| 91蜜桃免费观看视频| 色综合久久中文综合久久97| 日本道精品一区二区三区| 日本乱码高清不卡字幕| 欧美性视频一区二区三区| 欧美日韩在线播放一区| 在线播放一区二区三区| 日韩一区二区电影| 久久免费精品国产久精品久久久久 | 91免费小视频| 在线观看亚洲精品视频| 欧美网站一区二区| 日韩视频一区二区三区在线播放 | 国产精品主播直播| 福利一区二区在线| 一本色道亚洲精品aⅴ| 欧美理论电影在线| 精品日韩一区二区| 中文字幕免费一区| 亚洲丝袜制服诱惑| 日韩一区精品字幕| 国产麻豆精品在线| 成人精品鲁一区一区二区| 99re这里只有精品首页| 在线观看国产91| 日韩一区二区免费在线观看| 久久免费美女视频| 一区二区三区精品在线观看| 日韩精品欧美精品| 高清成人在线观看| 欧美日韩一级大片网址| 精品久久人人做人人爰| 国产精品久久久久久久久免费相片| 亚洲美女偷拍久久| 麻豆精品视频在线| 91麻豆高清视频| 91精品国产全国免费观看| 欧美国产一区二区| 午夜精品久久久久久久99水蜜桃| 久久成人精品无人区| 91美女精品福利| 日韩欧美激情一区| 亚洲黄色小说网站| 国产精品一区二区三区乱码| 色88888久久久久久影院野外| 日韩一本二本av| 综合亚洲深深色噜噜狠狠网站| 日本免费在线视频不卡一不卡二| 国产a精品视频| 制服.丝袜.亚洲.另类.中文 | 亚洲精品精品亚洲| 国内成人精品2018免费看| 色综合久久中文综合久久牛| 精品久久久久久无| 亚洲国产另类精品专区| 国产成人av影院| 欧美不卡一区二区三区| 一区二区三区在线视频免费观看| 狠狠色丁香九九婷婷综合五月| 欧美色成人综合| 国产精品卡一卡二卡三| 国产真实乱对白精彩久久| 欧美揉bbbbb揉bbbbb| ●精品国产综合乱码久久久久| 精品一区二区三区免费观看| 精品视频999| 亚洲精品久久久久久国产精华液| 国产成人精品亚洲777人妖 | xf在线a精品一区二区视频网站| 亚洲美女精品一区| 成人免费毛片aaaaa**| 精品sm在线观看| 日韩影视精彩在线| 欧美性猛交xxxx黑人交| 中文字幕一区在线观看| 国产精品一级在线| 日韩一级免费观看| 日韩成人免费看| 欧美人妖巨大在线| 亚洲高清久久久| 色狠狠色噜噜噜综合网| 最新国产成人在线观看| 成人丝袜高跟foot| 亚洲国产精品v| 成人免费视频网站在线观看| 日本一区二区三区久久久久久久久不| 免费观看一级特黄欧美大片| 欧美日本一道本| 午夜久久久久久| 欧美日韩高清一区| 亚洲成人资源在线| 欧美精品自拍偷拍动漫精品| 亚洲在线免费播放| 欧美日韩久久不卡| 三级不卡在线观看| 91精品国产综合久久蜜臀 | 看电视剧不卡顿的网站| 欧美大片一区二区| 精品一区二区三区视频在线观看| 日韩免费性生活视频播放| 日韩不卡免费视频| 91精品国产色综合久久不卡蜜臀 | 国产人久久人人人人爽| 国产成人在线视频播放| 中文天堂在线一区| 91小视频在线免费看| 亚洲欧美日韩小说| 欧美日韩一区久久| 蜜臀久久99精品久久久久久9| 精品国产乱码久久久久久牛牛| 久久99国产精品免费网站| 精品国产免费一区二区三区香蕉| 激情综合色播五月| 中文乱码免费一区二区| 色欧美片视频在线观看在线视频| 亚洲综合偷拍欧美一区色| 欧美一区二区三区免费在线看| 久久精品99国产精品| 国产日产欧美一区| 色一情一乱一乱一91av| 天天色图综合网| 久久久久9999亚洲精品| 色综合欧美在线| 日韩成人免费电影| 欧美高清在线精品一区| 色视频一区二区| 免费欧美日韩国产三级电影| 国产女人18水真多18精品一级做 | 久久精品夜夜夜夜久久| 99久久精品免费看国产| 偷拍与自拍一区| 国产三级一区二区三区| 色狠狠一区二区三区香蕉| 免费在线视频一区| 国产精品久久久久四虎| 欧美久久久久久久久中文字幕| 激情成人午夜视频| 一区二区三区四区在线播放 | 国产日韩影视精品| 欧美在线视频你懂得| 国模无码大尺度一区二区三区| 国产精品久久三| 欧美高清视频一二三区| 成人午夜免费av| 麻豆精品一区二区av白丝在线| 中文字幕一区二区三区不卡在线| 正在播放亚洲一区| 99re热这里只有精品免费视频| 全部av―极品视觉盛宴亚洲| 国产精品三级av在线播放| 制服丝袜在线91| 91麻豆.com| 懂色av一区二区夜夜嗨| 日韩av电影免费观看高清完整版 | 国产精品乱码久久久久久 | 亚洲女与黑人做爰| 久久精品人人做|