你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于无操作系统的STM32单片机开发的强大代码

[复制链接]
gaosmile 发布时间:2020-12-3 22:21

本代码基于无操作系统的STM32单片机开发,功能强大,可申请到地址空间连续的不同大小的内存空间,且用户接口简单,使用方便。直接贴代码:

memory.h:

#ifndef __MEMORY_H__' W& k0 i1 z7 B3 j
#define __MEMORY_H__1 O, R. u9 ^  i- [# p  G
+ c* j- W0 f- I$ D- u$ M4 ~
#include "stdio.h"
7 f" F. Z: S2 G9 Z#include "string.h"
0 w6 \$ C& W$ L8 A#include "includes.h"* U/ ]6 q) Q. V* m
//用户使用
, y" ]+ B# ?% K. b- Ltypedef struct" v  n9 a% J8 C- ^
{
  a. H1 Q% _* H1 K; o    void    *addr;      //申请到的内存的起始地址
$ o. [: R' @, H" d    uint32_t size;      //申请到的内存的大小,按照块大小分配,大于等于申请大小: z, T: k+ b- J% y8 v" I# j
    uint16_t  tb;       //申请表序号,申请内存时分配,释放内存时使用,用户不使用
0 q" R& B; H- T# t# c! B, \}DMEM;5 ]  D# h# k! D& o5 g  T$ w

6 `$ U1 e; h/ i6 Q; _//若返回空,则申请失败
3 Z: T4 U" [; B" ~: ~DMEM *DynMemGet(uint32_t size);
5 j& n; k8 P4 I- n. u$ Q2 |void DynMemPut(DMEM *pDmem);
. R" g2 Q3 }. u3 f & l- r- s; A- o' _+ F; W
#endif //__MEMORY_H__. o  Y- ~. n( X, y6 y7 |, t
" p* e1 [) J- H) z

memory.c:

#include "memory.h"! N" l& X8 z- b9 I; _

# O  Q, x# z( `3 T) p/ |#define DMEM_BLOCK_SIZE         256      //内存块大小为128字节- f0 M1 V) \8 G/ p7 L
#define DMEM_BLOCK_NUM          20       //内存块个数为40个
: @1 o1 U$ ]" w# H! }5 s7 `#define DMEM_TOTAL_SIZE         (DMEM_BLOCK_SIZE*DMEM_BLOCK_NUM)    //内存总大小* J1 m' p: l- H: `- Y
5 p5 ?' _4 w' W# h; X! l0 u
typedef enum
% B; |# D& A$ t' |7 w( S{
) H) K9 Z# p5 i* k    DMEM_FREE   = 0,
) q# d- ~/ r+ S* k' N+ }3 ^    DMEM_USED   = 1,' a6 e3 T, G# f6 F$ ~# k
}DMEM_USED_ITEM;
8 K' R3 e7 Q/ ^2 w + U' X' f8 `  y" X, O, M; y
typedef struct* ^0 q0 P( Q) x9 z# Z- p: J
{3 |' t1 I( @7 U+ ?' v
    DMEM_USED_ITEM   used;       //使用状态9 t- s  c# F5 @) g! u( E4 B7 d
    uint16_t         blk_s;      //起始块序号; I2 O% Q# E1 O4 }- |' L( Y
    uint16_t         blk_num;    //块个数
4 H  M& U( ]% A9 R' G}DMEM_APPLY;( R+ g4 X; d* n, j( _  }# e7 m. H
7 H7 J' d! i2 _) }0 _7 }
typedef struct
% f. W% Z6 f" W7 \6 P8 @9 d& g' v/ t{
+ x, i) m) @, {, T    DMEM_USED_ITEM  tb_blk[DMEM_BLOCK_NUM];3 L8 H8 q$ j0 m+ \
    DMEM            tb_user[DMEM_BLOCK_NUM];        //用户申请内存信息
3 r% d0 ?' h; ^2 M& u& U; ]# r" x8 x0 C    DMEM_APPLY      tb_apply[DMEM_BLOCK_NUM];       //系统分配内存信息
- R* W* _+ Y) |3 N    uint16_t        apply_num;      //内存申请表占用数目
! |# b" I1 |  w5 f; i; B    uint16_t        blk_num;        //内存块占用数目+ Z' d- ?6 s2 e3 S0 g$ N3 e
}DMEM_STATE;
8 \2 o! P; B4 S; J" w3 n
. X& L5 p, _. a" fstatic uint8_t DMEMORY[DMEM_TOTAL_SIZE];
% o7 }) |/ X7 q: f+ Fstatic DMEM_STATE DMEMS = {0};
. w- l1 v3 L# P! {% g* ]) F) G* O" c6 H0 \& D! g/ H7 {8 e
DMEM *DynMemGet(uint32_t size). N6 R* x6 Z* W- N* ^; n- ?5 y
{
1 J, s9 X: e" ]6 Y, A: h    uint16_t loop = 0;6 `( w6 m5 q% A$ ?# A
    uint16_t find = 0;
/ N: f4 D6 D& ^: E! e1 O    uint16_t blk_num_want = 0;5 u# u) K# z: w1 Y% r- v4 g
    DMEM * user = NULL;
0 S" s: v8 m9 n& T. P) E    DMEM_APPLY *apply = NULL;
7 w$ ^. l! p% n, G0 a    . S# \2 G# x8 d" O- y% n
    //申请内存大小不能为0
8 M; f8 ?& E7 ]; ~! Y' g( L    if(size == 0)               {   return NULL;    }+ v! L! X; J6 M7 L* H
    //申请内存不可超过总内存大小: P8 V# V- J* j
    if(size > DMEM_TOTAL_SIZE)  {   return NULL;    }! U" Y" ~* D9 H+ Y- b
    //申请内存不可超过剩余内存大小% G" z( k  y* w
    if(size > (DMEM_BLOCK_NUM - DMEMS.blk_num) * DMEM_BLOCK_SIZE)   {   return NULL;    }
