Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
48c0e025
D
Docs
项目概览
OpenHarmony
/
Docs
1 年多 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
48c0e025
编写于
7月 04, 2022
作者:
O
openharmony_ci
提交者:
Gitee
7月 04, 2022
浏览文件
操作
浏览文件
下载
差异文件
!5574 【轻量级 PR】:「OpenHarmony贡献者计划2022」Optimize some contents and formats.
Merge pull request !5574 from Mr_YX/N/A
上级
437e374e
5073afbd
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
24 addition
and
24 deletion
+24
-24
zh-cn/contribute/OpenHarmony-64bits-coding-guide.md
zh-cn/contribute/OpenHarmony-64bits-coding-guide.md
+24
-24
未找到文件。
zh-cn/contribute/OpenHarmony-64bits-coding-guide.md
浏览文件 @
48c0e025
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
OpenHarmony的目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。具有“硬件互助,资源共享”、“一次开发,多端部署”、“统一OS,弹性部署”的技术特性。
OpenHarmony的目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。具有“硬件互助,资源共享”、“一次开发,多端部署”、“统一OS,弹性部署”的技术特性。
OpenHarmony支持三种系统类型:
OpenHarmony支持三种系统类型:
1.
轻量系统(mini system),面向MCU类处理器(例如Arm Cortex-M、RISC-V 32位)的轻量设备,硬件资源极其有限,支持的设备最小内存为128KiB
;
1.
轻量系统(mini system),面向MCU类处理器(例如Arm Cortex-M、RISC-V 32位)的轻量设备,硬件资源极其有限,支持的设备最小内存为128KiB
2.
小型系统(small system),面向应用处理器(例如Arm Cortex-A 64位)的设备,支持的设备最小内存为1MiB
2.
小型系统(small system),面向应用处理器(例如Arm Cortex-A 64位)的设备,支持的设备最小内存为1MiB
3.
标准系统(standard system),面向应用处理器(例如Arm Cortex-A 64位)的设备,支持的设备最小内存为128MiB
3.
标准系统(standard system),面向应用处理器(例如Arm Cortex-A 64位)的设备,支持的设备最小内存为128MiB
...
@@ -21,7 +21,7 @@ OpenHarmony支持三种系统类型:
...
@@ -21,7 +21,7 @@ OpenHarmony支持三种系统类型:
#### 数据类型差异
#### 数据类型差异
大部分的32位系统采用的是ILP32,即int、long和pointer是32位长度。大部分的64位系统采用的是LP64,即long、long long、pointer是64位长度。Windows系统采用的是LLP64,即long long和pointer是64位长度。各系统基本数据长度对比如下表所示:
大部分的32位系统采用的是ILP32,即int、long和pointer是32位长度。大部分的64位系统采用的是LP64,即long、long long、pointer是64位长度。Windows系统采用的是LLP64,即long long和pointer是64位长度。各系统基本数据
类型
长度对比如下表所示:
|
**TYPE**
|
**ILP32**
|
**LP64**
|
**LLP64**
|
**LP32**
|
**ILP64**
|
|
**TYPE**
|
**ILP32**
|
**LP64**
|
**LLP64**
|
**LP32**
|
**ILP64**
|
| --------- | --------- | -------- | --------- | -------- | --------- |
| --------- | --------- | -------- | --------- | -------- | --------- |
...
@@ -35,31 +35,31 @@ OpenHarmony支持三种系统类型:
...
@@ -35,31 +35,31 @@ OpenHarmony支持三种系统类型:
| size_t |
**4**
|
**8**
|
**8**
| 4 | 8 |
| size_t |
**4**
|
**8**
|
**8**
| 4 | 8 |
| pointer |
**4**
|
**8**
|
**8**
| 4 | 8 |
| pointer |
**4**
|
**8**
|
**8**
| 4 | 8 |
上表中只包含了部分基本类型,下表分别将ILP32和LP64的sizeof和print
`
进行对比,展示了更全面的常量和类型对应的差异:
上表中只包含了部分基本类型,下表分别将ILP32和LP64的sizeof和print进行对比,展示了更全面的常量和类型对应的差异:
| Type | ILP32 sizeof | ILP32 print | LP64 sizeof | LP64 print | 备注 |
| Type | ILP32 sizeof | ILP32 print | LP64 sizeof | LP64 print | 备注
|
| ------------------ | ------------ | ----------- | ----------- | ---------- | ------ |
| ------------------ | ------------ | ----------- | ----------- | ---------- | ------ |
| bool | 1 | %u | 1 | %u | C++ |
| bool | 1 | %u | 1 | %u | C++ |
| char | 1 | %d或%c | 1 | %d或%c | |
| char | 1 | %d或%c | 1 | %d或%c |
|
| unsigned char | 1 | %u | 1 | %u | |
| unsigned char | 1 | %u | 1 | %u | |
| short | 2 | %d | 2 | %d | |
| short | 2 | %d | 2 | %d | |
| unsigned short | 2 | %u | 2 | %u | |
| unsigned short | 2 | %u | 2 | %u | |
| int | 4 | %d | 4 | %d | |
| int | 4 | %d | 4 | %d | |
| unsigned int | 4 | %u | 4 | %u | |
| unsigned int | 4 | %u | 4 | %u | |
| long | 4 | %ld | **8** | %ld | 有差异 |
| long | 4 | %ld |
**8**
| %ld | 有差异
|
| unsigned long | 4 | %lu | **8** | %lu | 有差异 |
| unsigned long | 4 | %lu |
**8**
| %lu | 有差异
|
| long int | 4 | %ld | **8** | %ld | 有差异 |
| long int | 4 | %ld |
**8**
| %ld | 有差异
|
| unsigned long int | 4 | %lu | **8** | %lu | 有差异 |
| unsigned long int | 4 | %lu |
**8**
| %lu | 有差异
|
| long long | 8 | %lld | 8 | %lld | |
| long long | 8 | %lld | 8 | %lld | |
| unsigned long long | 8 | %llu | 8 | %llu | |
| unsigned long long | 8 | %llu | 8 | %llu | |
| type
* | 4 | %p | **8** | %p | 有差异
|
| type
\*
| 4 | %p |
**8**
| %p | 有差异
|
| pid_t | 4 | %d | 4 | %d | |
| pid_t | 4 | %d | 4 | %d | |
| socklen_t | 4 | %u | 4 | %u | |
| socklen_t | 4 | %u | 4 | %u | |
| off_t | 4 | %zd | **8** | %zd | 有差异 |
| off_t | 4 | %zd |
**8**
| %zd | 有差异
|
| time_t | 4 | %zd | 8 | %zd | 有差异 |
| time_t | 4 | %zd | 8 | %zd | 有差异
|
| pthread_t | 4 | %zu | **8** | %zu | 有差异 |
| pthread_t | 4 | %zu |
**8**
| %zu | 有差异
|
| size_t | 4 | %zu | 8 | %zu | 有差异 |
| size_t | 4 | %zu | 8 | %zu | 有差异
|
| ssize_t | 4 | %zd | **8** | %zd | 有差异 |
| ssize_t | 4 | %zd |
**8**
| %zd | 有差异
|
#### 数据结构对齐的差异
#### 数据结构对齐的差异
...
@@ -97,7 +97,7 @@ typedef struct tagFoo {
...
@@ -97,7 +97,7 @@ typedef struct tagFoo {
#### 【规则】开发者贡献的代码应当遵循此规范,编写出可同时应用于32位和64位的代码
#### 【规则】开发者贡献的代码应当遵循此规范,编写出可同时应用于32位和64位的代码
【说明】由于OpenHarmony会长期同时存在32位的运行环境和64位的运行环境,
而
为了代码的一致性,开发者在编码时需要充分考虑代码的可移植能力。
【说明】由于OpenHarmony会长期同时存在32位的运行环境和64位的运行环境,为了代码的一致性,开发者在编码时需要充分考虑代码的可移植能力。
### 数据类型定义和格式化
### 数据类型定义和格式化
...
@@ -121,11 +121,11 @@ typedef struct tagFoo {
...
@@ -121,11 +121,11 @@ typedef struct tagFoo {
| double | 8 | 8 | %lf | 双精度浮点数 |
| double | 8 | 8 | %lf | 双精度浮点数 |
| bool | 1 | 1 | %d | 布尔类型 |
| bool | 1 | 1 | %d | 布尔类型 |
| uintptr_t |
**4**
|
**8**
| %zu | 会根据32位和64位的不同定义为不同的长度,用于可能存储指针的场景 |
| uintptr_t |
**4**
|
**8**
| %zu | 会根据32位和64位的不同定义为不同的长度,用于可能存储指针的场景 |
| type
* | **4** | **8** | %p | type
*,可变长度类型,与uintptr_t等价,存在类型转换时建议使用uintptr_t |
| type
\*
|
**4**
|
**8**
| %p | type
\
*
,可变长度类型,与uintptr_t等价,存在类型转换时建议使用uintptr_t |
| nullptr_t |
**4**
|
**8**
| %p | 指针初始化 |
| nullptr_t |
**4**
|
**8**
| %p | 指针初始化 |
| pid_t | 4 | 4 | %d | Linux内置,固定长度 |
| pid_t | 4 | 4 | %d | Linux内置,固定长度 |
| socklen_t | 4 | 4 | %u | Linux内置,固定长度 |
| socklen_t | 4 | 4 | %u | Linux内置,固定长度 |
| off_t/time_t | **4** | **8** | %zd | 可变长类型,有符号 |
| off_t/time_t |
**4**
|
**8**
| %zd | 可变长
度
类型,有符号 |
| size_t/pthread_t |
**4**
|
**8**
| %zu | 可变长度类型,无符号,仅用于调用库函数的兼容性要求(比如底层API中使用了size_t) |
| size_t/pthread_t |
**4**
|
**8**
| %zu | 可变长度类型,无符号,仅用于调用库函数的兼容性要求(比如底层API中使用了size_t) |
上述类型定义在stddef.h(C)和cstdint(C++)标准库中,在采用#define重定义相关类型时,其源头应来自于上述类型。
上述类型定义在stddef.h(C)和cstdint(C++)标准库中,在采用#define重定义相关类型时,其源头应来自于上述类型。
...
@@ -353,13 +353,13 @@ p = (int32_t *)malloc(sizeof(p) * ELEMENTS_NUMBER);
...
@@ -353,13 +353,13 @@ p = (int32_t *)malloc(sizeof(p) * ELEMENTS_NUMBER);
【样例】
【样例】
```
c
```
c
#pragma pack(push)
#
保存当前的对齐方式
#pragma pack(push)
//
保存当前的对齐方式
#pragma pack(1)
#
设置对齐方式为1字节对齐
#pragma pack(1)
//
设置对齐方式为1字节对齐
struct
test
struct
test
{
{
......
......
};
};
#pragma pack(pop)
#
恢复之前的对齐方式
#pragma pack(pop)
//
恢复之前的对齐方式
```
```
#### 【规则】涉及多机通信的消息结构体,需要对齐统一。基于兼容性考虑,可优先采用1字节对齐;禁止使用8字节对齐和64位数据类型以避免与32位系统通信错误
#### 【规则】涉及多机通信的消息结构体,需要对齐统一。基于兼容性考虑,可优先采用1字节对齐;禁止使用8字节对齐和64位数据类型以避免与32位系统通信错误
...
@@ -494,7 +494,7 @@ printf("t2 = %lu\n", t2);
...
@@ -494,7 +494,7 @@ printf("t2 = %lu\n", t2);
#### 【规则】当需要将指针作为基址,再按照字节计算偏移时,指针需要强制转换为uintptr_t或uint8_t *等单字节指针类型
#### 【规则】当需要将指针作为基址,再按照字节计算偏移时,指针需要强制转换为uintptr_t或uint8_t *等单字节指针类型
【说明】如果转换为整型,采用uint32_t强转,会出现指针被截断的情况,因此需要转换为uintptr_t。也可转换为单字节宽度的指针类型,如uint8_t
*、char *等,转为上述方式后,偏移均被理解为字节。void
*类型实际也会按照1字节进行偏移,但为了类型明确化,建议使用前面更明确的类型代替。
【说明】如果转换为整型,采用uint32_t强转,会出现指针被截断的情况,因此需要转换为uintptr_t。也可转换为单字节宽度的指针类型,如uint8_t
\*
、char
\*
等,转为上述方式后,偏移均被理解为字节。void
\
*
类型实际也会按照1字节进行偏移,但为了类型明确化,建议使用前面更明确的类型代替。
【示例】
【示例】
...
@@ -503,13 +503,13 @@ printf("t2 = %lu\n", t2);
...
@@ -503,13 +503,13 @@ printf("t2 = %lu\n", t2);
void
*
pPkt
=
(
void
*
)((
uint32_t
)
MSG_GET_DATA_ADDR
(
msgAddr
)
+
OFFSET
);
void
*
pPkt
=
(
void
*
)((
uint32_t
)
MSG_GET_DATA_ADDR
(
msgAddr
)
+
OFFSET
);
// 正确
// 正确
void *pPkt = (void *)((uintptr_t)MSG_GET_DATA_ADDR(msgAddr) + OFFSET);// C
void
*
pPkt
=
(
void
*
)((
uintptr_t
)
MSG_GET_DATA_ADDR
(
msgAddr
)
+
OFFSET
);
// C
void
*
pPkt
=
reinterpret_cast
<
void
*>
(
reinterpret_cast
<
uintptr_t
>
(
MSG_GET_DATA_ADDR
(
msgAddr
))
+
OFFSET
);
// C++
void
*
pPkt
=
reinterpret_cast
<
void
*>
(
reinterpret_cast
<
uintptr_t
>
(
MSG_GET_DATA_ADDR
(
msgAddr
))
+
OFFSET
);
// C++
```
```
#### 【规则】禁止指针与uint32_t之间相互赋值,包括函数参数传递
#### 【规则】禁止指针与uint32_t之间相互赋值,包括函数参数传递
【说明】如果要定义的变量可能是不确定长度的指针,使用void *;如果要定义的变量既可以是指针,也可以是整形,使用uintptr_t。
【说明】如果要定义的变量可能是不确定长度的指针,使用void
\
*
;如果要定义的变量既可以是指针,也可以是整形,使用uintptr_t。
【示例】指针与整型的转换
【示例】指针与整型的转换
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录