吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式系統的內存指針操作

電子工程師 ? 來源:張飛實戰電子 ? 作者:蔡琰老師 ? 2021-08-27 11:33 ? 次閱讀

嵌入式系統中,對內存地址的操作是一個重要的方面,從廣義上講,嵌入式系統的地址空間可以分成以下三種類型:

系統的內存

處理器內部的寄存器映射

處理器外部部件的內存映射

無論哪種內存,一般都映射到處理器的內存空間中。在x86系統中,分為內存和I/O映射兩種內存;在ARM體系中,全部的地址都在32位的內存空間中,所有的操作都是對32位地址空間內存的操作。

編程的角度看,嵌入式系統和PC系統的軟件設計的一個重要的區別即在于嵌入式系統更重視對硬件的操作。而對硬件的操作需要通過操作內部寄存器和外圍部件內存映射的地址實現,其實現方式都是通過對內存讀、寫兩種操作。

匯編語言中,各種處理器都有對內存的不同的尋址方式讀寫內存。在高級語言中,C語言是唯一可以進行內存操作的語言,C語言對內存的操作主要需要通過指針來完成。

1、使用指針操作內存

在C語言中,指針是一種非常重要的數據類型。使用指針變量可以表示各種數據結構,能很方便地使用數組和字符串,并能像匯編一樣處理內存地址。指針的本質就是一個地址,在32位的系統中,指針是一個32位的無符號整數。指針可以用一個變量來表示,變量的指針實際上就是變量的地址。存放變量地址的變量是指針變量。一個指針變量的值就是某個變量的地址或稱為某變量的指針。

一個簡單的指針應用如下所示:

int a;

int *p = &a;

這個例子表示,整型指針型變量p指向a的地址,此時對*p的操作等同于對a的操作。

使用指針可以指向一個變量,也可以指向一個由malloc函數分配的內存,例如:

void *p = malloc(1024);

系統分配1024字節的內存,然后讓變量p指向這塊內存,即p的值是這1024字節的連續內存的地址。在程序中就可以通過p來操作這塊內存區域。在內存使用完成后,需要使用free函數講內存釋放。

free(p);

在嵌入式系統中的程序開發中,指針的值除了以上的兩種形式(從系統內存分配或者指向變量)以外,還可以使用絕對的數值。這是由于在嵌入式系統中,外設寄存器和外部部件的內存映射的地址空間可能都是固定的,因此可以使用指針來處理他們。

例如,如果需要在地址0x0040處寫入一個字節的數據0xf0,可以使用如下的程序:

unsigned char *p = (unsigned char *)0x0040;

*p = 0xf0;

這個程序定義了一個指向0x0040地址的字節型的指針,然后向該地址寫入數據0xf0。

上面的程序等同于:

*(unsigned char *)0x0040 = 0xf0;

所以說不使用指針變量也可以對實際的地址操作。讀內存的程序與之類似,可以使用指針變量或者直接使用地址得到內存中的數據。

2、指針的類型

前面的程序在內存的一個指定的地址處寫入一個字節(8位)的數據。如果需要寫入兩個字節(16位)的數據,需要改變指針類型。例如:同樣向地址0x0040處寫入兩個字節的數據0x0f0f,需要使用如下的語句:

*(unsigned short*)0x0040 = 0x0f0f;

在這個語句中,使用unsigned short而不使用unsigned char,short在C語言中代表16位的整數。

如果寫入4個字節(32位)的數據,則需要使用一下的程序:

*(unsigned long*)0x0040 = 0xf0f0f0f0;

在這個語句中,使用unsigned long,long在C語言中代表32位的整數。

在32位的系統中,一般編譯器認為int代表是32位的整數,等同于long,所以習慣使用int代替long作為內存操作的數據類型。

注意:指針的類型決定了使用指針進行讀寫操作時每次讀寫字節的數目。

3、指針的增量

在對指針變量的操作中,有時需要對指針變量進行加減運算。例如:

unsigned char *p = (unsigned char *)0x0040;

P++;

*p = 0xf0;

這段程序的含義是向地址0x0041的字節處寫入數據0xf0。

指針加減運算的含義是:指針的單位增量(或減量)等于指針類型所占的內存量。

對指針進行增量操作的使用,增加的單位是以指針類型的大小:char類型的增量表示增加1字節的內存,short表示增加2字節的內存,long和int表示增加4字節的內存,這些工作是編譯器根據指針的類型自動完成的。

總結:對指針進行加減運算的時候,它的變化量與指針的類型有關。

4、指針的類型轉換

在C語言中,指針的類型可以在使用的時候進行轉換。指針的本質是一個地址,在32位系統中,指針就是一個32位無符號的整數。因此,各種指針都可以相互轉化,而且指針在轉換過程并沒有任何實質性的變化,只是告訴編譯器,目前的指針指向何種的內存區域。

在嵌入式系統中,處理器的片內設備一般都會映射到處理器的地址空間中。這些寄存器有可能是32位的,有可能只有8位,這時就需要使用C語言中不同類型的指針。

總結:指針的本質是一個無符號的整數,各個類型的指針都可以進行相互轉換。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19409

    瀏覽量

    231193
  • 嵌入式
    +關注

    關注

    5093

    文章

    19178

    瀏覽量

    307703
  • 內存
    +關注

    關注

    8

    文章

    3055

    瀏覽量

    74334

原文標題:聊一聊內存指針操作

文章出處:【微信號:CanaanTech,微信公眾號:嘉楠科技】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式主板的概述與發展

    未來發展趨勢進行深入探討。嵌入式主板的基本概念嵌入式主板是指為嵌入式系統設計的電路板,它通常集成了微處理器、內存、輸入輸出接口等關鍵組件。與
    的頭像 發表于 01-13 16:30 ?317次閱讀
    <b class='flag-5'>嵌入式</b>主板的概述與發展

    新手怎么學嵌入式?

    嵌入式系統的發展,嵌入式操作系統也變得越來越重要。學習嵌入式操作系統可以幫助你更好地管理
    發表于 12-12 10:51

    嵌入式系統開發與硬件的關系 嵌入式系統開發常見問題解決

    系統開發與硬件關系的幾個關鍵點: 硬件依賴性 :嵌入式系統的軟件必須能夠在特定的硬件上運行,這包括處理器、內存、輸入/輸出接口等。軟件必須能夠充分利用硬件的特性,同時繞過其限制。 資源
    的頭像 發表于 12-09 09:38 ?418次閱讀

    什么是嵌入式操作系統?

    什么是嵌入式操作系統? 想象一下,如果一個智能設備,比如你口袋里的智能手機,是一個有頭腦的機器人,那么嵌入式操作系統(Embedded Operating System,簡稱EOS)就
    發表于 11-08 15:07

    嵌入式 Linux 操作系統配置

    隨著物聯網(IoT)和智能設備的快速發展,嵌入式系統在各個領域扮演著越來越重要的角色。Linux因其開源、靈活和穩定的特性,成為嵌入式系統的首選操作
    的頭像 發表于 11-06 10:22 ?607次閱讀

    嵌入式系統的未來趨勢有哪些?

    嵌入式系統是指將我們的操作系統和功能軟件集成于計算機硬件系統之中,形成一個專用的計算機系統。那么嵌入式
    發表于 09-12 15:42

    嵌入式linux開發板怎么操作

    嵌入式Linux開發板是一種基于Linux操作系統嵌入式系統開發平臺。它通常包括一個處理器、內存、存儲器、輸入/輸出接口等硬件組件,以及一
    的頭像 發表于 09-02 09:09 ?467次閱讀

    嵌入式系統中的實時操作系統

    嵌入式RTOS是嵌入式應用程序運行、相互交互和與外界通信的底層軟件機制。在本節中,您將了解嵌入式軟件開發人員使用哪些流行RTOS以及它們運行的嵌入式硬件平臺。
    的頭像 發表于 08-20 11:28 ?549次閱讀

    RT-Thread出席第六屆中國嵌入式技術大會,共話嵌入式操作系統與智能工業

    第六屆中國嵌入式技術大會將于8月27-28日在深圳會展中心(福田)1號館舉行。本屆大會以“AI與開源,開啟嵌入式系統智能新時代”為主題,聚焦人工智能與嵌入式應用、
    的頭像 發表于 08-03 08:35 ?477次閱讀
    RT-Thread出席第六屆中國<b class='flag-5'>嵌入式</b>技術大會,共話<b class='flag-5'>嵌入式</b><b class='flag-5'>操作系統</b>與智能工業

    嵌入式系統怎么學?

    開發工具:熟悉常用的嵌入式系統開發工具,包括集成開發環境(IDE)、編譯器、調試器(如Keil、IAREmbedded Workbench、Eclipse)等。 5、實時操作系統(RTOS):了解實時
    發表于 07-02 10:10

    如何提升嵌入式編程能力?

    其他硬件的數據手冊,了解其特性和編程接口。 6. 學習低級編程:嵌入式編程常常需要直接與硬件交互,因此學習如何進行低級編程,如結構體、枚舉類型、指針操作、位操作
    發表于 06-21 10:01

    入門嵌入式系統這些知識你知道嗎?

    嵌入式系統是一種專用的計算機系統,作為裝置或設備的一部分。通常,嵌入式系統是一個控制程序存儲在ROM中的
    發表于 05-03 09:54 ?637次閱讀

    再談嵌入式實時操作系統

    由于嵌入式處理器早期功能單一且運算能力不高,嵌入式應用已不能滿足各個領域不斷增長的需求。嵌入式操作系統應運而生,嵌入式
    的頭像 發表于 04-09 17:27 ?856次閱讀
    再談<b class='flag-5'>嵌入式</b>實時<b class='flag-5'>操作系統</b>

    嵌入式fpga是什么意思

    嵌入式FPGA是指將FPGA技術集成到嵌入式系統中的一種解決方案。嵌入式系統是一種為特定應用而設計的計算機
    的頭像 發表于 03-15 14:29 ?1381次閱讀

    嵌入式系統發展前景?

    嵌入式系統發展前景? 嵌入式系統,從定義上來說,是一種專用的計算機系統,它被設計用來控制、監視或者幫助
    發表于 02-22 14:09
    大发888我爱好| 网上百家乐辅助软件| 普宁市| 连环百家乐的玩法技巧和规则 | 百家乐牌| 百家乐官网群博乐吧blb8v | 百家乐机器图片| 五星百家乐官网的玩法技巧和规则| 皇冠透注网| 百家乐是娱乐场| 在线百家乐娱乐| 玩百家乐官网保时捷娱乐城| 大发888娱乐场玩什么| 博盈百家乐游戏| 百家乐官网八卦投注法| 新奥博娱乐城体育投注| 百家乐顶尖高手| 百家乐官网桌布动物| 百家乐官网软件骗人吗| 千亿百家乐官网的玩法技巧和规则 | 百家乐是否有路子| 百家乐官网览| 环球国际娱乐城| 大发888真人娱乐城| 百家乐干洗店| 克拉克百家乐官网的玩法技巧和规则| 澳门百家乐官网必杀技| 九头鸟棋牌游戏中心| 利博百家乐破解| 网上百家乐真实吗| 百家乐官网破解仪| 百家乐官网娱乐全讯网| 六合彩报码聊天室| 哪家百家乐从哪而来| 百家乐官网几点不用补牌| 澳门百家乐官网破解方法| 枣庄市| 娱乐城源码| 战神百家乐娱乐城| 百家乐官网群| 里尼的百家乐官网策略|