C語言陣列賦值一例

2021-06-20 17:18:07 字數 1167 閱讀 8808

在移植核心時,發現乙個驅動使用陣列十分巧妙。

一般地,操作cpu某一外設寄存,不是直接使用完整的位址,而是通過相對位址來訪問。比如,訪問定時器,首先參考手冊定義好定時器基位址,然後再定義暫存器(如控制暫存器、讀資料暫存器等)對於定時器基位址的偏移位址。在使用時,一般都是使用偏移位址的,這樣十分方便、快捷。如果有

七、八個定時器,只需要定義好乙個基位址陣列、乙個偏移位址陣列,通過不同的序號就能訪問不同的位址。

本文的例子是從驅動中抽象出來的。乙個晶元平台系列中,對於特定外設,大部分的位址是相同的,但還是有個別不同,為了適應不同的晶元,**也要做些處理。比如,這個系列中有十個暫存器,但另乙個系統只有五個,其中大部分是共用的,為了共用**,把所有的暫存器用列舉型別對乙個陣列進行訪問,從而得到實際的偏移位址。

這裡的陣列賦值形式是我之前沒見過,下面的例子中foo_regs陣列,如果轉化成實際值,變成:

static const u32 foo_regs = ;

這種賦值的好處在於,可以根據不同的情況使用不同的下標、不同的值。比如,同樣是控制暫存器foo_ctrl_reg,有的平台是0x3c,有的是0x3f,這樣就可以通過不同的陣列區別開來,而對外的訪問介面,可以做到統一。

完整示例**如下:

#include

#include

#include

#define u32 unsigned int

enum ;

static const u32 foo_regs = ;

static const u32 bar_regs = ;

#define foo_start               (1 << 0)

#define foo_stop               (1 << 1)

static u32 foo_read_reg(unsigned int timer, u32 reg)

static u32 foo_write_reg(unsigned int timer, u32 reg, u32 value)

int main(void)

執行結果:

3: 80084048

3: 8008404f

從這裡學習到乙個陣列的賦值的方法,即實際賦值可以按不同的順序(只要是合法的下標),而不是僅限於從0~n這樣的順序去賦值。

李遲記於2023年2月28日

go語言爬蟲一例

最近在學go,以前都是用python爬蟲,這次試一下用go寫。和第乙個程式要寫hello world一樣,我們來爬個豆瓣前250電影 首先上碼 package main import fmt goquery strconv func main 結果 1 肖申克的救贖 2 霸王別姬 3 這個殺手不太冷...

c語言陣列賦值

最近在學c語言,把給陣列賦值的方式總結一下 1 利用malloc include include void main int a a int malloc 2 sizeof int int i 0 int j 1 a 0 i a 1 j int times for times 0 times 2 直...

Java 模仿 C 字典 一例

list orderstatuslist new arraylist orderstatuslist.add new abstractmap.entry 1 已下單 orderstatuslist.add new abstractmap.entry 2 已分配客服 orderstatuslist.a...