chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于無操作系統(tǒng)的STM32單片機開發(fā)附源碼

STM32嵌入式開發(fā) ? 來源:STM32嵌入式開發(fā) ? 2024-11-15 11:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

現(xiàn)在非常多的的MCU性能都還不錯,同時用戶也會去擴展一些外部RAM,這樣如果高效便捷的管理這些內(nèi)存是一個重要話題。

今天給大家分享一份源碼:基于無操作系統(tǒng)STM32單片機開發(fā),功能強大,可申請到地址空間連續(xù)的不同大小的內(nèi)存空間,且用戶接口簡單,使用方便。

源碼說明

源碼包含memory.h 和 memory.c 兩個文件(嵌入式C/C++代碼的“標配”),其源碼中包含重要的注釋。 頭文件memory.h :包含結(jié)構(gòu)體等定義,函數(shù)API申明等; 源文件memory.c :是實現(xiàn)內(nèi)存管理相關(guān)API函數(shù)的原型。

頭文件memory.h

頭文件是相關(guān)的定義和申請:

#ifndef __MEMORY_H__
#define __MEMORY_H__


#include "stdio.h"
#include "string.h"
#include "includes.h"
//用戶使用
typedef struct
{
    void    *addr;      //申請到的內(nèi)存的起始地址
    uint32_t size;      //申請到的內(nèi)存的大小,按照塊大小分配,大于等于申請大小
    uint16_t  tb;        //申請表序號,申請內(nèi)存時分配,釋放內(nèi)存時使用,用戶不使用
}DMEM;
//若返回空,則申請失敗
DMEM *DynMemGet(uint32_t size);


void DynMemPut(DMEM *pDmem);


#endif //__MEMORY_H__

這里的代碼比較簡單,也是常規(guī)的寫法,重點是要理解結(jié)構(gòu)體成員的含義。

源文件memory.c

源文件主要就是實現(xiàn)內(nèi)存管理的函數(shù),源碼比較多,這里才分為三部分。 1、相關(guān)的定義

#include "memory.h"


#define DMEM_BLOCK_SIZE         256      //內(nèi)存塊大小為128字節(jié)
#define DMEM_BLOCK_NUM          20       //內(nèi)存塊個數(shù)為40個
#defineDMEM_TOTAL_SIZE(DMEM_BLOCK_SIZE*DMEM_BLOCK_NUM) //內(nèi)存總大小


static uint8_t DMEMORY[DMEM_TOTAL_SIZE];
static DMEM_STATE DMEMS = {0};


typedef enum
{
    DMEM_FREE   = 0,
    DMEM_USED   = 1,
}DMEM_USED_ITEM;


typedef struct
{
    DMEM_USED_ITEM   used;       //使用狀態(tài)
    uint16_t         blk_s;      //起始塊序號
    uint16_t         blk_num;    //塊個數(shù)
}DMEM_APPLY;


typedef struct
{
    DMEM_USED_ITEM  tb_blk[DMEM_BLOCK_NUM];
    DMEM            tb_user[DMEM_BLOCK_NUM];        //用戶申請內(nèi)存信息
    DMEM_APPLY      tb_apply[DMEM_BLOCK_NUM];       //系統(tǒng)分配內(nèi)存信息
    uint16_t        apply_num;      //內(nèi)存申請表占用數(shù)目
    uint16_t        blk_num;        //內(nèi)存塊占用數(shù)目
}DMEM_STATE;

