色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

內存是怎么讀取數據的

h1654155149.6853 ? 來源:果果小師弟 ? 作者:智果芯 ? 2022-03-30 13:52 ? 次閱讀

摘要:你知道內存是怎么讀取數據的嗎?知道數據是怎么一個一個字節發送的嗎?是低字節先發還是高字節先發?是bit0先發還是bit7先發?是從低地址開始讀還是從高地址開始讀?看完本篇你應該就明白了~

內存的讀寫永遠從低地址開始讀/寫,從低到高!從低到高!從低到高!重要的話說三遍

大端模式和小端模式

大端模式和小端是實際的字節順序和存儲的地址順序對應關系的兩種模式。

大端模式:高位字節存放在低地址中,低位字節存放在高地址中。最直觀的字節序。

小端模式:高位字節存放在高地址中,低位字節存放在低地址中。最符合人的思維的字節序,x86、ARM都這么搞(STM32就是小端模式存儲)。

用圖表示更加容易理解。以unsigned int value = 0x12345678為例,分別按照大端模式和小端模式存放在芯片中。

內存地址 0x00000001 0x00000002 0x00000003 0x00000004
大端模式 0x12 0x34 0x56 0x78
小端模式 0x78 0x56 0x34 0x12

再換一種圖示:同樣以unsigned int value = 0x12345678為例,分別看看在兩種字節序下其存儲情況,我們可以用unsigned char buf[4]來表示value。

6bef331a-afd2-11ec-aa7f-dac502259ad0.png百度百科

不管是大端還是小端模式,我們在讀取和存儲數據的時候一定都是從內存的低地址依次向高地址讀取或寫入。另外注意,x86平臺是小端的,ARM平臺是小端的,而PowerPC平臺是大端的。

字節高低位

一般左邊為高位,右邊為低位(這個高低來自于人類的閱讀習慣,數字從左向右,表示由大到小)

一個16位(雙字節)的數據,比如0xFF12,那么高位字節就是0xFF,低位是0x12。如果是32位的數據,比如0x12345678。高位字(不是字節)是0x1234,低位字是0x5678。

右邊是低位位,左邊是高位(人的閱讀習慣)

LSB和MSB

最高有效位(most mignificant bit,msb)指的是一個n位二進制數字中的n-1位,具有最高的權值2^(n-1)。有時也指Most Significant Byte(MSB),指多字節序列中具有最大權重的字節。

同理,最低有效位(least significant bit,lsb)和的是一個n位二進制數字中的0位,具有最低的權值2^0。有時也指Least Significant Byte(LSB),指多字節序列中具有最小權重的字節。

所以0x12345678的最高有效字節就是0x12,最低有效字節就是0x78,這樣明白了吧!

舉個栗子

當選擇模數轉換器(ADC)時,最低有效位(LSB)這一參數的含義是什么?

對于一個12位串行轉換器,它會輸出由1或0組成的12位數串。通常,轉換器首先送出的是最高有效位(MSB)(即LSB + 11)。有些轉換器也會先送出LSB。我們假設先送出的是MSB,然后依次送出MSB-1 (即 LSB + 10)和MSB -2(即LSB + 9)并依次類推。轉換器最終送出MSB -11(即LSB)作為位串的末位。

LSB這一術語有著特定的含義,它表示的是數字流中的最后一位,也表示組成滿量程輸入范圍的最小單位。對于12位轉換器來說,LSB的值相當于模擬信號滿量程輸入范圍除以2^12 或 4096的商。如果用真實的數字來表示的話,對于滿量程輸入范圍為4.096V的情況,一個12位轉換器對應的LSB大小為1mV。但是,將LSB定義為4096個可能編碼中的一個編碼對于我們的理解是有好處的。

6c02ef72-afd2-11ec-aa7f-dac502259ad0.png截取自某12位ADC芯片數據手冊

高位先行msb 、低位先行lsb

高位先行即在傳輸一個字節的時候先傳輸高位msb;低位先行即在傳輸一個字節的時候先傳輸低位lsb。高位先行和低位先行是針對串行數據傳輸方式來說的。常見的串行傳輸方式有串口(UART)、I2C、SPI等。以串口傳輸方式為例,標準的串口傳輸方式是低位先行,芯片在通過TX引腳發送數據時,依次發送位0、位1……位7。

串口傳輸是低位先行

UART在數據傳輸時,協議規定了數據傳輸必須是低位先行,看下面的時序圖你就知道了~

6c21bf74-afd2-11ec-aa7f-dac502259ad0.png截圖自STM32F407中文參考手冊

IIC傳輸是高位先行

IIC的數據和地址均以8位字節傳輸,MSB 在前。從圖中可以清楚地看到:

6c3eb6ba-afd2-11ec-aa7f-dac502259ad0.png截圖自STM32F407中文參考手冊IIC部分

這一點也反映在代碼中,我們隨便找一個IIC的讀字節和寫字節的函數看看:

