C語言(記錄)【記憶體相關_1:記憶體基礎】

来源:http://www.cnblogs.com/printf631/archive/2017/11/01/7764295.html
-Advertisement-
Play Games

本文是基於嵌入式的C語言 首先弄明白程式是什麼?電腦為什麼需要編程? 編寫程式的目的是為了去運行,從而得到一些結果。顧名思義電腦就是用來計算的,所以電腦的所有程式就是在計算,那麼電腦在計算什麼呢?當然是在計算數據,因此,數據是程式的重要組成。推出:電腦程式 = 代碼 + 數據。那麼程式運行 ...


本文是基於嵌入式的C語言

--------------------------------------------------

首先弄明白程式是什麼?電腦為什麼需要編程?

  編寫程式的目的是為了去運行,從而得到一些結果。顧名思義電腦就是用來計算的,所以電腦的所有程式就是在計算,那麼電腦在計算什麼呢?當然是在計算數據,因此,數據是程式的重要組成。推出:電腦程式 = 代碼 + 數據。那麼程式運行後得到的結果就是:代碼 + 原始程式 = 新的數據。

  從形象的巨集觀上看,代碼就是加工數據的動作,數據就是代碼所要加工的東西。

  例如下麵幾行代碼(一個簡單函數):此函數(num_p)就是執行兩個數的相加代碼,它執行的動作是將兩個數據(形參int num_1 ,int num_2)相加,得到一個新的數據。

  int num_p(int num_1 ,int num_2)

  {

    return num_1 + num_2;

  }

電腦程式運行過程

  電腦程式運行的過程就是多個函數相機運行的過程。程式是由多個函數組成,函數是程式的本質,函數的本質工作就是加工數據。

為什麼需要記憶體

  首先要知道什麼是記憶體:(硬體和邏輯兩個角度)
  從硬體角度:記憶體實際上是電腦的一個配件(一般叫記憶體條)。根據不同的硬體實現原理還可以把記憶體分成SRAM和DRAM(DRAM又有好多代,譬如最早的SDRAM,後來的DDR1、DDR2·····、LPDDR)
  從邏輯角度:記憶體是這樣一種東西,它可以隨機訪問(隨機訪問的意思是只要給一個地址,就可以訪問這個記憶體地址)、並且可以讀寫(當然了邏輯上也可以限制其為只讀或者只寫);記憶體在編程中天然是用來存放變數的(就是因為有了記憶體,所以C語言才能定義變數,C語言中的一個變數實際就對應記憶體中的一個單元)。

  記憶體是用來存儲數據的,是編程和程式運行的本質需求,英文名(一般也是這樣叫)是RAM,有DRAM和SRAM之分。根據存儲方式的不同,記憶體有馮諾依曼結構和哈佛結構兩種。 馮諾依曼結構是:數據和代碼放在一起。哈佛結構是:數據和代碼分開存在。比如:在S5PV210(本人目前正在學習的晶元)中運行的linux系統上,運行應用程式時:這時候所有的應用程式的代碼和數據都在DRAM,所以這種結構就是馮諾依曼結構;在單片機中,我們把程式代碼燒寫到Flash(NorFlash)中,然後程式在Flash中原地運行,程式中所涉及到的數據(全局變數、局部變數)不能放在Flash中,必須放在RAM(SRAM)中。這種就叫哈佛結構。

單說記憶體

  從邏輯角度來講,記憶體實際上是由無限多個記憶體單元格組成的,每個單元格有一個固定的地址叫記憶體地址,這個記憶體地址和這個記憶體單元格唯一對應且永久綁定。
  邏輯上的記憶體就好象是一棟無限大的大樓,記憶體的單元格就好象大樓中的一個個小房間。每個記憶體單元格的地址就好象每個小房間的房間號。記憶體中存儲的內容就好象住在房間中的人一樣。
  理想條件下,記憶體可以有無限大(因為數學上編號永遠可以增加,無盡頭)。但是現實中實際的記憶體大小是有限制的,譬如32位的系統(32位系統指的是32位數據線,但是一般地址線也是32位,這個地址線32位決定了記憶體地址只能有32位二進位,所以邏輯上的大小為2的32次方)記憶體限制就為4G。實際上32位的系統中可用的記憶體是小於等於4G的(譬如我32位CPU裝32位windows,但實際電腦只有512M記憶體)。

記憶體的量化

  對於記憶體的量化,前人、大佬們已經訂好了規則。一般有四種:位、位元組、半字和字。有些地方會有雙字,但據我所知不常用,而且半字、字和雙字這三個單位的大小是依賴變化的。

  對於任意的系統平臺來說,一位就是1bit,一個位元組就是8bit,是永遠不會變化的。

  半字、字和雙字在一些系統中大小是不定的,但是有一點是不變的:雙字的大小永遠的字的大小的兩倍,字的大小永遠是半字的兩倍。

記憶體位寬(硬體和邏輯兩個角度)
  從硬體角度講:硬體記憶體的實現本身是有寬度的,也就是說有些記憶體條就是8位的,而有些就是16位的。那麼需要強調的是記憶體晶元之間是可以並聯的,通過並聯後即使8位的記憶體晶元也可以做出來16位或32位的硬體記憶體。
  從邏輯角度講:記憶體位寬在邏輯上是任意的,甚至邏輯上存在記憶體位寬是24位的記憶體(但是實際上這種硬體是買不到的,也沒有實際意義)。從邏輯角度來講不管記憶體位寬是多少,我就直接操作即可,對我的操作不構成影響。但是因為你的操作不是純邏輯而是需要硬體去執行的,所以不能為所欲為,所以我們實際的很多操作都是受限於硬體的特性的。譬如24位的記憶體邏輯上和32位的記憶體沒有任何區別,但實際硬體都是32位的,都要按照32位硬體的特性和限制來幹活。

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 環境搭建 1.1 Python安裝 1.2 MySQL環境搭建 1.3安裝MySQLdb 2 具體實現 2.1 登陸界面 2.2 註冊界面 2.3 具體實現部分代碼 1 環境搭建 1.1 Python安裝 本文具體實現部分Python環境:Python2.7.14,64位版本 具體安裝步驟見:P ...
  • 要求: 程式流程圖: 程式Readme: MiniFTP主要是由三部分組成:伺服器端、客戶端、管理端。本文主要就是介紹以上三部分內容。 系統初始配置 管理員賬號 用戶名:admin 密碼:password 用戶賬號: 用戶名:zhangsan 密碼:123 伺服器地址: IP:127.0.0.1 P ...
  • RabbitMQ依賴erlang,所以先安裝erlang,然後再安裝RabbitMQ; erlang,下載地址:http://www.erlang.org/download 先安裝erlang,雙擊erlang的安裝文件即可,然後配置環境變數: ERLANG_HOME=D:\Program File ...
  • 線程如何創建 創建線程有三種方式:繼承Thread類;無返回值的Runnable;有返回值的Callable 示例如下 執行結果 線程相關的基礎方法 wait:獲取鎖對象monitor的線程執行wait方法,將會釋放對monitor的控制權,其他線程可以獲取到鎖對象的monitor,執行notify ...
  • 對 Spring,SpringMVC,SpringData 和 JPA 進行了詳細的整合說明,並實現了一個常見的分頁操作。 ...
  • <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>引入標簽庫. <fmt:formatNumber type="number" value="${ch.showValue(item.unitprice,null)}" pa ...
  • 查看當前文件夾下麵多有的目錄文件ls 查看當前目錄下麵所有的文件,包括隱藏的文件ls -a(或者兩個一樣ls -all) 顯示除"."和".."外的所有文件ls -A 用長格式查看文件以及文件夾信息 ls -l 用長格式查看所有文件以及文件夾信息 ls -a -l total後面的數字是指當前目錄下 ...
  • 如果你是程式員,那麼肯定會在周末給自己充下電 有的人選擇看書學習 有的人選擇看視頻學習 如果你是一個老鳥,那麼看書,看博客,看官方文檔,這些是老鳥的學習路線 如果對上面都不感冒,可能你會在網上找一些視頻教程來去學習 如果你是看視頻學習的話, 下麵的這些意見可能對你會有用 一、視頻學習 看視頻的過程中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...