新足迹

 找回密码
 注册

精华好帖回顾

· 汽车零件及汽车改装术语中英文对照表 (2005-8-2) 我爱猫 · 上海冷面 - 京酱肉丝上海冷面 (2009-11-21) 老陶
· 《金子》,我爷爷的故事 (作者:我的父亲) (2011-7-8) realfenglin · 联邦教育拨款的公平性背景研究 (2010-8-8) patrickzhu
Advertisement
Advertisement
查看: 5663|回复: 33

向嵌入式编程的高手请教一下 [复制链接]

头像被屏蔽

禁止发言

发表于 2015-8-26 14:06 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 yichuan 于 2015-9-9 10:38 编辑

读一段程序,发现有点怪异,Big Endian 访问16位寄存器那段。
所有寄存器都是32位的,地址应该都是4字节对齐。
访问8位寄存器的时候还好理解,异或3就是把地址加3了。可是16位的时候仍然是异或3,这不就有问题了吗?
是程序的问题,还是我的理解不对?请探讨指教一下。
谢谢。

// BYTE Register access.
// Individual and vectorized access to 8 bit registers.

// Little-endian version or big-endian version that doesn't need address munging
#if (CYG_BYTEORDER == CYG_LSBFIRST) || defined(HAL_IO_MACROS_NO_ADDRESS_MUNGING)

#define HAL_READ_UINT8( _register_, _value_ ) \
        ((_value_) = *((volatile CYG_BYTE *)(_register_)))

#define HAL_WRITE_UINT8( _register_, _value_ ) \
        (*((volatile CYG_BYTE *)(_register_)) = (_value_))

#else // Big-endian version

#define HAL_READ_UINT8( _register_, _value_ ) \
        ((_value_) = *((volatile CYG_BYTE *)((CYG_ADDRWORD)(_register_)^3)))

#define HAL_WRITE_UINT8( _register_, _value_ ) \
        (*((volatile CYG_BYTE *)((CYG_ADDRWORD)(_register_)^3)) = (_value_))

#endif // Big-endian

////========================================================================

// 16 bit access.
// Individual and vectorized access to 16 bit registers.
   
// Little-endian version or big-endian version that doesn't need address munging
#if (CYG_BYTEORDER == CYG_LSBFIRST) || defined(HAL_IO_MACROS_NO_ADDRESS_MUNGING)

#define HAL_READ_UINT16( _register_, _value_ ) \
        ((_value_) = *((volatile CYG_WORD16 *)(_register_)))

#define HAL_WRITE_UINT16( _register_, _value_ ) \
        (*((volatile CYG_WORD16 *)(_register_)) = (_value_))

#else // Big-endian version

#define HAL_READ_UINT16( _register_, _value_ ) \
        ((_value_) = *((volatile CYG_WORD16 *)((CYG_ADDRWORD)(_register_)^3)))

#define HAL_WRITE_UINT16( _register_, _value_ ) \
        (*((volatile CYG_WORD16 *)((CYG_ADDRWORD)(_register_)^3)) = (_value_))


#endif // Big-endian

//-----------------------------------------------------------------------------

// 32 bit access.
// Individual and vectorized access to 32 bit registers.

// Note: same macros for little- and big-endian systems.
   
#define HAL_READ_UINT32( _register_, _value_ ) \
        ((_value_) = *((volatile CYG_WORD32 *)(_register_)))

#define HAL_WRITE_UINT32( _register_, _value_ ) \
        (*((volatile CYG_WORD32 *)(_register_)) = (_value_))
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2015-8-26 14:09 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
访问16位的低2字节,不是应该地址+2吗?

发表于 2015-9-5 16:08 来自手机 |显示全部楼层
此文章由 浮云马 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 浮云马 所有!转贴必须注明作者、出处和本声明,并保持内容完整
异或3等于地址+3???那直接用加号不就结了?
头像被屏蔽

禁止发言

发表于 2015-9-7 14:21 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
浮云马 发表于 2015-9-5 15:08
异或3等于地址+3???那直接用加号不就结了?

这个是特殊的情况,地址最低2位会是0,跟3异或,结果=3,相当于地址+3了。
程序这么写,我也感觉怪怪的,不好理解。
所以上来请教一下。