2、內(nèi)存分配函數(shù)DynMemGet
DMEM *DynMemGet(uint32_t size)
{
    uint16_t loop = 0;
    uint16_t find = 0;
    uint16_t blk_num_want = 0;
    DMEM * user = NULL;
    DMEM_APPLY *apply = NULL;


    //申請內(nèi)存大小不能為0
    if(size == 0)               {   return NULL;    }
    //申請內(nèi)存不可超過總內(nèi)存大小
    if(size > DMEM_TOTAL_SIZE)  {   return NULL;    }
    //申請內(nèi)存不可超過剩余內(nèi)存大小
    if(size > (DMEM_BLOCK_NUM - DMEMS.blk_num) * DMEM_BLOCK_SIZE)   {   return NULL;    }
    //申請表必須有空余
    if(DMEMS.apply_num >= DMEM_BLOCK_NUM)   {   return NULL;    }


    //計算所需連續(xù)塊的個數(shù)
    blk_num_want = (size + DMEM_BLOCK_SIZE - 1) / DMEM_BLOCK_SIZE;


    //尋找申請表
    for(loop = 0; loop < DMEM_BLOCK_NUM; loop++)
    {
        if(DMEMS.tb_apply[loop].used == DMEM_FREE)
        {
            apply = &DMEMS.tb_apply[loop];                  //申請表已找到
            user = &DMEMS.tb_user[loop];                    //用戶表對應(yīng)找到
            user->tb = loop;                                //申請表編號記錄
            user->size = blk_num_want * DMEM_BLOCK_SIZE;    //分配大小計算
            break;
        }
    }


    //沒有找到可用申請表,理論上是不會出現(xiàn)此現(xiàn)象的,申請表剩余已在上面校驗
    if(loop == DMEM_BLOCK_NUM)  {   return NULL;    }


    //尋找連續(xù)內(nèi)存塊
    for(loop = 0; loop < DMEM_BLOCK_NUM; loop++)
    {
        if(DMEMS.tb_blk[loop] == DMEM_FREE)
        {//找到第一個空閑內(nèi)存塊
            for(find = 1; (find < blk_num_want) && (loop + find < DMEM_BLOCK_NUM); find ++)
            {//找到下一個空閑內(nèi)存塊
                if(DMEMS.tb_blk[loop + find] != DMEM_FREE)
                {//發(fā)現(xiàn)已使用內(nèi)存塊
                    break;
                }
            }
            if(find >= blk_num_want)
            {//尋找到的空閑內(nèi)存塊數(shù)目已經(jīng)夠用
                user->addr = DMEMORY + loop * DMEM_BLOCK_SIZE;  //計算申請到的內(nèi)存的地址
                apply->blk_s = loop;                            //記錄申請到的內(nèi)存塊首序號
                apply->blk_num = blk_num_want;                  //記錄申請到的內(nèi)存塊數(shù)目
                for(find = 0 ; find < apply->blk_num; find++)
                {
                    DMEMS.tb_blk[loop + find] = DMEM_USED;
                }
                apply->used = DMEM_USED;                        //標記申請表已使用
                DMEMS.apply_num += 1;
                DMEMS.blk_num += blk_num_want;


                return user;
            }
            else
            {//尋找到的空閑內(nèi)存塊不夠用,從下一個開始找
                loop += find;
            }
        }
    }


    //搜索整個內(nèi)存塊,未找到大小適合的空間
    return NULL;
}
3、內(nèi)存釋放函數(shù)DynMemPut
void DynMemPut(DMEM *user)
{
    uint16_t loop = 0;
    //若參數(shù)為空,直接返回
    if(NULL == user)    {   return; }


    //釋放內(nèi)存空間
    for(loop = DMEMS.tb_apply[user->tb].blk_s; loop < DMEMS.tb_apply[user->tb].blk_s + DMEMS.tb_apply[user->tb].blk_num; loop++)
    {
        DMEMS.tb_blk[loop] = DMEM_FREE;
        DMEMS.blk_num -= 1;
    }
    //釋放申請表
    DMEMS.tb_apply[user->tb].used = DMEM_FREE;
    DMEMS.apply_num -= 1;
}
代碼中包含注釋,注釋描述的比較清楚,也比較容易理解。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(guān)注

    關(guān)注

    6074

    文章

    45359

    瀏覽量

    664256
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    9

    文章

    3174

    瀏覽量

    76147
  • STM32
    +關(guān)注

    關(guān)注

    2306

    文章

    11128

    瀏覽量

    371352

