91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

電子工程師 ? 來(lái)源:張飛實(shí)戰(zhàn)電子 ? 作者:蔡琰老師 ? 2021-08-27 11:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

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

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

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

int a;

int *p = &a;

這個(gè)例子表示,整型指針型變量p指向a的地址,此時(shí)對(duì)*p的操作等同于對(duì)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)存的地址。在程序中就可以通過(guò)p來(lái)操作這塊內(nèi)存區(qū)域。在內(nèi)存使用完成后,需要使用free函數(shù)講內(nèi)存釋放。

free(p);

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

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

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

*p = 0xf0;

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

上面的程序等同于:

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

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

2、指針的類(lèi)型

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

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

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

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

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

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

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

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

3、指針的增量

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

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

P++;

*p = 0xf0;

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

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

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

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

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

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

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

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

責(zé)任編輯:haq

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

    關(guān)注

    68

    文章

    20255

    瀏覽量

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

    關(guān)注

    5198

    文章

    20449

    瀏覽量

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

    關(guān)注

    9

    文章

    3210

    瀏覽量

    76377

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式單片機(jī)開(kāi)發(fā)學(xué)習(xí)路徑

    學(xué)習(xí)C語(yǔ)言 C語(yǔ)言是嵌入式開(kāi)發(fā)的基礎(chǔ)。掌握C語(yǔ)言的基本語(yǔ)法、指針、結(jié)構(gòu)體、內(nèi)存管理等內(nèi)容是進(jìn)入嵌入式開(kāi)發(fā)的前提。 2. 硬件知識(shí) 2.1 認(rèn)識(shí)單片機(jī) 單片機(jī)是
    發(fā)表于 02-09 15:42

    什么是嵌入式應(yīng)用開(kāi)發(fā)?

    概述 所謂的嵌入式應(yīng)用開(kāi)發(fā)就是在嵌入式操作系統(tǒng)下進(jìn)行開(kāi)發(fā)、軟硬件綜合開(kāi)發(fā) ?嵌入式應(yīng)用開(kāi)發(fā)?是指在嵌入式
    發(fā)表于 01-12 16:13

    C語(yǔ)言嵌入式系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作

    C語(yǔ)言嵌入式系統(tǒng)編程注意事項(xiàng)之內(nèi)存操作嵌入式系統(tǒng)的編程中,常常要求在特定的
    發(fā)表于 01-04 07:31

    嵌入式系統(tǒng)中,動(dòng)態(tài)分配內(nèi)存可能發(fā)生的問(wèn)題是什么?

    盡管不像非嵌入式計(jì)算機(jī)那么常見(jiàn),嵌入式系統(tǒng)還是有從堆(heap)中動(dòng)態(tài)分配內(nèi)存的過(guò)程的。 那么嵌入式
    發(fā)表于 12-22 09:42

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

    要理解嵌入式操作系統(tǒng)(Embedded Operating System,簡(jiǎn)稱(chēng) RTOS/EOS),我們可以從本質(zhì)定義→核心區(qū)別→實(shí)際作用→典型特征→嵌入式開(kāi)發(fā)場(chǎng)景適配,五個(gè)維度來(lái)拆解, 一
    發(fā)表于 12-09 10:33

    嵌入式系統(tǒng)的定義和應(yīng)用領(lǐng)域

    。盡管有些嵌入式系統(tǒng)可能包含操作系統(tǒng),但大多數(shù)情況下,它們僅由一個(gè)程序來(lái)控制整個(gè)邏輯。 從更專(zhuān)業(yè)的角度來(lái)看,嵌入式系統(tǒng)可以被定義為:以應(yīng)用
    發(fā)表于 11-17 06:49

    嵌入式實(shí)時(shí)操作系統(tǒng)的特點(diǎn)

    操作系統(tǒng)具備高效的中斷處理機(jī)制,能夠快速響應(yīng)和處理系統(tǒng)的中斷事件。 資源管理:實(shí)時(shí)嵌入式操作系統(tǒng)提供有效的資源管理機(jī)制,包括內(nèi)存管理、設(shè)備驅(qū)
    發(fā)表于 11-13 06:30

    RusT-Thread:基于Rust面向資源受限嵌入式設(shè)備的操作系統(tǒng)的實(shí)踐 | 技術(shù)集結(jié)

    摘要隨著物聯(lián)網(wǎng)和嵌入式系統(tǒng)的發(fā)展,實(shí)時(shí)操作系統(tǒng)(RTOS)的安全性和性能需求日益提高。傳統(tǒng)基于C語(yǔ)言的RTOS在內(nèi)存安全和并發(fā)控制方面存在局限,容易導(dǎo)致緩沖區(qū)溢出、數(shù)據(jù)競(jìng)爭(zhēng)等問(wèn)題。本項(xiàng)
    的頭像 發(fā)表于 11-07 17:37 ?6865次閱讀
    RusT-Thread:基于Rust面向資源受限<b class='flag-5'>嵌入式</b>設(shè)備的<b class='flag-5'>操作系統(tǒng)</b>的實(shí)踐 | 技術(shù)集結(jié)

    嵌入式需要掌握哪些核心技能?

    : 1)C語(yǔ)言與底層編程 核心地位:C語(yǔ)言是嵌入式開(kāi)發(fā)的基石,需精通指針操作內(nèi)存管理、位運(yùn)算,直接操控硬件資源。 延伸技能:C++用于復(fù)雜項(xiàng)目架構(gòu)設(shè)計(jì),匯編語(yǔ)言?xún)?yōu)化底層性能(如啟動(dòng)代
    發(fā)表于 10-21 16:25

    嵌入式達(dá)到什么水平才能就業(yè)?

    、LoRa、NB-IoT,能實(shí)現(xiàn)嵌入式設(shè)備與云端平臺(tái)的數(shù)據(jù)交互了解 RTOS 實(shí)時(shí)操作系統(tǒng):如 FreeRTOS、RT-Thread,能進(jìn)行任務(wù)創(chuàng)建、信號(hào)量管理、內(nèi)存分配
    發(fā)表于 09-15 10:20

    入行嵌入式應(yīng)該怎么準(zhǔn)備?

    知識(shí): 一、C/C++編程C/C++是嵌入式系統(tǒng)開(kāi)發(fā)中最常用的編程語(yǔ)言。熟練掌握C/C++語(yǔ)言將使你能夠理解和編寫(xiě)底層驅(qū)動(dòng)程序、操作系統(tǒng)以及與硬件交互的代碼。對(duì)于嵌入式
    發(fā)表于 08-06 10:34

    Linux嵌入式和單片機(jī)嵌入式的區(qū)別?

    :使用Linux操作系統(tǒng),可以運(yùn)行各種復(fù)雜的應(yīng)用程序和驅(qū)動(dòng)程序。 4. 資源需求 : 單片機(jī)嵌入式 :對(duì)硬件資源的需求較低,通常只需要一個(gè)單片機(jī)芯片,內(nèi)存和存儲(chǔ)空間較小。 Linux嵌入
    發(fā)表于 06-20 09:46

    嵌入式開(kāi)發(fā),如何選擇適合的系統(tǒng)?

    嵌入式ARM開(kāi)發(fā)中,面對(duì)多種操作系統(tǒng)的選擇,如何做出最適合項(xiàng)目的決策?本文將為您梳理常見(jiàn)系統(tǒng)的特性,幫助您快速了解它們的優(yōu)缺點(diǎn),以便更好地選擇適合的系統(tǒng)。引言在
    的頭像 發(fā)表于 05-20 11:32 ?1148次閱讀
    <b class='flag-5'>嵌入式</b>開(kāi)發(fā),如何選擇適合的<b class='flag-5'>系統(tǒng)</b>?

    嵌入式開(kāi)發(fā)入門(mén)指南:從零開(kāi)始學(xué)習(xí)嵌入式

    特定功能的計(jì)算機(jī)系統(tǒng),廣泛應(yīng)用于智能家居、工業(yè)控制、醫(yī)療設(shè)備、車(chē)載系統(tǒng)等領(lǐng)域。 2. 學(xué)習(xí)嵌入式開(kāi)發(fā)的前置知識(shí)熟悉C語(yǔ)言編程掌握基本的數(shù)據(jù)結(jié)構(gòu)與算法了解數(shù)字電路與微控制器原理熟悉Linux操作
    發(fā)表于 05-15 09:29

    RT-Thread嵌入式操作系統(tǒng)專(zhuān)業(yè)培訓(xùn)班-深圳站重磅開(kāi)啟!

    RT-Thread官方將在深圳舉辦為期三天的嵌入式操作系統(tǒng)專(zhuān)業(yè)培訓(xùn)班!本次培訓(xùn)將深入講解RT-Thread嵌入式實(shí)時(shí)操作系統(tǒng)的核心技術(shù)與實(shí)戰(zhàn)應(yīng)用,助力開(kāi)發(fā)者快速掌握RTOS開(kāi)發(fā)精髓。無(wú)
    的頭像 發(fā)表于 04-11 18:18 ?842次閱讀
    RT-Thread<b class='flag-5'>嵌入式</b><b class='flag-5'>操作系統(tǒng)</b>專(zhuān)業(yè)培訓(xùn)班-深圳站重磅開(kāi)啟!