故障處理 vxwork 大端序和變數指標

2021-06-18 16:54:42 字數 703 閱讀 2839

1.問題描述

有如下函式

int my_read_reg(euint16 slot, euint16 chip, euint16 reg, euint16 *pvalue)

在vxwork shell 上敲入如下命令

->buf=malloc(2)

->my_read_reg  0,0,0x44, &buf

buf 的值是0

-> my_lowlevel_read 0,0,0x44, &buf

buf的值是0x23.

2.問題原因

在該系統中,採用的是大端序。

dwvalue是32位的,而my_lowlevel_read最後乙個引數是 16bit暫存器的指標。

my_lowlevel_read 函式執行之後,dwvalue的值在記憶體中是如下儲存的。

記憶體位址     ==0==1==2==3==

dwvalue值      00  23  00   00 

這樣 dwvalue & 0x7ff = 0

3.原理解釋

在執行my_lowlevel_read函式時,32bit暫存器的指標被強制轉換成 16bit暫存器的指標。

轉換後,指標指向了 ==0==1==這塊記憶體,在該函式執行完成之後,暫存器中的值自然就儲存在了 ==0==1==這塊記憶體裡面。

當函式出來以後,dwvalue實際上變成了0x230000.

大端序和小端序

一 概述 位元組序,又稱端序,尾序,英文 endianness。在電腦科學領域中,位元組序是指存放多位元組資料的位元組 byte 的順序,典型的情況是整數在記憶體中的存放方式和網路傳輸的傳輸順序。endianness有時候也可以用指位序 bit 大小端序跟硬體的體系結構有關,所有x86系列的pc機都...

大端序和小端序

在socket程式設計的時候會遇到端序的問題。位元組序和程式語言無關,和硬體的儲存方式有關。intel的cpu使用小端序,而網路上傳輸資料使用大端序。在我的理解中,大端序和小端序並沒有哪種更好,只是儲存的方式不同而已。記憶體中我們只關心1byte,位址的基本單位也是byte。位元組序不關心1個byt...

大端序和小端序

一 概述 位元組序,又稱端序,尾序,英文 endianness。在電腦科學領域中,位元組序是指存放多位元組資料的位元組 byte 的順序,典型的情況是整數在記憶體中的存放方式和網路傳輸的傳輸順序。endianness有時候也可以用指位序 bit 大小端序跟硬體的體系結構有關,所有x86系列的pc機都...