您尚未登录。

楼主 # 2023-01-05 16:53:16

echo
会员
注册时间: 2020-04-16
已发帖子: 354
积分: 359.5

RISC-V不支持非对齐地址访问非常坑

隔壁Cortex-M0也不支持非对齐地址访问,代码中uint8_t*指针一旦强转uint16_t*或者uint32_t*,很容易引起HardFault。然而M3/M4就支持非对齐地址访问了,很多历史代码中会存在上面的强制地址转换,M3和M4上运行正常的代码移植到RISC-V以后非常容易踩到地址对齐的坑,代码规模比较大的时候填这些坑还是非常麻烦的。
RV32MAC假想对手是整个Cortex-M系列,M0是整个Cortex-M里面最低端的系列,RISC-V起码应该和M3/M4差不多,非对齐地址访问起码应该作为一个选项存在。

离线

#1 2023-01-05 18:08:31

XIVN1987
会员
注册时间: 2019-08-30
已发帖子: 247
积分: 308.5

Re: RISC-V不支持非对齐地址访问非常坑

是否支持非对齐访问,是实现层面的问题,,RISC-V ISA 本身并不限制是否支持非对齐访问。。

离线

#2 2023-01-05 18:12:20

XIVN1987
会员
注册时间: 2019-08-30
已发帖子: 247
积分: 308.5

Re: RISC-V不支持非对齐地址访问非常坑

《手把手教你设计CPU——RISC-V处理器》上的说明

RISC-V非对齐访问.png

离线

楼主 #3 2023-01-05 18:41:20

echo
会员
注册时间: 2020-04-16
已发帖子: 354
积分: 359.5

Re: RISC-V不支持非对齐地址访问非常坑

XIVN1987 说:

是否支持非对齐访问,是实现层面的问题,,RISC-V ISA 本身并不限制是否支持非对齐访问。。

人家隔壁ARM M0/M3/M4是不是支持是规定了的,这种模棱两可,依赖厂家来实现对齐、非对齐结果就是碎片化。RISC-V应该有一个扩展来约束是否支持非对齐访问操作。

离线

#4 2023-01-05 19:37:49

吴助建
会员
注册时间: 2021-12-08
已发帖子: 104
积分: 17

Re: RISC-V不支持非对齐地址访问非常坑

对齐不对齐,是软件设计方面的问题。
另外,非对齐数据,访问会需要更多的时间周期。
自己设计软件的时候,尽量把数据放在对齐地址上。
同样功能的代码,有些人的代码跑得就是比别人的快,这是有原因的。

离线

#5 2023-01-05 19:51:45

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 846
积分: 722

Re: RISC-V不支持非对齐地址访问非常坑

编译器应该可以处理

离线

#6 2023-01-05 19:56:59

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 566
积分: 691
个人网站

Re: RISC-V不支持非对齐地址访问非常坑

GCC编译器的特定优化选项会自动将不对齐的操作转为对齐操作。

离线

楼主 #7 2023-01-05 22:43:54

echo
会员
注册时间: 2020-04-16
已发帖子: 354
积分: 359.5

Re: RISC-V不支持非对齐地址访问非常坑

海石生风 说:

GCC编译器的特定优化选项会自动将不对齐的操作转为对齐操作。

编译器能力是有限的,uint8_t*指针强制转换uint32_t*编译器就无法处理,大概率会跪。很多解析二进制数据的代码都会这么干。规模庞大的代码填这些坑就非常麻烦。

离线

#8 2023-01-05 23:58:49

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
已发帖子: 458
积分: 325.5
个人网站

Re: RISC-V不支持非对齐地址访问非常坑

在异常处理里面做个软件补丁好了!

离线

#9 2023-01-06 11:31:19

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 566
积分: 691
个人网站

Re: RISC-V不支持非对齐地址访问非常坑

非对齐操作即使支持也应该回避,这所以产生非对齐操作无非是想减少内存复制,但非对齐操作性能太低,不如复制内存对齐起来跑得更快。

最近编辑记录 海石生风 (2023-01-06 11:31:57)

离线

#10 2024-04-07 23:49:46

aquasnake
会员
注册时间: 2024-01-09
已发帖子: 102
积分: 504

Re: RISC-V不支持非对齐地址访问非常坑

非对齐地址可以用c语言强制类型转换,将任意结构体强转到char类型的数组访问

离线

#11 2024-04-07 23:54:44

aquasnake
会员
注册时间: 2024-01-09
已发帖子: 102
积分: 504

Re: RISC-V不支持非对齐地址访问非常坑

这不是cpu内核的事情,cpu内核只是在偶数地址上按照字长的步进幅度增长地址指针,但是你要在奇数地址上保存,也是没有问题,只不过只能用char类型数组了. 其他的结构体,超过1字节长度的变量,编译器都会分配到偶数地址上. 当然,部分编译器你可以有伪指令限制,告诉编译器将你需要的某个变量定义到你指定的地址上(汇编是必须可以的,c语言不同的cpu以及不同的c编译器有不同的伪指令)

离线

#12 2024-04-08 00:00:33

aquasnake
会员
注册时间: 2024-01-09
已发帖子: 102
积分: 504

Re: RISC-V不支持非对齐地址访问非常坑

uint8_t*指针一旦强转uint16_t*或者uint32_t*

uint8_t*强转到uint16_t*等,你必须要将转换后到的变量再与0xff, 否则得到的不是你想要的. 除非在接下来的3个地址空间上都是0.

最近编辑记录 aquasnake (2024-04-08 00:01:17)

离线

#13 2024-04-08 22:37:36

吴助建
会员
注册时间: 2021-12-08
已发帖子: 104
积分: 17

Re: RISC-V不支持非对齐地址访问非常坑

把uint8_t* 指向的实际对象,放在对齐变量,就没有任何问题。
比如:
int i;
uint8_t str[512];
uint8_t* t =(uint8_t*)&str[0];

然后,你再给int* p=(int*)t;
再计算, p++; p+=12; 之类, 都 没有问题。

另外,用malloc()分配的内存,肯定是对齐的。

离线

#14 2024-06-20 09:53:52

sjshe3326
会员
注册时间: 2020-10-19
已发帖子: 125
积分: 69.5

Re: RISC-V不支持非对齐地址访问非常坑

把uint8_t* 指向的实际对象,放在对齐变量,就没有任何问题。
比如:
int i;
uint8_t str[512];
uint8_t* t =(uint8_t*)&str[0];

然后,你再给int* p=(int*)t;
这个就是对齐访问啊。如果str[0]是头 str[1]以后是数据
用uint8_t* t =(uint8_t*)&str[1];

这时候用int* p=(int*)t;     p可能会有不对齐的情况。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn