女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

嵌入式系統的編程中指針直接操作內存的方法介紹

電子工程技術 ? 來源:未知 ? 2019-11-26 11:01 ? 次閱讀

數據指針

嵌入式系統編程中,常常要求在特定的內存單元讀寫內容,匯編有對應的MOV指令,而除C/C++以外的其它編程語言基本沒有直接訪問絕對地址的能力。在嵌入式系統的實際調試中,多借助C語言指針所具有的對絕對地址單元內容的讀寫能力。以指針直接操作內存多發生在如下幾種情況:

(1) 某I/O芯片被定位在CPU的存儲空間而非I/O空間,而且寄存器對應于某特定地址;

(2) 兩個CPU之間以雙端口RAM通信,CPU需要在雙端口RAM的特定單元(稱為mail box)書寫內容以在對方CPU產生中斷;

(3) 讀取在ROM或FLASH的特定單元所燒錄的漢字和英文字模。


譬如:

unsigned char *p = (unsigned char *)0xF000FF00;
*p="11";

以上程序的意義為在絕對地址0xF0000+0xFF00(80186使用16位段地址和16位偏移地址)寫入11。

在使用絕對地址指針時,要注意指針自增自減操作的結果取決于指針指向的數據類別。上例中p++后的結果是p= 0xF000FF01,若p指向int,即:

int *p = (int *)0xF000FF00;
p++(或++p)的結果等同于:p = p+sizeof(int),而p-(或-p)的結果是p = p-sizeof(int)。

記住:CPU以字節為單位編址,而C語言指針以指向的數據類型長度作自增和自減。理解這一點對于以指針直接操作內存是相當重要的。

函數指針

首先要理解以下三個問題:

(1)C語言中函數名直接對應于函數生成的指令代碼在內存中的地址,因此函數名可以直接賦給指向函數的指針;

(2)調用函數實際上等同于"調轉指令+參數傳遞處理+回歸位置入棧",本質上最核心的操作是將函數生成的目標代碼的首地址賦給CPU的PC寄存器;

(3)因為函數調用的本質是跳轉到某一個地址單元的code去執行,所以可以"調用"一個根本就不存在的函數實體,暈?請往下看:

請拿出你可以獲得的任何一本大學《微型計算機原理》教材,書中講到,186 CPU啟動后跳轉至絕對地址0xFFFF0(對應C語言指針是0xF000FFF0,0xF000為段地址,0xFFF0為段內偏移)執行,請看下面的代碼:

typedef void (*lpFunction) ( ); /* 定義一個無參數、無返回類型的*/
/* 函數指針類型*/
lpFunction lpReset = (lpFunction)0xF000FFF0; /* 定義一個函數指針,指向*/
/* CPU啟動后所執行第一條指令的位置*/
lpReset(); /* 調用函數*/

在以上的程序中,我們根本沒有看到任何一個函數實體,但是我們卻執行了這樣的函數調用:lpReset(),它實際上起到了"軟重啟"的作用,跳轉到CPU啟動后第一條要執行的指令的位置。

記住:函數無它,唯指令集合耳;你可以調用一個沒有函數體的函數,本質上只是換一個地址開始執行指令!

數組vs.動態申請

在嵌入式系統中動態內存申請存在比一般系統編程時更嚴格的要求,這是因為嵌入式系統的內存空間往往是十分有限的,不經意的內存泄露會很快導致系統的崩潰。

所以一定要保證你的malloc和free成對出現,如果你寫出這樣的一段程序:

char * function(void)
{
char *p;
p = (char *)malloc(…);
if(p==NULL)
…;
… /* 一系列針對p的操作*/
return p;
}

在某處調用function(),用完function中動態申請的內存后將其free,如下:

char *q = function();

free(q);

上述代碼明顯是不合理的,因為違反了malloc和free成對出現的原則,即"誰申請,就由誰釋放"原則。不滿足這個原則,會導致代碼的耦合度增大,因為用戶在調用function函數時需要知道其內部細節!

正確的做法是在調用處申請內存,并傳入function函數,如下:

char *p="malloc"(…);
if(p==NULL)
…;
function(p);

free(p);
p="NULL";

而函數function則接收參數p,如下:

void function(char *p)
{
… /* 一系列針對p的操作*/
}

基本上,動態申請內存方式可以用較大的數組替換。對于編程新手,筆者推薦你盡量采用數組!嵌入式系統可以以博大的胸襟接收瑕疵,而無法"海納"錯誤。畢竟,以最笨的方式苦練神功的郭靖勝過機智聰明卻范政治錯誤走反革命道路的楊康。

給出原則:

(1)盡可能的選用數組,數組不能越界訪問(真理越過一步就是謬誤,數組越過界限就光榮地成全了一個混亂的嵌入式系統);

(2)如果使用動態申請,則申請后一定要判斷是否申請成功了,并且malloc和free應成對出現!