要是我写,肯定不这么写。确保地址的最低2位是0后,可以直接+3(读一个字节),+2(读16位字)。

退役斑竹

发表于 2015-9-7 16:47 |显示全部楼层
此文章由 大饼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 大饼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yichuan 发表于 2015-9-7 13:21
这个是特殊的情况,地址最低2位会是0,跟3异或,结果=3,相当于地址+3了。
程序这么写,我也感觉怪怪的, ...

为啥地址最低2位一定要是0呢?

arm是byte addressable的.

LDRH    requires 2-byte alignment
LDRB    requires 1-byte alignment


专攻电子电路
头像被屏蔽

禁止发言

发表于 2015-9-7 16:53 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 yichuan 于 2015-9-7 16:13 编辑
大饼 发表于 2015-9-7 15:47
为啥地址最低2位一定要是0呢?

arm是byte addressable的.


ARM的寄存器地址是每4字节一个,最低2位就得是0.
你说的是汇编指令随意访问RAM什么的吧。我不熟悉汇编指令。
刚搜索了一下,LDRH也可以访问寄存器。
但我说的是从一个4字节的寄存器中间读取低2字节,大头模式地址应该+2才对(小头模式直接读前面的2个字节就好)。
这段程序里面的 ADDR^3 确实理解不了。
Advertisement
Advertisement

2012年度奖章获得者 2011年度奖章获得者

发表于 2015-9-7 17:32 |显示全部楼层
此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 交易人生 于 2015-9-7 16:36 编辑
yichuan 发表于 2015-9-7 13:21
这个是特殊的情况,地址最低2位会是0,跟3异或,结果=3,相当于地址+3了。
程序这么写,我也感觉怪怪的, ...


这个年头还有人搞硬件?!这个根本就不是加3,是xor。

首先你没列出CYG_ADDRWORD的定义,我也只能猜了;

big-endian是内存的放数据的方式,如果你有32位数据0xddccbbaa,存放在地址里 (二进制的),顺序为xxxxxx00, 01, 10 和11,也就是说dd放在xxxxxx00,而aa放在地址xxxxxx 11。存放序列为(地址由小到大存放,dd,cc,bb,aa).

我理解的_register_里放的是相对地址,叫做vector或者offset,先说8位的, 如果_register_是00,说明要找第一个8位数字,00 xor 3,是二进制的11,自然就把aa取出来;如果_register_是01, xor 3 = 10,会把bb取出来,依次类推,符合逻辑。

再说16位的,如果_register_是00, xor 3 = xxxx 11,但要取2个bytes,就是oxbbaa;如果_register_= 0x02, xor 3 = 0x01,取到ddcc,所以用16位的,vector支持0 和2这两vector。1和3 对于register没有意义,也谈不上设计缺陷,因为16位的多是+2寻址的。

((_value_) = *((volatile CYG_WORD16 *)((CYG_ADDRWORD)(_register_)^3)))

(CYG_ADDRWORD):是个类型转换的cast;
(volatile CYG_WORD16 *):是个16位数据的地址指针的cast;
*:取value然后放在 ——value——里。

0  to 1

退役斑竹

发表于 2015-9-7 17:35 来自手机 |显示全部楼层
此文章由 大饼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 大饼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yichuan 发表于 2015-9-7 15:53
ARM的寄存器地址是每4字节一个,最低2位就得是0.
你说的是汇编指令随意访问RAM什么的吧。我不熟悉汇编指 ...

至少Arm cortex可以
专攻电子电路
头像被屏蔽

禁止发言

发表于 2015-9-8 12:48 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
交易人生 发表于 2015-9-7 16:32
这个年头还有人搞硬件?!这个根本就不是加3,是xor。

首先你没列出CYG_ADDRWORD的定义,我也只能猜了; ...

