c语言8位数据和32位或,使用 32位数据类型和 8位数据类型进行操作_c_开发99编程知识库...

变量"数据"已经为 32位宽。 以这种方式移动数据是有效的? 编码器可能已经传递 32位数据,然后屏蔽( & )/ored ( | ) 。 或者还有什么其他影响?

如果我们使用无符号字符代替无符号字符,我们会在LPC21xx中保存内存? 由于寄存器是 32位宽,所以我不确定内部是否做任何分割来节省内存。

由于使用的是 32位 MCU,因此减小可变大小不会使代码变得更快。 它可以能会使它更慢,尽管你可以能也可以节省几个字节的RAM 。

但是,这些是微优化,你不应该关心。 启用优化并将它们保留到编译器。 如果由于某种原因未知,你必须优化你的代码,然后才能使用 uint_fast8_t 。 它是至少 8位,编译器将选择最快的可能类型。

对于 32位CPU上的32位整数,以避免由C 语言中各种复杂的隐式类型提升规则引起的大量微妙的Bug,通常是一个合理的想法。 特别是,在嵌入式系统中,整数升级和类型平衡是引起许多细微 Bug的。 ( 一个 MISRA c 可以帮助防止这种情况。)是否有办法将 8位数据映射到 32位数据的8位位中之一? 在上面的代码中,移位是通过硬编码( 。 <<15或者 <<19等) 完成的。 我们可以避免这种硬编码并使用一些 #defines 来映射比特?

通常你应该避免"幻数"和。 不是为了性能原因,而是为了提高可读性。

最简单的方法是使用 with register 映射,如果你得到了编译器的一个。 如果没有,你将不得不手动 #define:#define REGISTER (*(volatile uint32_t*)0x12345678)

#define REGISTER_SOMETHING 0x00FF0000//some part of the register

然后,定义所有可能的值,如#define REGISTER_SOMETHING_X 0x00010000

#define REGISTER_SOMETHING_Y 0x00020000

...

REGISTER = REGISTER_SOMETHING & REGISTER_SOMETHING_X;

//or just:

REGISTER |= REGISTER_SOMETHING_X;

REGISTER = REGISTER_SOMETHING_X | REGISTER_SOMETHING_Y;

//and so on

或者,如果 register的一部分为变量,则为:#define REGISTER_SOMETHING_VAL(val)

( REGISTER_SOMETHING & ((uint32_t)val <<16) )

...

REGISTER = REGISTER_SOMETHING_VAL(5);

有很多方法可以编写这样的MACROS 和使用它们的代码。 专注于将调用代码转换为可以读且没有"幻数"。 对于更复杂的内容,考虑使用内联函数,而不是像宏一样使用函数。

另外,对于嵌入式系统,如果所有 register 部件都用一个访问或者不同时编写,则考虑它。 在某些情况下,如果不是,根据特定 register的特性,可以能会获得关键的Bug 。 在清除中断掩码 等等 时,需要特别小心,总是要拆卸这些代码,看看哪些机器代码。

一般建议:

始终考虑 endianess,对齐和可移植性。 你可能不会认为代码不会被移植,但是可移植性可能意味着在其他项目中使用你自己的代码。

如果对任何形式的硬件或者数据传输协议映射使用结构/联合,则必须使用 static_assert 确保没有填充或者它的他。 在任何情况下都不使用结构位字段 ! 它们是坏的,因为许多原因,无法可以靠地使用任何形式的程序,至少在嵌入式微控制器应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值