應用C語言的 at 函式

2022-06-17 15:18:10 字數 1578 閱讀 3794

平常很少接觸微控制器程式,都是系統的應用程式,windows 、linux下一些應用程式

c語言本身沒啥問題,本身就跟c++風格接近,linux下很多**也用c來實現

但基本上用不到一些特殊函式,例如 at 函式

先來了解下 at是幹嘛用的

絕對定位,可以把變數或函式絕對定位到flash中,或者定位到ram

是乙個功能比較底層的操作,往往要跟__attribute__ 一起使用。

例如:uint8_t bymemp[15000u] __attribute__((at(0xc1405208)))

就是說把 bymemp 強制定位到 0xc1405208 這個位址上面去。

如果僅僅是 uint8_t bymemp[15000u]; 那麼意味著是堆疊裡進行分配,對於微控制器而言,一下子分配那麼多,就要考慮是否不夠用等情況

如果用at指令,就可以把位址定位到其他地方去,比如外部sdram上面,這樣就不用占用內部的堆疊。

以上大概 可以說明 at 的作用了。

那麼,再來看下map資訊(不知道平時有沒有關注過這個檔案)用at過的地方map裡面都能夠看到具體資訊:

從map裡也可以看到 bymemp  是被對映到 0xc1405208 這個位址上,大小也有顯示

這些資訊都是存放在

image symbol table

這裡的 local symbols 裡面

問:如果連續at有重疊會怎麼樣?

例如:uint8_t bymemp[15000u] __attribute__((at(0xc1405208)))

uint8_t bymemptest[15000u] __attribute__((at(0xc1405308)))

此時編譯的時候,就會報錯:

這個報錯很好理解

__attribute__( at(絕對位址) )的作用分兩個,乙個是絕對定位到flash,另個一是絕對定位到ram。

1、定位到flash中

一般用於固化的資訊,如出廠設定的引數,上位機配置的引數,id卡的id號,flash標記等等

const u16 gflashdefvalue[512] __attribute__((at(0x0800f000))) = ;//定位在flash中,其他flash補充為00

const u16 gflashdata__attribute__((at(0x0800f000))) = 0xffff;

2、定位到ram中

一般用於資料量比較大的快取,如串列埠的接收快取,再就是某個位置的特定變數

u8 usart2_rx_buf[usart2_rec_len] __attribute__ ((at(0x20001000)));//接收緩衝,最大usart_rec_len個位元組,起始位址為0x20001000.

注意:1、絕對定位不能在函式中定義,區域性變數是定義在棧區的,棧區由mdk自動分配、釋放,不能定義為絕對位址,只能放在函式外定義。

2、定義的長度不能超過棧或flash的大小,否則,造成棧、flash溢位。

C語言函式的應用

一.函式的概念 1.將一些大的或者是功能相同的程式分割成乙個個程式塊,在使用的時候可以直接呼叫,這種程式塊就稱為函式.2.函式的作用 函書是構成程式的基本單元.函式的使用可以省去重複 的編寫.函式使得程式更加模組化,從而有利於程式的閱讀.修改和完善.3.函式的分類 1 按函式定義的角度分為 庫函式 ...

c語言qsort函式的應用

qsort函式 全稱quicksort 它是ansi c標準中提供的,其宣告在stdlib.h檔案中,是根據二分法寫的,其時間複雜度為n log n 功能 對乙個陣列進行排序 任意型別陣列 函式定義 void qsort void base,size t num,size t width,int c...

C語言中qsort函式的應用

qsort函式包含在的標頭檔案裡,本文中排序都是採用的從小到大排序 int num 100 int cmp const void a const void b qsort num,100,sizeof num 0 cmp char word 100 int cmp const void a cons...