原文標題:基于無操作系統(tǒng)的STM32內(nèi)存管理模塊,附源碼

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    單片機操作系統(tǒng)

    單片機操作系統(tǒng)主要分為實時操作系統(tǒng)(RTOS)和嵌入式操作系統(tǒng)兩類,以下是常見選擇: 實時操作系統(tǒng)(RTOS) ? FreeRTOS ?:
    發(fā)表于 11-14 06:18

    51單片機多任務(wù)操作系統(tǒng)的原理與實現(xiàn)

    51單片機多任務(wù)操作系統(tǒng)的原理與實現(xiàn),在51單片機上模擬操作系統(tǒng)
    發(fā)表于 02-28 15:09 ?16次下載

    單片機中嵌入操作系統(tǒng)有哪些優(yōu)缺點

     近年來,在單片機系統(tǒng)中嵌入操作系統(tǒng)已經(jīng)成為人們越來越關(guān)心的一個話題。本文通過對一種源碼公開的單片機嵌入式實時
    發(fā)表于 08-05 17:34 ?1次下載
    在<b class='flag-5'>單片機</b>中嵌入<b class='flag-5'>操作系統(tǒng)</b>有哪些優(yōu)缺點

    一個基于操作系統(tǒng)STM32單片機單片機內(nèi)存管理器

    本代碼基于操作系統(tǒng)STM32單片機開發(fā),功能強大,可申請到地址空間連續(xù)的不同大小的內(nèi)存空間,且用戶接口簡單,使用方便。直接貼代碼: me
    的頭像 發(fā)表于 12-22 17:20 ?2985次閱讀
    一個基于<b class='flag-5'>無</b><b class='flag-5'>操作系統(tǒng)</b>的<b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>的<b class='flag-5'>單片機</b>內(nèi)存管理器

    ADXRS453-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序

    ADXRS453-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序
    發(fā)表于 04-21 11:23 ?1次下載
    ADXRS453-適用于<b class='flag-5'>單片機</b>平臺的<b class='flag-5'>無</b><b class='flag-5'>操作系統(tǒng)</b>驅(qū)動程序

    ADXL362-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序

    ADXL362-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序
    發(fā)表于 04-22 14:54 ?7次下載
    ADXL362-適用于<b class='flag-5'>單片機</b>平臺的<b class='flag-5'>無</b><b class='flag-5'>操作系統(tǒng)</b>驅(qū)動程序

    基于51單片機的圖書管理系統(tǒng)實現(xiàn)與設(shè)計(源碼)

    基于51單片機的圖書管理系統(tǒng)實現(xiàn)與設(shè)計(源碼)
    發(fā)表于 04-26 10:52 ?21次下載

    AD7780-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序

    AD7780-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序
    發(fā)表于 05-20 13:37 ?11次下載
    AD7780-適用于<b class='flag-5'>單片機</b>平臺的<b class='flag-5'>無</b><b class='flag-5'>操作系統(tǒng)</b>驅(qū)動程序

    AD7193-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序

    AD7193-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序
    發(fā)表于 05-22 09:52 ?53次下載
    AD7193-適用于<b class='flag-5'>單片機</b>平臺的<b class='flag-5'>無</b><b class='flag-5'>操作系統(tǒng)</b>驅(qū)動程序

    AD7091R-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序

    AD7091R-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序
    發(fā)表于 05-22 13:58 ?14次下載
    AD7091R-適用于<b class='flag-5'>單片機</b>平臺的<b class='flag-5'>無</b><b class='flag-5'>操作系統(tǒng)</b>驅(qū)動程序

    AD7303-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序

    AD7303-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序
    發(fā)表于 05-22 15:29 ?16次下載
    AD7303-適用于<b class='flag-5'>單片機</b>平臺的<b class='flag-5'>無</b><b class='flag-5'>操作系統(tǒng)</b>驅(qū)動程序

    AD7156-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序

    AD7156-適用于單片機平臺的操作系統(tǒng)驅(qū)動程序
    發(fā)表于 05-22 20:26 ?7次下載
    AD7156-適用于<b class='flag-5'>單片機</b>平臺的<b class='flag-5'>無</b><b class='flag-5'>操作系統(tǒng)</b>驅(qū)動程序

    華大單片機移植RTThread操作系統(tǒng)

    華大單片機移植RTThread-國產(chǎn)操作系統(tǒng)文章目錄華大單片機移植RTThread-國產(chǎn)操作系統(tǒng)1.華大單片機型號選擇2.RTThread
    發(fā)表于 11-17 17:21 ?53次下載
    華大<b class='flag-5'>單片機</b>移植RTThread<b class='flag-5'>操作系統(tǒng)</b>

    cpu224 stm32源碼,226 PLC STM32單片機源碼

    cpu224 stm32源碼,226 PLC STM32單片機源碼
    發(fā)表于 12-20 18:43 ?78次下載
    cpu224 <b class='flag-5'>stm32</b><b class='flag-5'>源碼</b>,226 PLC <b class='flag-5'>STM32</b><b class='flag-5'>單片機</b><b class='flag-5'>源碼</b>

    單片機操作系統(tǒng)有哪些

    單片機操作系統(tǒng)(RTOS)是一種專門設(shè)計用于單片機操作系統(tǒng),它可以提供任務(wù)調(diào)度、內(nèi)存管理、設(shè)備驅(qū)動等功能,幫助程序員更高效地開發(fā)嵌入式
    的頭像 發(fā)表于 12-08 16:18 ?7315次閱讀