莫若麦香

Results 4 issues of 莫若麦香

在kservice.c中,提供了rt_memset等标准库函数的等价实现,很方便移植到无libc的平台上。但是gcc似乎并不领情: 在rt_memset末尾有一段针对非对齐地址的逐字节拷贝: ```C while (count--) { *m++ = (char)d; } ``` 用gcc -O2编译这段代码时,生成了这样的汇编: ![y8wGRv4JRV](https://user-images.githubusercontent.com/22676175/176674026-0d005b74-f3d0-4773-a693-fbac2d899f07.jpg) 其直接调用了memset这个符号,但是当然,这个符号是未定义的。 建议解决方案: + 使用gcc编译kservice.c文件时,默认加上编译选项-fno-tree-loop-distribute-patterns来阻止编译器自动生成memset等函数调用 或者: + 在每个CPU平台上分别使用汇编实现memset等函数,并相应定义为rt_memset的别名/宏定义/嵌套调用

向消息队列发送消息时调用: ```C rt_mq_send(&mq, data, data_len); ``` 可发送指定长度的消息。 而在接受时调用: ```C char buff[MAX_SIZE]; rt_mq_recv(&mq, buff, MAX_SIZE, timeout); ``` 无法取到所发送数据的实际长度,必须自己设计数据结构在data中存放长度,造成编程上的不便以及不必要的开销。 建议给recv增加一个可传出实际消息长度的版本,类似这样: ```C rt_err_t rt_mq_recv_with_size(rt_mq_t mq, void *buffer, rt_size_t size, rt_size_t *real_size, rt_int32_t timeout)...

v5.0.0

项目里开了`-Wall -Werror`,集成进去导致编译不过。目前只能把调用`configor`的部分单独做成一个库并关闭`-Werror`选项来workaround。请问作者是否有计划处理一下warning呢?

出发点是看到了在[这个PR](https://github.com/RT-Thread/rt-thread/pull/8042#discussion_r1365147424)中的讨论,其中提到的 `int32 数据赋值在对齐时本来就是原子的` 与我印象中不符,于是查阅了一些资料与各位开发者分享,也希望听听大家的意见。 简单总结一下就是,C/C++中的“赋值”操作并不是原子的,不论从编译器实现上还是语言标准规定上皆是如此,而且变量的地址对齐与否并不影响该结论。 具体可以参考[这篇文章](https://preshing.com/20130618/atomic-vs-non-atomic-operations/) 其中详细解释了引起非原子性的原因。 针对rt-thread中大量存在(maybe)的“直接赋值当成原子操作”的行为,是否有必要集中做一次修改?