const在C++語言中則包含了更豐富的含義,而在C語言中僅意味著:"只能讀的普通變量",可以稱其為"不能改變的變量"(這個說法似乎很拗口,但卻最準確的表達了C語言中const的本質),在編譯階段需要的常數仍然只能以#define宏定義!故在C語言中如下程序是非法的:

關鍵字const

const意味著"只讀"。區別如下代碼的功能非常重要,也是老生常談,如果你還不知道它們的區別,而且已經在程序界摸爬滾打多年,那只能說這是一個悲哀: const int a;
int const a;
const int *a;
int * const a;
int const * a const;
const int SIZE = 10;
char a[SIZE]; /* 非法:編譯階段不能用到變量*/

關鍵字volatile

volatile變量可能用于如下幾種情況:
(1) 并行設備的硬件寄存器(如:狀態寄存器,例中的代碼屬于此類);
(2) 一個中斷服務子程序中會訪問到的非自動變量(也就是全局變量);
(3) 多線程應用中被幾個任務共享的變量。

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

    關注

    41

    文章

    3665

    瀏覽量

    130903
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140361

原文標題:嵌入式C語言高手煉成之內存操作篇

文章出處:【微信號:EngicoolArabic,微信公眾號:電子工程技術】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

    其他硬件的數據手冊,了解其特性和編程接口。 6. 學習低級編程嵌入式編程常常需要直接與硬件交互,因此學習如何進行低級
    發表于 06-21 10:01

    什么是嵌入式操作系統內存管理技術?

    還是一個開放性的操作系統,這意味著幾乎所有的智能手機嵌入式操作系統都允許用戶安裝第三方程序。因此,在操作系統設計時還要綜合考慮編程的易用性及
    發表于 07-30 07:19

    【原創】聊一聊內存指針操作

    作者:蔡琰老師(張飛實戰電子高級工程師)在嵌入式系統中,對內存地址的操作是一個重要的方面,從廣義上講,嵌入式
    發表于 07-28 09:10

    嵌入式操作系統的發展

    一.嵌入式操作系統1.嵌入式操作系統的發展(1)Tiny OS操作系統1)開源深度輕量級操作系統
    發表于 10-27 07:26

    指針直接操作內存會發生哪幾種情況

    數據指針  在嵌入式系統編程中,常常要求在特定的內存單元讀寫內容,匯編有對應的MOV指令,而除C/C++以外的其它
    發表于 12-15 08:56

    分享一些嵌入式系統編程內存操作相關的避坑指南

    嵌入式系統編程中,內存操作是我們常用到的,但往往也是易錯的地方,怎么避免呢,今天給大家分享一些相關的避坑指南。數據
    發表于 12-17 07:18

    嵌入式操作系統Linux 中的串口應用編程

    針對嵌入式Linux操作系統的特點,分析在該系統下串行通信口編程控制的方法,總結程序設計的步驟; 在嵌入
    發表于 05-14 14:34 ?28次下載

    嵌入式系統內存管理方案研究

    摘要:嵌入式系統內存管理機制必須滿足實時性和可靠性的要求。本文以開源的的操作系統RTEMS為例,介紹
    發表于 05-24 23:57 ?1273次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統</b><b class='flag-5'>內存</b>管理方案研究

    嵌入式系統編程之內存操作學習

    嵌入式系統編程之內存操作學習 1.數據指針嵌入式系統
    發表于 09-08 18:11 ?435次閱讀

    嵌入式操作系統FreeRTOS內存如何管理和堆

    嵌入式操作系統FreeRTOS內存管理和堆
    的頭像 發表于 01-10 15:17 ?5180次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>操作系統</b>FreeRTOS<b class='flag-5'>內存</b>如何管理和堆

    嵌入式操作系統如何應用_嵌入式操作系統的組成

    本文首先介紹了入操作系統的特點,其次闡述了嵌入式操作系統的應用,最后介紹
    發表于 09-01 16:36 ?3709次閱讀

    嵌入式系統裸機編程內存管理簡介

    ? 在嵌入式裸機編程中,作為一名初級的CODER。經常要與CPU、內存等打交道。CPU作為系統的動力源,其重要程度不言而喻。 ? 但是,在裸機編程
    的頭像 發表于 12-28 09:44 ?3401次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統</b>裸機<b class='flag-5'>編程</b>的<b class='flag-5'>內存</b>管理簡介

    嵌入式系統內存指針操作

    到處理器的內存空間中。在x86系統中,分為內存和I/O映射兩種內存;在ARM體系中,全部的地址都在32位的內存空間中,所有的
    的頭像 發表于 08-27 11:33 ?6481次閱讀

    淺談嵌入式系統裸機編程內存管理

     malloc和free在PC編程中是很好用的一種內存分配手段。但是,其在嵌入式中,就未必好用了。由于嵌入式裸機編程中,無MMU,即
    發表于 09-15 10:38 ?1696次閱讀

    嵌入式C語言高手煉成之內存操作

    嵌入式系統編程中,常常要求在特定的內存單元讀寫內容,匯編有對應的MOV指令,而除C/C++以外的其它編程語言基本沒有
    的頭像 發表于 12-11 17:20 ?704次閱讀