s3c2440裸機 清bss原理及實現

2022-06-16 06:24:08 字數 1011 閱讀 7152

我們先舉個例子:

#include "s3c2440_soc.h"

#include "uart.h"

char g_char = 'a'; //.data

char g_char3 = 'a';

const char g_char2 = 'b'; //.rodata

int g_a = 0; //bss

int g_b; //bss

int main(void)

return 0;

}

我們把程式燒進去,然後列印g_a,但是發現g_a這個值並不是0,而是乙個隨機值。為什麼呢?

這個時候我們做完了重定位,把**copy到了sdram上,然後sdram上緊接著的位址就是.bss的基位址了,這時候bss段的這塊記憶體沒有經過任何處理,所以是隨機的。

那麼我們重定位完**後需要進行清除sdram上.bss段的資料,因為我們知道bss是未初始化和初始值為0的全域性變數。

sections

. = align(4);

.rodata :

. = align(4);

.data :

. = align(4);

__bss_start = .;

.bss :

_end = .;

}

再編寫start.s,清除bss段的**如下:

/* 清除bss段 */

ldr r1, =__bss_start

ldr r2, =_end

mov r3, #0

clean:

strb r3, [r1]

add r1, r1, #1

cmp r1, r2

ble clean

bl main

halt:

b halt

我們把程式再燒進去,然後列印g_a,但是發現g_a的值是0了。本質上就是對重定位後的bss段資料清0.

s3c2440裸機串列埠UART

串列埠收發資料 115200,8n1。每一位的時間是t 1 115200。傳輸乙個位元組需要10位 包括起始位1位,資料位8位,停止位1位,需要的時間是t 10 115200。每秒傳輸的的位元組數 1 t 115200 10 11520byte。回環模式 一發出資料就立刻收到,用於測試。main.c...

S3C2440裸機 時鐘

目錄 1.s3c2440的時鐘體系 1.1.s3c2440結構框圖 1.2 s3c2440時鐘樹 1.3 s3c2440上電順序 2.暫存器配置 2.1clkdivn暫存器 2.2mpllcon暫存器 2.3設定cpu為非同步模式 3.程式設計 4.實驗 從上面的結構圖可以看出,s3c2440主要分...

s3c2440裸機 ADC程式設計

模數轉換器即a d轉換器,或簡稱adc,通常是指乙個將模擬訊號轉變為數碼訊號的電子元件。如圖,是把可變電阻上的電壓值變換的模擬訊號通過adc轉換,輸出數碼訊號。對於數碼訊號我們需要得到它的2個屬性 1.轉換精度 用多少位來儲存這個資料 假如是10 bit 那麼最大值0b111111111對應3.3v...