/ k* {( C& G' ]# s: I- T    //申请表必须有空余" e1 T. }7 A6 A
    if(DMEMS.apply_num >= DMEM_BLOCK_NUM)   {   return NULL;    }
0 q# h& g9 q' Q0 {    ! K$ i  r) W, W" f
    //计算所需连续块的个数
6 ?0 e! r* l$ k  q' q5 j* [6 g    blk_num_want = (size + DMEM_BLOCK_SIZE - 1) / DMEM_BLOCK_SIZE;5 m) K& Q& k+ a% W4 d, a* |, v
   
5 ?2 t7 b* \8 V8 P; L    //寻找申请表
, h( z- `% u1 i, p: l1 O  w    for(loop = 0; loop < DMEM_BLOCK_NUM; loop++)
/ I3 Y' ~/ u1 p, \, ?' W    {
: S9 m7 H% v% E  Q( d) k8 Q0 V& Z        if(DMEMS.tb_apply[loop].used == DMEM_FREE)
8 Y0 U* {1 X! p6 M9 b        {( r$ t# H5 I. v/ c% N1 o1 h. }1 f
            apply = &DMEMS.tb_apply[loop];                  //申请表已找到2 |7 L( G) }5 F8 C
            user = &DMEMS.tb_user[loop];                    //用户表对应找到3 X+ F. {3 U& i" q9 {5 r" n
            user->tb = loop;                                //申请表编号记录: n0 Z5 c' x) x9 g1 j( j+ s
            user->size = blk_num_want * DMEM_BLOCK_SIZE;    //分配大小计算
4 G- a) P( @* z( ?) h            break;
5 `6 \5 C$ O0 C8 A5 z        }) X6 l( @8 y* Z. f
    }  B) Q" |' P. v4 b7 w/ ^
   
: y! j# S, q2 t9 ?3 q  r    //没有找到可用申请表,理论上是不会出现此现象的,申请表剩余已在上面校验1 b* I$ I( z0 e  B! E2 g
    if(loop == DMEM_BLOCK_NUM)  {   return NULL;    }- X. f' U1 Z4 |. t
   