没人搞硬件,你们软件放在哪里用?
您可能是高级语言编程的(JAVA, C#等等,我也不懂了),估计没有多接触过底层的寄存器,RAM字节读取这种低级活儿,上学的时候学过单片机的话也忘记得差不多了吧。

发表于 2015-9-8 12:52 |显示全部楼层
此文章由 ljalee 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 ljalee 所有!转贴必须注明作者、出处和本声明,并保持内容完整
发现现在自己看到程序就脑袋疼。
不干软件5年了。
头像被屏蔽

禁止发言

发表于 2015-9-8 12:55 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
大饼 发表于 2015-9-7 16:35
至少Arm cortex可以

汇编指令肯定是可以随意访问哪一个地址,只要允许。
咱是在讨论这段C程序中访问寄存器的事,
它前面的读写低8位(1字节)那段算是恰好访问了本寄存器的LSB (地址+3),正确。
访问低16位(2字节)的时候,就会读写 本寄存器的LSB 和 下一个寄存器的MSB,不就乱了吗?!
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2015-9-8 12:56 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
ljalee 发表于 2015-9-8 11:52
发现现在自己看到程序就脑袋疼。
不干软件5年了。

改行做什么了?
能赚钱就行,我也想放弃,尤其这种低级程序员,工资低也没成就感。

退役斑竹

发表于 2015-9-8 13:11 |显示全部楼层
此文章由 大饼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 大饼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 大饼 于 2015-9-8 12:14 编辑
yichuan 发表于 2015-9-8 11:55
汇编指令肯定是可以随意访问哪一个地址,只要允许。
咱是在讨论这段C程序中访问寄存器的事,
它前面的读 ...


这不是 addr +3 啊.  是addr  0 -> 3, 1->2, 2->1, 3->0
你自己花个表, 用HAL_READ_UINT8 推演一遍就明白了.
或者找快arm cortex开发板 用keil uVision debug step by step run一次

其实7楼已经写的很明白了.

专攻电子电路

2012年度奖章获得者 2011年度奖章获得者

发表于 2015-9-8 13:11 |显示全部楼层
此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yichuan 发表于 2015-9-8 11:48
没人搞硬件,你们软件放在哪里用?
您可能是高级语言编程的(JAVA, C#等等,我也不懂了),估计没有 ...

我当然搞过硬件,汇编,c++都很熟,不然也不能回复你的问题,你看我的回复有没有道理,那段程序没错。
0  to 1
头像被屏蔽

禁止发言

发表于 2015-9-8 13:30 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
大饼 发表于 2015-9-8 12:11
这不是 addr +3 啊.  是addr  0 -> 3, 1->2, 2->1, 3->0
你自己花个表, 用HAL_READ_UINT8 推演一遍就明白 ...

因为寄存器的基地址只能是0(or 4/8/C),^3 就是移到地址+3了,对于8位读取LSB那个刚刚好。
对于16bit那段还是无法理解。
理论分析我还是可以做的,验证就没有软硬件条件了。

要不你有兴趣验证一下用大头模式访问低16位(2字节)的程序如何写比较好。
头像被屏蔽

禁止发言

发表于 2015-9-8 13:37 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 yichuan 于 2015-9-8 12:38 编辑
交易人生 发表于 2015-9-8 12:11
我当然搞过硬件,汇编,c++都很熟,不然也不能回复你的问题,你看我的回复有没有道理,那段程序没错。 ...

再说16位的,如果_register_是00, xor 3 = xxxx 11,但要取2个bytes,就是oxbbaa


这句话正确,但是地址+3的时候取16位就不是bbaa了,而是aaxx,xx是下一个寄存器(RAM)的MSB,未知。

如果_register_= 0x02, xor 3 = 0x01,取到ddcc


地址+1时取的16位,不是ddcc, 而是ccbb。 要想读取ddcc, 直接在基地址上读16位,不能移动指针的。
Advertisement
Advertisement

2012年度奖章获得者 2011年度奖章获得者

发表于 2015-9-8 14:40 |显示全部楼层
此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yichuan 发表于 2015-9-8 12:37
这句话正确,但是地址+3的时候取16位就不是bbaa了,而是aaxx,xx是下一个寄存器(RAM)的MSB,未知。

...

16位的,如果地址是(2进制)00,寻址是11; 如果是10,寻址是01;这个都是对的。或者说vector是0和2 ,取出来的数据都是对的,这个已经符合了16位寻址的需要,因为16位运算,16位数据在内存里,就是0,2,4,6等排放的。何况你前面说了,这是个32位的系统,cpu在读取数据的时候都是32位为基础的。

如果地址vector是1和3,在体系结构中,没有这种数据存放方式。原开发人员这么写,可能就是对应这个体系结构的简化操作,能够适应所有的条件。

0  to 1

2012年度奖章获得者 2011年度奖章获得者

发表于 2015-9-8 14:55 |显示全部楼层
此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
交易人生 发表于 2015-9-8 13:40
16位的,如果地址是(2进制)00,寻址是11; 如果是10,寻址是01;这个都是对的。或者说vector是0和2 , ...

补充一点,很多32位的cpu,理论上address bus的那些管脚应当是从a0-a31,实际情况是厂家只做成a2-a31,省了2个管脚,但寻址肯定是从0,4,8,这个以4增加32位序列,直接把数据押到register或者dma里,不可能有奇数内存访问,1,3,5等。
0  to 1
头像被屏蔽

禁止发言

发表于 2015-9-9 12:12 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
交易人生 发表于 2015-9-8 13:40
16位的,如果地址是(2进制)00,寻址是11; 如果是10,寻址是01;这个都是对的。或者说vector是0和2 , ...


大哥,我还是要来跟你较真一下,认为你对16位访问的解释不对(8位的那个我无疑议,请不用讨论)。
大饼同学,也欢迎你加入啊。哈哈

举个例子讨论吧,
下面几个Macro是在其他文件中定义的,被我摘录过来。
#define UINT32 unsigned int;              (32位无符号整数)
#define UINT16 unsigned short;          (16位无符号整数)
#typedef UINT16 CYG_WORD16;       (取个新名字,用于操作16位字)
#typedef UINT32 CYG_ADDRWORD; (取个新名字。地址都是32位的)

我们来访问基地址是CYG_ADDRWORD base = 0xE000D000,读取16位放入变量UINT16 Temp里面。

HAL_READ_UINT16(base, Temp);

#define HAL_READ_UINT16( _register_, _value_ ) \
        ((_value_) = *((volatile CYG_WORD16 *)((CYG_ADDRWORD)(_register_)^3)))


macro展开后就是

Temp = * ( (volatile UINT16 *) ( 0xE000D000 ^ 3) );
也就是
Temp = *( volatile unsigned short *) 0xE000D003;

从地址0xE000D003连续读取2个字节,0xE000D003 和 0xE000D004。

但是0xE000D004已经不是本寄存器了,越界啦!这个就是我想说的问题。
你怎么看?
头像被屏蔽

禁止发言

发表于 2015-9-9 12:19 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
大饼 发表于 2015-9-8 12:11
这不是 addr +3 啊.  是addr  0 -> 3, 1->2, 2->1, 3->0
你自己花个表, 用HAL_READ_UINT8 推演一遍就明白 ...

方便的时候来回复一下我上面的帖子,谢谢。

退役斑竹

发表于 2015-9-9 13:19 |显示全部楼层
此文章由 大饼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 大饼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yichuan 发表于 2015-9-9 11:12
大哥,我还是要来跟你较真一下,认为你对16位访问的解释不对(8位的那个我无疑议,请不用讨论)。
大饼同 ...


又仔细看了一遍. 然后在stm32F4板子上跑了
按照这个定义 目前看来big endian下 HAL_READ_UINT16

#define HAL_READ_UINT16( _register_, _value_ ) \
        ((_value_) = *((volatile CYG_WORD16 *)((CYG_ADDRWORD)(_register_)^3)))

ms是错了.

应该是
#define HAL_READ_UINT16( _register_, _value_ ) \
        ((_value_) = *((volatile CYG_WORD16 *)((CYG_ADDRWORD)(_register_)^2)))

问题是ecos这么成熟的 rtos怎么会有这种低级的bug?
专攻电子电路
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2015-9-9 14:04 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
大饼 发表于 2015-9-9 12:19
又仔细看了一遍. 然后在stm32F4板子上跑了
按照这个定义 目前看来big endian下 HAL_READ_UINT16

哇,你真是实干家,这么快就验证了。谢谢!
我只能掰着指头“验证”了, 什么时候能教我一下搭建平台,移植系统吗?

base^2 这个写法也不算完美,我的话会先((base & 0xFFFFFFFC) + 2 ), 或者直接base+2,因为我相信base只能32位对齐,把地址偏移2字节,非常直观的理解。

我看了下,在eCos 3.0里面HAL/ARM/arch/version/include/hal_io.h 也有这个问题。我目前看的是2.0,别人给的SDK。
幸好是用小头模式,不然错误大了。

退役斑竹

发表于 2015-9-9 14:58 |显示全部楼层
此文章由 大饼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 大饼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 大饼 于 2015-9-9 13:59 编辑
yichuan 发表于 2015-9-9 13:04
哇,你真是实干家,这么快就验证了。谢谢!
我只能掰着指头“验证”了, 什么时候能教我一下搭建平台,移 ...


我前面已经说过了 arm  不需要32位对齐. LDRH 只需要偶数位address就ok. 事实上有些arm cortex芯片像stm32奇数地址也不会报错的

搭个平台很简单的.  到element14 or rs component花20多刀买块 stm32F4 discovery 板子就行了. 还有更便宜的15刀的. onboard debugger. ide用 keil mdk arm. free license可以编译up to 32K code size. 不过跑ecos估计size不够了. full license 要8000aud多一个.
专攻电子电路
头像被屏蔽

禁止发言

发表于 2015-9-9 15:13 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
大饼 发表于 2015-9-9 13:58
我前面已经说过了 arm  不需要32位对齐. LDRH 只需要偶数位address就ok. 事实上有些arm cortex芯片像stm3 ...

我相信每个芯片都是可以字节寻址的,毕竟读写RAM和一些寄存器(比如串口)是需要字节访问的。我说的32位对齐是指寄存器的地址都是厂家定义好的。
访问寄存器的时候完全可以用奇数地址(指令可能根本不需要校验最低2位是否00),但是访问的东西是不是你想要的就看芯片和程序怎么写了。为了不出错,还是32位对齐最简单直接。

KEIL我也下载了,License嘛,嘿嘿,有解码的,学习用还是够了。

我是从来没有移植过OS,心里没底。

2012年度奖章获得者 2011年度奖章获得者

发表于 2015-9-9 18:11 |显示全部楼层
此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yichuan 发表于 2015-9-9 11:12
大哥,我还是要来跟你较真一下,认为你对16位访问的解释不对(8位的那个我无疑议,请不用讨论)。
大饼同 ...

我也搞不明白了,因为embedded c++都是为特定系统搞定的,基本是针对一个系列,没环境只能猜了,另外,如果有相关的编译器compiler,编译了一下成汇编,可能更好理解一些。
0  to 1

2012年度奖章获得者 2011年度奖章获得者

发表于 2015-9-9 18:17 |显示全部楼层
此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
大饼 发表于 2015-9-9 12:19
又仔细看了一遍. 然后在stm32F4板子上跑了
按照这个定义 目前看来big endian下 HAL_READ_UINT16

stm32F4 是big endian的体系结构?
0  to 1
Advertisement
Advertisement

2012年度奖章获得者 2011年度奖章获得者

发表于 2015-9-9 18:23 |显示全部楼层
此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yichuan 发表于 2015-9-9 14:13
我相信每个芯片都是可以字节寻址的,毕竟读写RAM和一些寄存器(比如串口)是需要字节访问的。我说的32位 ...

在我的记忆里,intel 有几款80386,地址线只有a2-a31.
0  to 1

退役斑竹

发表于 2015-9-9 19:44 来自手机 |显示全部楼层
此文章由 大饼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 大饼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
交易人生 发表于 2015-9-9 17:17
stm32F4 是big endian的体系结构?

Little endian.
只是用来验证一下

2012年度奖章获得者 2011年度奖章获得者

发表于 2015-9-9 19:51 |显示全部楼层
此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
大饼 发表于 2015-9-9 18:44
Little endian.
只是用来验证一下

体系结构不同,验证不了的。
0  to 1
头像被屏蔽

禁止发言

发表于 2015-9-21 13:46 |显示全部楼层
此文章由 yichuan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yichuan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
大饼 发表于 2015-9-9 13:58
我前面已经说过了 arm  不需要32位对齐. LDRH 只需要偶数位address就ok. 事实上有些arm cortex芯片像stm3 ...

请教一个问题,我发现这个源程序是用Visual Studio环境开发的,从文件名称和一些内容可以发现这点。
我只知道VS下面有VC,VB什么的。
如果想编译嵌入式系统的程序,就需要相应的compiler, linker,assembler什么的。
想问下,VS下面可以加载不同的编译器吗?

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部