📄 lib_mem.lst
字号:
612 * | (see Note #2b1) | | | | | | | H | | |
613 * | | |<-------| |<-------| |<-------| E |<-------| |
614 * | | | | | ^ | | | A | | |
615 * | | | | | | | | | P | | |
616 * | | | | | | | | | | | |
617 * | ------- ------- | ------- ------- -------
618 * | | ^ | | ^
619 * | | | SegPrevPtr | |
620 * | v | (see Note #2b2) v |
621 * | ------- -------
622 * | | | |
623 * Memory Pools | | | |
624 * (see Note #2a2) | | | |
625 * | | | |
626 * | | | | |
627 * | ------- -------
628 * | | ^
629 * | PoolNextPtr ---> | | <--- PoolPrevPtr
630 * | (see Note #2b3) v | (see Note #2b3)
631 * | -------
632 * | | |
633 * | | |
634 * | | |
635 * | | |
636 * v | |
637 * --- -------
638 *
639 *$PAGE*
640 * Argument(s) : pmem_pool Pointer to a memory pool structure to create (see Note #3).
641 *
642 * pmem_base_addr Memory pool base address :
643 *
644 * (a) Null address Memory pool allocated from general-purpose heap.
645 * (b) Non-null address Memory pool allocated from dedicated memory
646 * specified by its base address.
647 *
648 * mem_size Size of memory pool segment (in octets).
649 *
650 * blk_nbr Number of memory pool blocks to initialize.
651 *
652 * blk_size Size of memory pool blocks to initialize (in octets).
653 *
654 * blk_align Alignment of memory pool blocks to initialize (in octets).
655 *
656 * poctets_reqd Pointer to a variable to ... :
657 *
658 * (a) Return the number of octets required to successfully
659 * allocate the memory pool, if any errors;
660 * (b) Return 0, otherwise.
661 *
662 * perr Pointer to variable that will receive the return error code from this function :
663 *
664 * LIB_MEM_ERR_NONE Memory pool successfully created.
665 * LIB_MEM_ERR_NULL_PTR Argument 'pmem_pool' passed a NULL
666 * pointer.
667 *
668 * LIB_MEM_ERR_HEAP_NOT_FOUND Heap segment NOT found.
669 * LIB_MEM_ERR_HEAP_EMPTY Heap segment empty; NO available memory
670 * from heap.
671 * LIB_MEM_ERR_SEG_EMPTY Memory segment empty; NO available memory
672 * from segment for memory pools.
673 *
674 * LIB_MEM_ERR_INVALID_SEG_SIZE Invalid memory segment size.
675 * LIB_MEM_ERR_INVALID_SEG_OVERLAP Memory segment overlaps other memory
676 * segment(s) in memory pool table.
677 * LIB_MEM_ERR_INVALID_BLK_NBR Invalid memory pool number of blocks.
678 * LIB_MEM_ERR_INVALID_BLK_SIZE Invalid memory pool block size.
679 *
680 * Return(s) : none.
681 *
682 * Caller(s) : Application.
683 *
684 * Note(s) : (3) 'pmem_pool' MUST be passed a pointer to the address of a declared 'MEM_POOL' variable.
685 *
686 * (4) Pointers to variables that return values MUST be initialized to return PRIOR to all
687 * other validation or function handling in case of any error(s).
688 *********************************************************************************************************
689 */
690
691 #if (LIB_MEM_CFG_POOL_EN == DEF_ENABLED)
692 void Mem_PoolCreate (MEM_POOL *pmem_pool,
693 void *pmem_base_addr,
694 CPU_SIZE_T mem_size,
695 CPU_SIZE_T blk_nbr,
696 CPU_SIZE_T blk_size,
697 CPU_SIZE_T blk_align,
698 CPU_SIZE_T *poctets_reqd,
699 LIB_ERR *perr)
700 {
701 #if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
702 CPU_SR cpu_sr;
703 #endif
704 MEM_POOL *pmem_pool_heap;
705 MEM_POOL *pmem_pool_prev;
706 MEM_POOL *pmem_pool_next;
707 MEM_POOL *pmem_pool_blk;
708 void **ppool_ptr;
709 void *pmem_blk;
710 CPU_INT08U *pmem_addr_ptrs;
711 CPU_INT08U *pmem_addr_pool;
712 CPU_INT08U *pmem_base_addr_start;
713 CPU_INT08U *pmem_base_addr_end;
714 CPU_INT08U *pmem_seg_addr_start;
715 CPU_INT08U *pmem_seg_addr_end;
716 CPU_SIZE_T size_tot;
717 CPU_SIZE_T size_tot_ptrs;
718 CPU_SIZE_T size_tot_pool;
719 CPU_SIZE_T size_rem;
720 CPU_SIZE_T size_pool_ptrs;
721 CPU_SIZE_T i;
722
723
724 /*$PAGE*/
725 /* Init octets req'd for err (see Note #4). */
726 if (poctets_reqd != (CPU_SIZE_T *)0) {
727 *poctets_reqd = (CPU_SIZE_T )0;
728 }
729
730
731 /* -------------- VALIDATE MEM POOL --------------- */
732 if (pmem_pool != (MEM_POOL *)0) {
733 /* Init mem pool for err (see Note #4). */
734 pmem_pool->Type = (LIB_MEM_TYPE)LIB_MEM_TYPE_NONE;
735 pmem_pool->SegPrevPtr = (MEM_POOL *)0;
736 pmem_pool->SegNextPtr = (MEM_POOL *)0;
737 pmem_pool->PoolPrevPtr = (MEM_POOL *)0;
738 pmem_pool->PoolNextPtr = (MEM_POOL *)0;
739 pmem_pool->PoolAddrStart = (void *)0;
740 pmem_pool->PoolAddrEnd = (void *)0;
741 pmem_pool->PoolPtrs = (void **)0;
742 pmem_pool->PoolSize = (CPU_SIZE_T )0;
743 pmem_pool->BlkAlign = (CPU_SIZE_T )0;
744 pmem_pool->BlkSize = (CPU_SIZE_T )0;
745 pmem_pool->BlkNbr = (CPU_SIZE_T )0;
746 pmem_pool->BlkIx = (MEM_POOL_IX )0;
747 pmem_pool->SegAddr = (void *)0;
748 pmem_pool->SegAddrNextAvail = (void *)0;
749 pmem_pool->SegSizeTot = (CPU_SIZE_T )0;
750 pmem_pool->SegSizeRem = (CPU_SIZE_T )0;
751
752 } else {
753 *perr = LIB_MEM_ERR_NULL_PTR;
754 return;
755 }
756
757
758 if (pmem_base_addr != (void *)0) {
759 if (mem_size < 1) {
760 *perr = LIB_MEM_ERR_INVALID_SEG_SIZE;
761 return;
762 }
763 }
764
765 if (blk_nbr < 1) {
766 *perr = LIB_MEM_ERR_INVALID_BLK_NBR;
767 return;
768 }
769
770 if (blk_size < 1) {
771 *perr = LIB_MEM_ERR_INVALID_BLK_SIZE;
772 return;
773 }
774
775 if (blk_align < 1) {
776 blk_align = 1;
777 }
778
779 /* ------------ VALIDATE MEM POOL TBL ------------- */
780 if (Mem_PoolTbl == (MEM_POOL *)0) {
781 *perr = LIB_MEM_ERR_HEAP_NOT_FOUND;
782 return;
783 }
784
785
786
787 /*$PAGE*/
788 /* ---------------- CREATE MEM POOL --------------- */
789 pmem_pool_heap = (MEM_POOL *)&Mem_PoolHeap;
790
791 CPU_CRITICAL_ENTER();
792
793 if (pmem_base_addr == (void *)0) { /* If no base addr, cfg mem pool from heap. */
794 pmem_pool_blk = pmem_pool_heap;
795 pmem_pool_prev = pmem_pool_heap;
796 pmem_pool_next = pmem_pool_heap;
797
798 /* Calc tot mem size for mem pool ptrs. */
799 pmem_addr_ptrs = (CPU_INT08U *)pmem_pool_heap->SegAddrNextAvail;
800 size_tot_ptrs = Mem_PoolSegCalcTotSize((void *)pmem_addr_ptrs,
801 (CPU_SIZE_T)blk_nbr,
802 (CPU_SIZE_T)sizeof(void *),
803 (CPU_SIZE_T)sizeof(void *));
804 /* Calc tot mem size for mem blks. */
805 pmem_addr_pool = pmem_addr_ptrs + size_tot_ptrs; /* Adj next avail addr for mem pool blks. */
806 size_tot_pool = Mem_PoolSegCalcTotSize((void *)pmem_addr_pool,
807 (CPU_SIZE_T)blk_nbr,
808 (CPU_SIZE_T)blk_size,
809 (CPU_SIZE_T)blk_align);
810
811 size_tot = size_tot_ptrs + size_tot_pool;
812 size_rem = pmem_pool_heap->SegSizeRem;
813
814 if (size_tot > size_rem) {
815 CPU_CRITICAL_EXIT();
816 *perr = LIB_MEM_ERR_HE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -