0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式系統(tǒng)的內(nèi)存指針操作

電子工程師 ? 來源:張飛實(shí)戰(zhàn)電子 ? 作者:蔡琰老師 ? 2021-08-27 11:33 ? 次閱讀

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

系統(tǒng)的內(nèi)存

處理器內(nèi)部的寄存器映射

處理器外部部件的內(nèi)存映射

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

編程的角度看,嵌入式系統(tǒng)和PC系統(tǒng)的軟件設(shè)計(jì)的一個(gè)重要的區(qū)別即在于嵌入式系統(tǒng)更重視對硬件的操作。而對硬件的操作需要通過操作內(nèi)部寄存器和外圍部件內(nèi)存映射的地址實(shí)現(xiàn),其實(shí)現(xiàn)方式都是通過對內(nèi)存讀、寫兩種操作。

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

1、使用指針操作內(nèi)存

在C語言中,指針是一種非常重要的數(shù)據(jù)類型。使用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu),能很方便地使用數(shù)組和字符串,并能像匯編一樣處理內(nèi)存地址。指針的本質(zhì)就是一個(gè)地址,在32位的系統(tǒng)中,指針是一個(gè)32位的無符號(hào)整數(shù)。指針可以用一個(gè)變量來表示,變量的指針實(shí)際上就是變量的地址。存放變量地址的變量是指針變量。一個(gè)指針變量的值就是某個(gè)變量的地址或稱為某變量的指針。

一個(gè)簡單的指針應(yīng)用如下所示:

int a;

int *p = &a;

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

使用指針可以指向一個(gè)變量,也可以指向一個(gè)由malloc函數(shù)分配的內(nèi)存,例如:

void *p = malloc(1024);

系統(tǒng)分配1024字節(jié)的內(nèi)存,然后讓變量p指向這塊內(nèi)存,即p的值是這1024字節(jié)的連續(xù)內(nèi)存的地址。在程序中就可以通過p來操作這塊內(nèi)存區(qū)域。在內(nèi)存使用完成后,需要使用free函數(shù)講內(nèi)存釋放。

free(p);

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

例如,如果需要在地址0x0040處寫入一個(gè)字節(jié)的數(shù)據(jù)0xf0,可以使用如下的程序:

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

*p = 0xf0;

這個(gè)程序定義了一個(gè)指向0x0040地址的字節(jié)型的指針,然后向該地址寫入數(shù)據(jù)0xf0。

上面的程序等同于:

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

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

2、指針的類型

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

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

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

如果寫入4個(gè)字節(jié)(32位)的數(shù)據(jù),則需要使用一下的程序:

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

在這個(gè)語句中,使用unsigned long,long在C語言中代表32位的整數(shù)。

在32位的系統(tǒng)中,一般編譯器認(rèn)為int代表是32位的整數(shù),等同于long,所以習(xí)慣使用int代替long作為內(nèi)存操作的數(shù)據(jù)類型。

注意:指針的類型決定了使用指針進(jìn)行讀寫操作時(shí)每次讀寫字節(jié)的數(shù)目。

3、指針的增量

在對指針變量的操作中,有時(shí)需要對指針變量進(jìn)行加減運(yùn)算。例如:

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

P++;

*p = 0xf0;

這段程序的含義是向地址0x0041的字節(jié)處寫入數(shù)據(jù)0xf0。

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

對指針進(jìn)行增量操作的使用,增加的單位是以指針類型的大?。篶har類型的增量表示增加1字節(jié)的內(nèi)存,short表示增加2字節(jié)的內(nèi)存,long和int表示增加4字節(jié)的內(nèi)存,這些工作是編譯器根據(jù)指針的類型自動(dòng)完成的。

總結(jié):對指針進(jìn)行加減運(yùn)算的時(shí)候,它的變化量與指針的類型有關(guān)。

4、指針的類型轉(zhuǎn)換

在C語言中,指針的類型可以在使用的時(shí)候進(jìn)行轉(zhuǎn)換。指針的本質(zhì)是一個(gè)地址,在32位系統(tǒng)中,指針就是一個(gè)32位無符號(hào)的整數(shù)。因此,各種指針都可以相互轉(zhuǎn)化,而且指針在轉(zhuǎn)換過程并沒有任何實(shí)質(zhì)性的變化,只是告訴編譯器,目前的指針指向何種的內(nèi)存區(qū)域。

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

總結(jié):指針的本質(zhì)是一個(gè)無符號(hào)的整數(shù),各個(gè)類型的指針都可以進(jìn)行相互轉(zhuǎn)換。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19548

    瀏覽量

    231871
  • 嵌入式
    +關(guān)注

    關(guān)注

    5105

    文章

    19288

    瀏覽量

    310203
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3081

    瀏覽量

    74605

原文標(biāo)題:聊一聊內(nèi)存指針操作

