色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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


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

    關注

    6035

    文章

    44554

    瀏覽量

    634642
  • 內存
    +關注

    關注

    8

    文章

    3019

    瀏覽量

    74003
  • STM32
    +關注

    關注

    2270

    文章

    10895

    瀏覽量

    355740

原文標題:基于無操作系統的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 ?2541次閱讀
    一個基于<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 ?76次下載
    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 ?5196次閱讀
    主站蜘蛛池模板: 成人短片迅雷下载| 美美哒免费影视8| 久久精品国产久精国产果冻传媒| 麻豆AV无码蜜臀AV色哟| 入禽太深免费高清在线观看5| 免费看到湿的小黄文软件APP| 美女被艹网站| 沈阳熟女露脸对白视频| 一本色道久久综合亚洲精品| 亚洲日韩欧美国产专区| 亚洲字幕在线观看| 被窝伦理午夜电影网| 精品无码乱码AV| 日本艳妓BBW高潮一19| 一个人看的HD免费高清视频| 大伊人青草狠狠久久| 久久亚洲国产中文字幕| 欧美丰满白嫩bbxx| 亚洲激情一区| 成人国产在线视频| 啦啦啦视频在线观看WWW| 无止侵犯高H1V3无止侵犯| 97人人添人人澡人人澡人人澡| 99国产精品| 国精产品一区二区三区| 久久国产乱子伦免费精品| 三级黄色高清视频| 2022国产91精品久久久久久| 国产中文在线| 色AV色婷婷66人妻久久久| 456亚洲人成在线播放网站| 国产综合欧美区在线| 日韩精品真人荷官无码| 97无码欧美熟妇人妻蜜桃天美| 嗨嗨快播电影| 漂亮的保姆3中文版完整版| 99国产精品| 韩日午夜在线资源一区二区| 精品亚洲午夜久久久久| 熟女人妻AV五十路六十路| 99综合之综合久久伊人|