實現的原理是將內存分成小的片段進行管理,代碼如下:
#define MEM_BLOCK_SIZE 4096 #define MEM_LARGE_BLOCK_THRESHOLD 40960 //>MEM_LARGE_BLOCK_THRESHOLD :requested size is large block #define MEM_BASE_ADDRESS (0x90000000) #define MEM_ALLOC_TABLE_FIRST_ENTRY 0 #define MAX_MEM_SIZE 7*1024*1024 #define MEM_ALLOC_TABLE_SIZE (MAX_MEM_SIZE/MEM_BLOCK_SIZE) static INT16 memory_map[MEM_ALLOC_TABLE_SIZE]; static char isMemoryManagementReady=0; void *memset(void *s, int c, size_t count) { char *xs = s; while (count--) *xs++ = c; return s; } INT32 ssd_mem_init(void) { memset(memory_map, 0, sizeof(memory_map)); isMemoryManagementReady=1; } INT16 ssd_mem_percentage_used() { int used=0; int i; for(i=0;i<MEM_ALLOC_TABLE_SIZE;i++) { if(memory_map[i]) { used++; } } return used*100/MEM_ALLOC_TABLE_SIZE; } //return -1:FAIL //>=0: return allocated address offset INT32 ssd_mem_malloc(UINT32 size) { int offset=0; int startEntry=MEM_ALLOC_TABLE_FIRST_ENTRY; int nmemb; int i; if(!isMemoryManagementReady) { ssd_mem_init(); } if(size==0) { return -1; } nmemb=size/MEM_BLOCK_SIZE; if(size%MEM_BLOCK_SIZE) { nmemb++; } if(size > MEM_LARGE_BLOCK_THRESHOLD) { for(offset=startEntry;offset<MEM_ALLOC_TABLE_SIZE-nmemb;offset++) { if(!memory_map[offset]) { int vacantSize=0; for(vacantSize=0;vacantSize<nmemb && !memory_map[offset+vacantSize];vacantSize++); if(vacantSize==nmemb) { for(i=0;i<nmemb;i++) { memory_map[offset+i]=nmemb; } return (offset*MEM_BLOCK_SIZE); } } } } else { for(offset=MEM_ALLOC_TABLE_SIZE-1;offset>=0;offset--) { if(!memory_map[offset] && ((offset+nmemb)<=MEM_ALLOC_TABLE_SIZE))//search start of vacant block { int vacantSize=0; for(vacantSize=0;vacantSize<nmemb && !memory_map[offset+vacantSize];vacantSize++); if(vacantSize==nmemb) { for(i=0;i<nmemb;i++) { memory_map[offset+i]=nmemb; } return (offset*MEM_BLOCK_SIZE); } } } } puts("malloc size erorr="); putInt32(size); return -1; } //return 0:OK //return 1:Out of bound INT32 ssd_mem_free(INT32 offset) { int i; if(!isMemoryManagementReady) { ssd_mem_init(); return 1; } if(offset<MAX_MEM_SIZE) { int index=offset/MEM_BLOCK_SIZE; int nmemb=memory_map[index]; for(i=0;i<nmemb;i++) { memory_map[index+i]=0; } return 0; } else { return 1;//out of bound } } void free(void *ptr) { if(ptr==NULL) return; INT32 offset; offset=ptr-MEM_BASE_ADDRESS; ssd_mem_free(offset); } void * malloc(UINT32 size) { INT32 offset; offset=ssd_mem_malloc(size); if(offset==-1) { return NULL; } else return MEM_BASE_ADDRESS+offset; } void *realloc(void *ptr,UINT32 size) { INT32 offset; offset=ssd_mem_malloc(size); if(offset==-1) { puts("realloc error/n"); return NULL; } else { memcpy((void*)(MEM_BASE_ADDRESS+offset),ptr,size); free(ptr); return MEM_BASE_ADDRESS+offset; } }
1 電阻 色環電阻:色環實際上是早期爲了幫助人們分辨不同阻值而設定的標準。 前兩個色環正常讀數。比如 棕黑金金 棕黑就是 10 黑,棕,紅,橙,黃,綠,藍,紫,灰,白, 金, 銀 0, 1, 2, 3, 4, 5, 6, 7,
1.接線 下載器 單片機 5v 端 VCC 端 3.3v 備用 GND GND TXD RXD RXD TXD 注意,TXD 、RXD 是反接。生成好.hex文件之後,先點下載,再上電。
一般來說,同一個波特率可以對應多組參數,但是要讓通信更穩定,則需要選擇採樣點儘量靠近CIA推薦值的那一組 CIA推薦採樣點 波特率 採樣點【sample point】 <=500K 87.5% >500K 80%
文章目錄IIC簡介IIC協議空閒狀態起始信號與結束信號應答信號ACK數據有效性數據的傳送傳輸過程相關配置標題初始化IIC(這裏用IO口模擬)發送起始信號發送結束信號應答信號ACK接收ACK發送ACK發送一個字節例子 IIC簡介 I
文章目錄SPI介紹SPI內部結構簡明圖SPI接口框圖字節的輸送時鐘極性與相位SPI特徵從選擇(NSS)腳管理部分狀態標誌發送緩衝器空閒標誌(TXE)接收緩衝器非空(RXNE)忙(Busy)標誌配置過程相關結構體相關配置 SPI介紹
簡單起見只需要添加一行命令: 點擊魔法棒 -> User 把Run #1勾選上填入命令: C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o .\bin\application.bin .
//爲什麼講上面的呢因爲下面有GetSysTime_us函數, //返回結果值是value就是我們的記錄的時間 //看到1000你應該就明白了每1ms執行一次 u32 test_dT_1000hz[3],test_rT[6]; s
1.前言 這段時間畫了一塊STC的最小系統板,和別人的最小系統不一樣,我是有備而來。我是爲了做示波器才設計的板子。 但是畫板子的時候我爲了板子小巧精悍,我剔除了串口模塊(CH340,CP2102...),選擇了有ISP下載功能,並且滿足使
簡介 小車的動力部分由4個帶減速箱的電機,和兩個L298N電機驅動模塊組成。 通過STM32核心板控制電機驅動模塊,JDY-31藍牙模塊與手機通訊。 總共三塊電池,一塊專門給單片機供電,另外兩塊串聯在一起同時給電機驅動模塊供電
第十一屆藍橋杯 單片機設計與開發 省賽 在昨天舉辦了第一波11屆藍橋杯比賽,第2波大概在10月份左右,看了看比賽題目,這次題目對於我來說,程序設計題簡單,客觀題全靠蒙! 本次比賽涉及: 1.數碼管顯示 2.矩陣按鍵 3.AD
13.4 C語言程序的運行 在嵌入式系統中,程序最終是要放置在內存中運行的,程序的幾個段,最終會轉化爲內存中的幾個區域。C語言可執行程序的內存佈局如圖13-5所示。 圖13-5 C語言可執行程序的內存佈局 在內存中,從低地址到高地址
UART作爲硬件來看,它是通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),是電腦硬件的一部分,將資料由串行傳輸(Serial communication)與平行傳輸(P
脈衝寬度調製模式可以產生一個由TIMx_ARR(自動裝載寄存器)寄存器確定頻率、由TIMx_CCRx(捕獲/比較寄存器)寄存器確定佔空比的信號。 在TIMx_CCMRx(捕獲/比較模式寄存器)寄存器中的OCxM位寫入’110’(
IC: MS8003 MS8005 1T 8051指令流水線結構8位單片機, RAM:OTP 16K 32K (ATP,MTP) 晶振:內部16MHz,40KHz,外部2-16MHz 時鐘源 和 外部諧振器 內部構成:中斷源、時鐘
IC: MS8003 MS8005 1T 8051指令流水線結構8位單片機, RAM:OTP 16K 32K (ATP,MTP) 晶振