吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

基于無操作系統的STM32單片機開發附源碼

STM32嵌入式開發 ? 來源:STM32嵌入式開發 ? 2024-11-15 11:24 ? 次閱讀

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

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

源碼說明

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

頭文件memory.h

頭文件是相關的定義和申請:

#ifndef __MEMORY_H__
#define __MEMORY_H__


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


void DynMemPut(DMEM *pDmem);


#endif //__MEMORY_H__

這里的代碼比較簡單,也是常規的寫法,重點是要理解結構體成員的含義。

源文件memory.c

源文件主要就是實現內存管理的函數,源碼比較多,這里才分為三部分。 1、相關的定義

#include "memory.h"


#define DMEM_BLOCK_SIZE         256      //內存塊大小為128字節
#define DMEM_BLOCK_NUM          20       //內存塊個數為40個
#defineDMEM_TOTAL_SIZE(DMEM_BLOCK_SIZE*DMEM_BLOCK_NUM) //內存總大小


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;       //使用狀態
    uint16_t         blk_s;      //起始塊序號
    uint16_t         blk_num;    //塊個數
}DMEM_APPLY;


typedef struct
{
    DMEM_USED_ITEM  tb_blk[DMEM_BLOCK_NUM];
    DMEM            tb_user[DMEM_BLOCK_NUM];        //用戶申請內存信息
    DMEM_APPLY      tb_apply[DMEM_BLOCK_NUM];       //系統分配內存信息
    uint16_t        apply_num;      //內存申請表占用數目
    uint16_t        blk_num;        //內存塊占用數目
}DMEM_STATE;

2、內存分配函數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;


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


    //計算所需連續塊的個數
    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];                    //用戶表對應找到
            user->tb = loop;                                //申請表編號記錄
            user->size = blk_num_want * DMEM_BLOCK_SIZE;    //分配大小計算
            break;
        }
    }


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


    //尋找連續內存塊
    for(loop = 0; loop < DMEM_BLOCK_NUM; loop++)
    {
        if(DMEMS.tb_blk[loop] == DMEM_FREE)
        {//找到第一個空閑內存塊
            for(find = 1; (find < blk_num_want) && (loop + find < DMEM_BLOCK_NUM); find ++)
            {//找到下一個空閑內存塊
                if(DMEMS.tb_blk[loop + find] != DMEM_FREE)
                {//發現已使用內存塊
                    break;
                }
            }
            if(find >= blk_num_want)
            {//尋找到的空閑內存塊數目已經夠用
                user->addr = DMEMORY + loop * DMEM_BLOCK_SIZE;  //計算申請到的內存的地址
                apply->blk_s = loop;                            //記錄申請到的內存塊首序號
                apply->blk_num = blk_num_want;                  //記錄申請到的內存塊數目
                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
            {//尋找到的空閑內存塊不夠用,從下一個開始找
                loop += find;
            }
        }
    }


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


    //釋放內存空間
    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;
}
代碼中包含注釋,注釋描述的比較清楚,也比較容易理解。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6043

    文章

    44621

    瀏覽量

    638628
  • 內存
    +關注

    關注

    8

    文章

    3055

    瀏覽量

    74338
  • STM32
    +關注

    關注

    2272

    文章

    10924

    瀏覽量

    357610

原文標題:基于無操作系統的STM32內存管理模塊,附源碼

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

收藏 人收藏

    評論

    相關推薦

    51單片機多任務操作系統的原理與實現

    51單片機多任務操作系統的原理與實現,在51單片機上模擬操作系統
    發表于 02-28 15:09 ?16次下載

    單片機中嵌入操作系統有哪些優缺點

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

    一個基于操作系統STM32單片機單片機內存管理器

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

    ADXRS453-適用于單片機平臺的操作系統驅動程序

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

    ADXL362-適用于單片機平臺的操作系統驅動程序

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

    基于51單片機的圖書管理系統實現與設計(源碼)

    基于51單片機的圖書管理系統實現與設計(源碼)
    發表于 04-26 10:52 ?18次下載

    單片機編程和操作系統綜述

    本文分為兩部分——“單片機編程篇”和“操作系統篇”。單片機編程篇主要介紹單片機的各種編程結構,及其實現方法。是在假設已經可以驅動單片機和各個
    發表于 05-08 11:12 ?40次下載

    AD7780-適用于單片機平臺的操作系統驅動程序

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

    AD7193-適用于單片機平臺的操作系統驅動程序

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

    AD7091R-適用于單片機平臺的操作系統驅動程序

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

    AD7303-適用于單片機平臺的操作系統驅動程序

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

    AD7156-適用于單片機平臺的操作系統驅動程序

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

    華大單片機移植RTThread操作系統

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

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

    cpu224 stm32源碼,226 PLC STM32單片機源碼
    發表于 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>

    單片機操作系統有哪些

    單片機操作系統(RTOS)是一種專門設計用于單片機操作系統,它可以提供任務調度、內存管理、設備驅動等功能,幫助程序員更高效地開發嵌入式
    的頭像 發表于 12-08 16:18 ?5571次閱讀
    百家乐游戏网址| 皇冠博彩| 大发888开户注册| 大发888客户端 运行| 百家乐加牌规| 太阳城花园| 棋牌类单机游戏下载| 欢乐谷娱乐城开户| 洛浦县| 川宜百家乐官网破解版| 百家乐官网辅助分析软件| 赌百家乐官网怎样能赢| 百家乐官网强弱走势| 百家乐官网的方法和公式| 百家乐官网在线娱乐平台| 免费百家乐官网追号工具| 百家乐庄闲分布概率| 海立方百家乐的玩法技巧和规则| 大发888 dafa888| 牛牛现金棋牌| 线上百家乐官网网站| 百家乐官网德州扑克发牌盒| 百家乐现金投注信誉平台| 威尼斯人娱乐场地址| 盈禾娱乐| 百家乐官网推二八杠| 做生意的风水朝向| 好望角百家乐的玩法技巧和规则| 大发888娱乐城大发888达法8| 至棒娱乐备用| 百家乐官网在线赌场| 24山72向水口吉凶断| 新东方百家乐娱乐城| 博彩娱乐场| 香港六合彩公司| 策勒县| 康莱德百家乐官网的玩法技巧和规则| 百家乐视频游戏中心| 大发888屡败屡战| 百家乐官网扑克发牌器| 百家乐必胜|