3 F. x, H- h  X$ i% r. k4 T' F. E    //寻找连续内存块1 v6 X! O. F0 C; i! `: ?- |1 W
    for(loop = 0; loop < DMEM_BLOCK_NUM; loop++)) |2 y4 S4 l- N7 S" S
    {
5 b, \4 S  d! l" A        if(DMEMS.tb_blk[loop] == DMEM_FREE)
; n# E7 L3 ]4 n* d2 @! I% _        {//找到第一个空闲内存块
/ B0 K# @% f% Z! G            for(find = 1; (find < blk_num_want) && (loop + find < DMEM_BLOCK_NUM); find ++)
2 a. m: U5 |9 `# j' s5 ^; b% K8 A            {//找到下一个空闲内存块6 j: M' m" j% x; ]* o6 a' v
                if(DMEMS.tb_blk[loop + find] != DMEM_FREE)
% c% c, B- p  f* D8 @, g                {//发现已使用内存块
/ h- {9 U5 p( w7 Q8 h7 E                    break;
; J  V7 p) u$ K) \3 Z) _( e/ y                }
9 B) ], g6 K- b1 L. b0 c            }  f" x: [& G( a5 w9 f( r& g
            if(find >= blk_num_want)8 _' F8 ?% f  g) ~
            {//寻找到的空闲内存块数目已经够用
, V$ _, E, s- ^7 n/ g1 B2 @* F                user->addr = DMEMORY + loop * DMEM_BLOCK_SIZE;  //计算申请到的内存的地址
6 o# H) E  {  g7 Z                apply->blk_s = loop;                            //记录申请到的内存块首序号7 B  J; h$ C' A5 W$ L6 e1 }: E
                apply->blk_num = blk_num_want;                  //记录申请到的内存块数目
8 e$ I, P; F, K1 A; N; X' B: S                for(find = 0 ; find < apply->blk_num; find++)
' _, n9 A" S8 E  q# i                {# ~" E. ?" R4 @3 ]2 [! t" h
                    DMEMS.tb_blk[loop + find] = DMEM_USED;
) x& Z: R( T) }2 j5 d                }
+ Y. q0 ^" I8 ^& f                apply->used = DMEM_USED;                        //标记申请表已使用8 Y# y; ]: G- p9 O( x* }5 p
                DMEMS.apply_num += 1;
1 x1 X3 W6 Y- E, s                DMEMS.blk_num += blk_num_want;/ o7 l; x- i: N2 E/ q" J
               
( e5 ~/ j+ ~1 w( [; U2 h* o                return user;
8 x8 j/ G2 e. D6 S2 J: D# d+ e            }
8 ~. `4 Z* O" a# v# K            else
) ]7 d/ T+ j& V# [( C  Y            {//寻找到的空闲内存块不够用,从下一个开始找: [! K* N! N) C
                loop += find;$ W" }! F& x. k% n
            }$ M) z# k8 L- h. n: J( L! p( T
        }4 D3 K/ v" Q2 b& `
    }
5 y9 e3 @* I( q8 Z    6 r  i3 _9 ]$ ^. d
    //搜索整个内存块,未找到大小适合的空间$ U& X: c5 L+ m( Y& J4 B
    return NULL;" ]7 g& I0 v4 [+ K0 o5 V' A
}
/ g9 [) I4 Z+ s( L7 @
1 y  K" J! N3 M2 }5 K9 }6 Cvoid DynMemPut(DMEM *user): g+ T0 t" O0 _9 [, R5 V8 {$ O
{( G; r! ^& d3 N" Z* {: {) e. d, ]
    uint16_t loop = 0;
/ `+ C: S3 W: M. `+ S" u    //若参数为空,直接返回1 h: K8 I! Q0 r; w% {7 [$ ~. O! B
    if(NULL == user)    {   return; }
5 I2 H4 S* A/ S! \/ r' i   
: R" s' i' V( E1 U* l: C    //释放内存空间
' ^: F6 ?/ W# F8 s( o, a0 {    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++)" O% Z' R5 D/ q, J) G& X! A
    {
- ^3 q5 ]% x( X9 s5 O" z% T        DMEMS.tb_blk[loop] = DMEM_FREE;9 w9 j7 d. O& z: V/ i% p
        DMEMS.blk_num -= 1;7 D1 f' w6 e) C$ ]5 z
    }5 ?+ R& D# C+ t$ ]7 d1 R6 E
    //释放申请表* ]) B$ q$ e6 C) v& x$ Z& a
    DMEMS.tb_apply[user->tb].used = DMEM_FREE;
9 X5 v7 E+ e: v  H* W; A    DMEMS.apply_num -= 1;& r4 W& ~. g( ~+ o8 g$ G
}
1 t* V" _* @+ r7 |& ]; \$ h. e
赞 收藏 1 评论2 发布时间:2020-12-3 22:21

举报

2个回答
goyhuan 回答时间:2020-12-4 08:10:55
内存管理
kylixyao 回答时间:2020-12-4 10:53:46
不错!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版