voidi2c_SendByte(uint8_t_ucByte)
{
uint8_ti;
/*先發送字節的高位bit7*/
for(i=0;i

從第7行代碼中可以看到,在發送一個字節時,首先將要發送的字節與0x80進行與運算,取出最高位,然后循環左移8次就可以將一個字節數據發送出去了。你有沒有想過為什么這里我們不把要發送的字節與0x01進行與運算,取出最低位,然后循環右移8次也可以將一個字節數據發送出去呢?

答:因為我們說了I2C在數據傳輸時,協議規定了數據傳輸必須是高位先行,所以你要發送一個字節的數據肯定必須先取出最高位,然后循環左移將數據發出,如果你與上0x01,就是低位先行,雖然你也將一個字節發出去了,但是你發的是歪門邪道的數據,人家單片機也不認識,對吧?你品,你細品

同樣在接收一個字節時,接收到的第1位認為是最高位,接收一個字節代碼如下:

uint8_ti2c_ReadByte(void)
{
uint8_ti;
uint8_tvalue;
/*讀到第1個bit為數據的bit7*/
value=0;
for(i=0;i

所有使用I2C的設備必須遵循I2C協議,必須都是高位先行的,這樣才能實現通用性。怎么樣?是不是又get到了一個小技巧~

字節序、比特序

字節序就是串行發送多字節時發送的順序,比如value=0x12345678,按字節發送是0x12、0x34、0x56、0x78順序還是0x78、0x56、0x34、0x12順序。

同理,比特序在bit層面進行排序,如果一個字節,指先發bit0還是bit7, 如果是一個Word型,先發bit31還是先發bit0。串口是lsb優先,I2C是msb優先,這里的msb、lsb指的是比特序,二進制位的位置。

驗證MCU平臺存儲方式?

這里以STM32開發單片機的keil平臺為例,以下代碼如果打印0x04就是小端存儲,如果0x01則是大端存儲。

因為0x04是低字節,讀取數據是從低地址開始讀,打印的是data的低地址,所以如果打印出的是0x04就表明低地址存儲低字節,就為小端存儲。明白了嗎?

6c674832-afd2-11ec-aa7f-dac502259ad0.png

#include"sys.h"
#include"delay.h"
#include"usart.h"
#include"led.h"
#include"key.h"
#include"lcd.h"
#include"SEGGER_RTT.h"
#include"math.h"

intmain(void)
{
HAL_Init();//初始化HAL庫
Stm32_Clock_Init(8,336,2,7);//設置時鐘,168Mhz
delay_init(168);//初始化延時函數
while(1)
{
uint32_tdata=0x01020304;
char*p=(char*)&data;
printf("0x0%x
",*p);//看輸出的是0x01還是0x04
delay_ms(1000);
}
}

編譯、鏈接、下載,通過RTT查看試驗結果:

6c7cbbd6-afd2-11ec-aa7f-dac502259ad0.pngJLink的RTT查看器

可以看出STM32是小端存儲。

總結:內存的讀寫永遠從低地址開始讀/寫。大小端存儲指字節在內存存儲方式,X86、ARM平臺都是小端存儲(低-低),MSB/LSB只發送字節序或者比特序,串口是比特序LSB,IIC是比特序MSB。也有人將MSB、big-endian、大端發送都混為一談,這時候一般指字節序上MSB。

原文標題:干貨|一文帶你搞懂內存中數據的讀寫方式

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

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

    關注

    8

    文章

    7048

    瀏覽量

    89073
  • 內存
    +關注

    關注

    8

    文章

    3028

    瀏覽量

    74076
  • STM32
    +關注

    關注

    2270

    文章

    10901

    瀏覽量

    356200
  • 存儲數據
    +關注

    關注

    0

    文章

    88

    瀏覽量

    14103

原文標題:干貨|一文帶你搞懂內存中數據的讀寫方式

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

收藏 人收藏

    評論

    相關推薦

    問題:讀取數據時報錯內存不足

    大家好,最近在處理數據的時候遇到這樣一個問題,使用讀取電子表格來讀一個300M左右的TXT數據文件,運行時間很長并且報錯內存不足,有什么辦法能解決這個問題嗎?謝謝各位了
    發表于 01-18 22:55

    TDMS文件,讀取顯示內存已滿

    讀取存儲的TDMS波形數據,只有采集1分鐘的數據,大概27MB的大小,為什么讀取不出來呢?顯示沒有足夠的內存?TDMS不是存儲海量
    發表于 09-23 11:33

    一次讀取數據占用內存很大

    本帖最后由 elecfans跑堂 于 2015-8-31 10:50 編輯 在編寫一個讀取wav文件的程序,發現一次讀取40M以上的文件,消耗內存1G左右,太嚇人了,請高手指點啊http
    發表于 08-31 09:40

    Linux學習記錄——寄存器與內存

    之前搞不懂寄存器與內存的區別 使用匯編指令的時候,Mov, ldr, str 搞不清三者間的區別:Mov 是用于寄存器間的數據傳送ldr 是從內存讀取
    發表于 01-12 10:43

    利用SRIO接口從FPGA向6678的共享內存發送數據,請問相比于單核從共享內存讀取數據會慢多少?

    段發送數據,第一段數據由核0處理,第二段數據由核1處理,第三段……第八段數據由核7處理。想問一下,這種機制相比于單核從共享內存
    發表于 06-25 01:31

    狀態機運行沒有約束是為什么?

    我一直在研究一個從DDR3內存讀取數據并通過以太網發送數據用于PC Matlab數據捕獲的系統。我有兩臺狀態機。 1個狀態機只有3個狀態。寫
    發表于 06-14 17:46

    嵌入式C語言一些關鍵字的相關資料推薦

    要求使用 volatile 聲明變量值的時候,系統總是重新從它所在的內存讀取數據,即使它前面的指令剛剛從該處讀取數據。遇到這個關鍵字聲明的
    發表于 12-15 08:36

    DMA_讀取GPIO電平到內存

    DMA_讀取GPIO電平到內存,單片機程序
    發表于 01-12 18:19 ?10次下載

    java之volatile并發

    模型的相關概念 大家都知道,計算機在執行程序時,每條指令都是在CPU中執行的,而執行指令過程中,勢必涉及到數據讀取和寫入。由于程序運行過程中的臨時數據是存放在主存(物理內存)當中的,
    發表于 09-27 10:20 ?6次下載
    java之volatile并發

    windows應用程序讀取進程的內存工具免費下載

    本文檔的主要內容詳細介紹的是windows應用程序讀取進程的內存工具免費下載。
    發表于 05-27 08:00 ?1次下載

    CPU是如何調度任務的?

    ②. 1 號核心讀取變量 A,由于 CPU 從內存讀取數據到 Cache 的單位是 Cache Line,也正好變量 A 和 變量 B 的數據
    的頭像 發表于 12-11 16:44 ?3189次閱讀
    CPU是如何調度任務的?

    干貨|一文帶你搞懂內存數據的讀寫方式

    摘要:你知道內存是怎么讀取數據的嗎?知道數據是怎么一個一個字節發送的嗎?是低字節先發還是高字節先發?是bit0先發還是bit7先發?是...
    發表于 01-25 17:21 ?0次下載
    干貨|一文帶你搞懂<b class='flag-5'>內存</b>中<b class='flag-5'>數據</b>的讀寫方式

    關于Vivado Non-project,我們應知道的一些問題

    ,同時也便于工程管理。Non-Project模式編譯時間會比Project模式短,因為所有數據存儲在內存,直接內存讀取數據比硬盤
    的頭像 發表于 12-15 13:51 ?2095次閱讀

    PCI Express橋:指南上游內存讀取性能優化

    電子發燒友網站提供《PCI Express橋:指南上游內存讀取性能優化.pdf》資料免費下載
    發表于 07-24 16:21 ?0次下載
    PCI Express橋:指南上游<b class='flag-5'>內存</b><b class='flag-5'>讀取</b>性能優化

    蘇州旗芯微半導體專利:內存數據讀取方法、系統及計算機設備

    此項申請主要涉及內存數據讀取方法、系統及計算機設備。在其中一個實施案例里,內存能夠在接到主機的讀取指令后,從
    的頭像 發表于 05-24 09:48 ?378次閱讀
    蘇州旗芯微半導體專利:<b class='flag-5'>內存</b><b class='flag-5'>數據</b><b class='flag-5'>讀取</b>方法、系統及計算機設備
    主站蜘蛛池模板: 最新国产av.在线视频| 麒麟色欧美影院在线播放| 双性大乳浪受噗呲噗呲h总| 亚洲黄色免费在线观看| 放射源分类办法| 欧美黑人巨大videos免费| 欧美特级另类xxx| 3d无遮挡h肉动漫在线播放| 狠狠色狠色综合曰曰| 性一交一无一伦一精一品| 在线 国产 欧美 专区| 国产在线不卡| 两个女人互添下身高潮自视频| 亚洲成人国产| 最新无码国产在线视频9299| 精品熟女少妇AV久久免费A片| 欧洲另类一二三四区| ewp绞死vk失禁编| 人妻无码AV中文系统久久免费| 扒开腿狂躁女人GIF动态图| 强奷乱码中文字幕熟女免费| yellow在线观看免费直播| 日本无吗高清| 最近免费视频中文2019完整版| 久久日韩精品无码一区| 91精品国产免费入口| 欧美一级做a爰片免费| 吃奶摸下的羞羞漫画| 午夜福利体验试看120秒| 狠狠色综合7777久夜色撩人| 伊人亚洲AV久久无码精品| 邻家美姨在线观看全集免费| aaaaaaa一级毛片| 色欲AV无码乱码精品国产| 国产亚洲精品线观看不卡| 亚洲综合视频| 男女床上黄色| 国产精品久久久久婷婷五月色婷婷| 亚洲精品入口一区二区乱麻豆精品 | 果冻传媒 在线播放观看| 三男强一女90分钟在线观看|