文章出處:【微信號(hào):CanaanTech,微信公眾號(hào):嘉楠科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式主板的概述與發(fā)展

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

    新手怎么學(xué)嵌入式?

    嵌入式系統(tǒng)的發(fā)展,嵌入式操作系統(tǒng)也變得越來越重要。學(xué)習(xí)嵌入式操作系統(tǒng)可以幫助你更好地管理
    發(fā)表于 12-12 10:51

    嵌入式系統(tǒng)開發(fā)與硬件的關(guān)系 嵌入式系統(tǒng)開發(fā)常見問題解決

    系統(tǒng)開發(fā)與硬件關(guān)系的幾個(gè)關(guān)鍵點(diǎn): 硬件依賴性 :嵌入式系統(tǒng)的軟件必須能夠在特定的硬件上運(yùn)行,這包括處理器、內(nèi)存、輸入/輸出接口等。軟件必須能夠充分利用硬件的特性,同時(shí)繞過其限制。 資源
    的頭像 發(fā)表于 12-09 09:38 ?587次閱讀

    什么是嵌入式操作系統(tǒng)?

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

    嵌入式 Linux 操作系統(tǒng)配置

    隨著物聯(lián)網(wǎng)(IoT)和智能設(shè)備的快速發(fā)展,嵌入式系統(tǒng)在各個(gè)領(lǐng)域扮演著越來越重要的角色。Linux因其開源、靈活和穩(wěn)定的特性,成為嵌入式系統(tǒng)的首選操作
    的頭像 發(fā)表于 11-06 10:22 ?811次閱讀

    嵌入式系統(tǒng)的啟動(dòng)流程

    嵌入式系統(tǒng)的啟動(dòng)流程是一個(gè)復(fù)雜但有序的過程,它涉及從系統(tǒng)上電到操作系統(tǒng)內(nèi)核及應(yīng)用程序啟動(dòng)的多個(gè)階段。
    的頭像 發(fā)表于 10-05 17:44 ?591次閱讀

    嵌入式系統(tǒng)的未來趨勢有哪些?

    嵌入式系統(tǒng)是指將我們的操作系統(tǒng)和功能軟件集成于計(jì)算機(jī)硬件系統(tǒng)之中,形成一個(gè)專用的計(jì)算機(jī)系統(tǒng)。那么嵌入式
    發(fā)表于 09-12 15:42

    嵌入式linux開發(fā)板怎么操作

    嵌入式Linux開發(fā)板是一種基于Linux操作系統(tǒng)嵌入式系統(tǒng)開發(fā)平臺(tái)。它通常包括一個(gè)處理器、內(nèi)存、存儲(chǔ)器、輸入/輸出接口等硬件組件,以及一
    的頭像 發(fā)表于 09-02 09:09 ?539次閱讀

    嵌入式系統(tǒng)中的實(shí)時(shí)操作系統(tǒng)

    嵌入式RTOS是嵌入式應(yīng)用程序運(yùn)行、相互交互和與外界通信的底層軟件機(jī)制。在本節(jié)中,您將了解嵌入式軟件開發(fā)人員使用哪些流行RTOS以及它們運(yùn)行的嵌入式硬件平臺(tái)。
    的頭像 發(fā)表于 08-20 11:28 ?621次閱讀

    RT-Thread出席第六屆中國嵌入式技術(shù)大會(huì),共話嵌入式操作系統(tǒng)與智能工業(yè)

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

    嵌入式系統(tǒng)怎么學(xué)?

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

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

    其他硬件的數(shù)據(jù)手冊,了解其特性和編程接口。 6. 學(xué)習(xí)低級(jí)編程:嵌入式編程常常需要直接與硬件交互,因此學(xué)習(xí)如何進(jìn)行低級(jí)編程,如結(jié)構(gòu)體、枚舉類型、指針操作、位操作、
    發(fā)表于 06-21 10:01

    入門嵌入式系統(tǒng)這些知識(shí)你知道嗎?

    嵌入式系統(tǒng)是一種專用的計(jì)算機(jī)系統(tǒng),作為裝置或設(shè)備的一部分。通常,嵌入式系統(tǒng)是一個(gè)控制程序存儲(chǔ)在ROM中的
    發(fā)表于 05-03 09:54 ?681次閱讀

    再談嵌入式實(shí)時(shí)操作系統(tǒng)

    由于嵌入式處理器早期功能單一且運(yùn)算能力不高,嵌入式應(yīng)用已不能滿足各個(gè)領(lǐng)域不斷增長的需求。嵌入式操作系統(tǒng)應(yīng)運(yùn)而生,嵌入式
    的頭像 發(fā)表于 04-09 17:27 ?930次閱讀
    再談<b class='flag-5'>嵌入式</b>實(shí)時(shí)<b class='flag-5'>操作系統(tǒng)</b>

    嵌入式fpga是什么意思

    嵌入式FPGA是指將FPGA技術(shù)集成到嵌入式系統(tǒng)中的一種解決方案。嵌入式系統(tǒng)是一種為特定應(yīng)用而設(shè)計(jì)的計(jì)算機(jī)
    的頭像 發(fā)表于 03-15 14:29 ?1542次閱讀