diff --git a/OAT.xml b/OAT.xml index 7fdd19d4790ca814e586c947ae6e80935ab73df9..cbbbd382299bfa3d198ac671b072aaf0ddfb2cd4 100644 --- a/OAT.xml +++ b/OAT.xml @@ -62,7 +62,7 @@ - + diff --git a/docker/sources.list b/docker/sources.list index 1f16f73ce2f17026a31ed7dbdf8df84df619625c..7214e41b134c644eb5ead61417d8d3e8733229b2 100755 --- a/docker/sources.list +++ b/docker/sources.list @@ -1,16 +1,3 @@ -# Copyright (c) 2020 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse diff --git a/docker/standard/dockerfile b/docker/standard/dockerfile index 9f17b6c9c2bbd47baef5a992544c5412df05959f..375d5275d7aca69dd4fd7b6535896873b3bf44d8 100755 --- a/docker/standard/dockerfile +++ b/docker/standard/dockerfile @@ -1,16 +1,3 @@ -# Copyright (c) 2020 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - FROM ubuntu:18.04 WORKDIR /home/openharmony diff --git a/docker/standard/prebuilts_download.sh b/docker/standard/prebuilts_download.sh index cc9f4fa6bca75076f5dc670432d00548d5faf335..9d18aecf02c1beeaf02be1d9a856f4cab142d727 100755 --- a/docker/standard/prebuilts_download.sh +++ b/docker/standard/prebuilts_download.sh @@ -1,16 +1,3 @@ -# Copyright (c) 2020 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - #!/bin/bash # 代码下载目录 code_dir=/home/prebuilts diff --git a/docker/standard/prepare.sh b/docker/standard/prepare.sh index 31cd1a9467ec987cfca8c9d95311ef0eff8790d5..f2b05c06a126f9477f53354c79816c072f327132 100755 --- a/docker/standard/prepare.sh +++ b/docker/standard/prepare.sh @@ -1,16 +1,3 @@ -# Copyright (c) 2020 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - #!/bin/bash WORKDIR=/home/openharmony diff --git a/docker/standard/sources.list b/docker/standard/sources.list index 78030974c6f1729f8d290a59aa3c83f30cc4c472..488dfaa4fab1805cf6315861feb3eb9a5e6d232e 100755 --- a/docker/standard/sources.list +++ b/docker/standard/sources.list @@ -1,17 +1,3 @@ -# Copyright (c) 2020 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main multiverse restricted universe diff --git a/zh-cn/application-dev/js-reference/video.md b/zh-cn/application-dev/js-reference/video.md deleted file mode 100644 index 22d039a80a557722e75d47b3f487be02bca376eb..0000000000000000000000000000000000000000 --- a/zh-cn/application-dev/js-reference/video.md +++ /dev/null @@ -1,210 +0,0 @@ -# video - -- [子组件](#zh-cn_topic_0000001058670744_section9288143101012) -- [属性](#zh-cn_topic_0000001058670744_section2907183951110) -- [事件](#zh-cn_topic_0000001058670744_section3892191911214) -- [方法](#zh-cn_topic_0000001058670744_section45171131134215) -- [示例](#zh-cn_topic_0000001058670746_section16867208402) - -视频播放组件。 - -## 子组件 - -不支持。 - -## 属性 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

类型

-

默认值

-

必填

-

描述

-

src

-

string

-

-

-

-

播放视频内容的路径。

-

muted

-

boolean

-

false

-

-

视频是否静音播放。

-

autoplay

-

boolean

-

false

-

-

视频是否自动播放。

-

controls

-

boolean

-

true

-

-

控制视频播放的控制栏是否显示,如果设置为false,则不显示控制栏。默认为true,由系统决定显示或隐藏控制栏。

-
- -## 事件 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

start

-

-

-

播放时触发该事件。

-

pause

-

-

-

暂停时触发该事件。

-

finish

-

-

-

播放结束时触发该事件。

-

error

-

-

-

播放失败时触发该事件。

-

seeking

-

{ currenttime: value(秒) }

-

操作进度条过程时上报时间信息,单位为s。

-

seeked

-

{ currenttime: value(秒) }

-

操作进度条完成后,上报播放时间信息,单位为s。

-

timeupdate

-

{ currenttime: value(秒) }

-

播放进度变化时触发该事件,单位为s,更新时间间隔为250ms。

-
- -## 方法 - - - - - - - - - - - - - - - - - - - - -

名称

-

参数

-

描述

-

start

-

-

-

请求播放视频。

-

pause

-

-

-

请求暂停播放视频。

-

setCurrentTime

-

{ currenttime: value(秒) }

-

指定视频播放的进度位置。

-
- -## 示例 - -``` - -
- -
-``` - -``` -/* xxx.js */ -export default { - data: { - event:'', - seekingtime:'', - timeupdatetime:'', - seekedtime:'', - isStart: true, - }, - startCallback:function(){ this.event = '视频开始播放'; }, - pauseCallback:function(){ this.event = '视频暂停播放'; }, - finishCallback:function(){ this.event = '视频播放结束'; }, - errorCallback:function(){ this.event = '视频播放错误'; }, - seekingCallback:function(e){ this.seekingtime = e.currenttime; }, - timeupdateCallback:function(e){ this.timeupdatetime = e.currenttime;}, - change_start_pause: function() { - if(this.isStart) { - this.$element('videoId').pause(); - this.isStart = false; - } else { - this.$element('videoId').start(); - this.isStart = true; - } - } -} -``` diff --git "a/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\346\222\255\346\224\276.md" "b/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\346\222\255\346\224\276.md" index cdfdbb07237b22c4f5b5b800ce15d89ae7ba584e..a2d57bc60fd28c07d9d681e8cf6010365f2889a2 100644 --- "a/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\346\222\255\346\224\276.md" +++ "b/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\346\222\255\346\224\276.md" @@ -1,59 +1,60 @@ -# 音频播放 - -- [导入模块](#s56d19203690d4782bfc74069abb6bd71) -- [权限](#section11257113618419) -- [方法](#section125675489541) -- [createAudioPlayer\(\)](#section582314017253) -- [附录](#section1933416317165) -- [AudioPlayer](#section5174142818365) - - [属性](#section4947115405) - - [play\(\)](#section964512672913) - - [pause\(\)](#section78173258296) - - [stop\(\)](#section122114334296) - - [seek\(number\)](#section1387113816298) - - [setVolume\(number\)](#section164235176552) - - [reset\(\)7+](#section1473283011356) - - [release\(\)](#section9224621145512) - - [事件](#section5453721192911) - - [play](#section87307411494) - - [pause](#section198217471590) - - [stop](#section437616531910) - - [dataLoad](#section982114219106) - - [timeUpdate](#section13687114181014) - - [volumeChange](#section139227715717) - - [finish](#section15181321181018) - - [error](#section5593132921016) - -- [AudioState](#section5181155710523) - -## 导入模块 +# 音频播放 + +- [导入模块](#zh-cn_topic_0000001103383404_s56d19203690d4782bfc74069abb6bd71) +- [权限](#zh-cn_topic_0000001103383404_section11257113618419) +- [方法](#zh-cn_topic_0000001103383404_section125675489541) +- [createAudioPlayer\(\)](#zh-cn_topic_0000001103383404_section582314017253) +- [附录](#zh-cn_topic_0000001103383404_section1933416317165) +- [AudioPlayer](#zh-cn_topic_0000001103383404_section5174142818365) + - [属性](#zh-cn_topic_0000001103383404_section4947115405) + - [play\(\)](#zh-cn_topic_0000001103383404_section964512672913) + - [pause\(\)](#zh-cn_topic_0000001103383404_section78173258296) + - [stop\(\)](#zh-cn_topic_0000001103383404_section122114334296) + - [seek\(number\)](#zh-cn_topic_0000001103383404_section1387113816298) + - [setVolume\(number\)](#zh-cn_topic_0000001103383404_section164235176552) + - [release\(\)](#zh-cn_topic_0000001103383404_section9224621145512) + - [事件](#zh-cn_topic_0000001103383404_section5453721192911) + - [play](#zh-cn_topic_0000001103383404_section87307411494) + - [pause](#zh-cn_topic_0000001103383404_section198217471590) + - [stop](#zh-cn_topic_0000001103383404_section437616531910) + - [dataLoad](#zh-cn_topic_0000001103383404_section982114219106) + - [timeUpdate](#zh-cn_topic_0000001103383404_section13687114181014) + - [volumeChange](#zh-cn_topic_0000001103383404_section139227715717) + - [finish](#zh-cn_topic_0000001103383404_section15181321181018) + - [error](#zh-cn_topic_0000001103383404_section5593132921016) +- [AudioState](#zh-cn_topic_0000001103383404_section5181155710523) + +>![](public_sys-resources/icon-note.gif) **说明:** +>由于权限问题,此部分功能在标准系统暂不可用,待更新。 + +## 导入模块 ``` import audio from '@ohos.multimedia.media'; ``` -## 权限 +## 权限 无 -## 方法 +## 方法 -## createAudioPlayer\(\) +## createAudioPlayer\(\) 创建音频播放的实例来控制音频的播放。 **返回值:** - -

类型

+ + - - - @@ -65,201 +66,164 @@ import audio from '@ohos.multimedia.media'; var audioplayer = audio.createAudioPlayer(); ``` -## 附录 +## 附录 -## AudioPlayer +## AudioPlayer 音频播放器。 -### 属性 +### 属性 - -

类型

说明

+

说明

AudioPlayer

+

AudioPlayer

返回AudioPlayer类实例,失败时返回null。

+

返回AudioPlayer类实例,失败时返回null。

名称

+ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

名称

参数类型

+

参数类型

可读

+

可读

可写

+

可写

说明

+

说明

src

+

src

string

+

string

+

+

音频媒体URI。

+

音频媒体URI。

loop

+

loop

boolean

+

boolean

+

+

音频循环播放属性。

+

音频循环播放属性。

currentTime

+

currentTime

number

+

number

+

+

音频的当前播放阶段。

+

音频的当前播放阶段。

duration

+

duration

number

+

number

+

+

音频播放的时长。

+

音频播放的时长。

state

+

state

AudioState

+

AudioState

+

+

音频播放的状态。

+

音频播放的状态。

-### play\(\) +### play\(\) 开始播放音频资源。 **示例:** ``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.info('Error returned in the prepare() callback.'); - return; - } - console.info('Start to play the audio.'); - audioplayer.play(); -}; - +audioplayer.src = 'common/mydream.mp3'; audioplayer.on('play', (err, action) => { if (err) { - console.info('Error returned in the play() callback.'); + console.log(`err returned in play() callback`); return; } - console.info('Succeeded in playing the audio.'); + console.log('start to play'); + audioplayer.pause(); }; -audioplayer.src = 'common/mydream.mp3'; +audioplayer.play(); ``` -### pause\(\) +### pause\(\) 暂停播放音频资源。 **示例:** ``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.info('Error returned in the prepare() callback.'); - return; - } - console.info('Start to play the audio.'); - audioplayer.play(); -} -audioplayer.on('play', (err, action) => { - if (err) { - console.info('Error returned in the play() callback.'); - return; - } - console.info('Start to pause audio playback.'); - audioplayer.pause(); -}; +audioplayer.src = 'common/mydream.mp3'; audioplayer.on('pause', (err, action) => { if (err) { - console.info('Error returned in the pause() callback.'); + console.log(`err returned in pause() callback`); return; } - console.info('Succeeded in pausing audio playback.'); + console.log('playback pause'); }; -audioplayer.src = 'common/mydream.mp3'; +audioplayer.pause(); ``` -### stop\(\) +### stop\(\) 停止播放音频资源。 **示例:** ``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.info('Error returned in the prepare() callback.'); - return; - } - console.info('Start to play the audio.'); - audioplayer.play(); -}; -audioplayer.on('play', (err, action) => { - if (err) { - console.info('Error returned in the play() callback.'); - return; - } - console.info('Start to pause audio playback.'); - audioplayer.pause(); -}; -audioplayer.on('stop', (err, action) => { +audioplayer.src = 'common/mydream.mp3'; +audioplayer.on('stop',(err, action) => { if (err) { - console.info('Error returned in the stop() callback.'); + console.log(`err returned in stop() callback`); return; } - console.info('Succeeded in stopping audio playback.'); + console.log('playback stop'); }; -audioplayer.src = 'common/mydream.mp3'; +audioplayer.stop(); ``` -### seek\(number\) +### seek\(number\) 跳转到指定播放位置。 **参数:** - -

参数名

+ + - - - - - - - @@ -268,58 +232,46 @@ audioplayer.src = 'common/mydream.mp3'; **示例:** ``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.info('Error returned in the prepare() callback.'); - return; - } - console.info('Start to play the audio.'); - audioplayer.play(); -}; -audioplayer.on('play', (err, action) => { +audioplayer.src = 'common/mydream.mp3'; +audioplayer.on('timeupdate', (err, action) => { if (err) { - console.info('Error returned in the play() callback.'); + console.log(`err returned in seek() callback`); return; } - console.info('Succeeded in playing the audio.') -}; -audioplayer.on('timeUpdate', (seekTime, action) => { - console.info('Seek time returned in the seek() callback: ' + seekTime); var newTime = audioplayer.currenTime; - if(newTime == 30000) { - console.info('Seek succeeded. New time: ' + newTime); + if(newTime = 30000) { + console.info('Seek success, new time : ' + newTime); } else { - console.info('Seek failed.'); + console.info('Seek Failed'); } }; -audioplayer.src = 'common/mydream.mp3'; audioplayer.seek(30000); ``` -### setVolume\(number\) +### setVolume\(number\) 设置音量。 **参数:** - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

timeMs

+

timeMs

number

+

number

+

想要跳转到的时间点。

+

想要跳转到的时间点。

参数名

+ + - - - - - - - @@ -328,58 +280,18 @@ audioplayer.seek(30000); **示例:** ``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.error('Error returned in the prepare() callback.'); - return; - } - console.info('Start to play the audio.'); - audioplayer.play(); -}; -audioplayer.on('play', (err, action) => { - if (err) { - console.error('Error returned in the play() callback.'); - return; - } - console.info('Succeeded in playing the audio.') -}; -audioplayer.on('volumeChange', (err, action) => { - if (err) { - console.error('Error returned in the setVolume() callback.'); - return; - } - console.info('Playback volume changed.'); -}; audioplayer.src = 'common/mydream.mp3'; -audioplayer.setVolume(0.5); -``` - -### reset\(\)7+ - -切换播放音频资源。 - -**示例:** - -``` -audioplayer.on('dataload', (err, action) => { - if (err) { - console.error('Error returned in the prepare() callback.'); - return; - } - console.info('Start to reset audio playback.'); - audioplayer.reset(); -}; -audioplayer.on('reset', (err, action) => { +audioplayer.on('volumeChange', (err, action) => { if (err) { - console.error('Error returned in the reset() callback.'); + console.log(`err returned in setVolume() callback`); return; } - console.info('Reset succeeded.'); + console.log('playback volume change'); }; -audioplayer.src = 'common/mydream.mp3'; +audioplayer.setVolume(30); ``` -### release\(\) +### release\(\) 释放音频资源。 @@ -389,88 +301,83 @@ audioplayer.src = 'common/mydream.mp3'; audioplay.release(); ``` -### 事件 +### 事件 -### play +### play 在调用play方法后的回调事件。 -### pause +### pause 在调用pause方法后的回调事件。 -### stop +### stop 在调用stop方法后的回调事件。 -### dataLoad +### dataLoad 在音频数据加载后的回调事件。 -### timeUpdate +### timeUpdate 在播放时间改变后的回调事件。 -### volumeChange +### volumeChange 在播放音量改变后的回调事件。 -### finish +### finish 在播放完成后的回调事件。 -### error +### error 在播放错误时的回调事件。 - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

vol

+

vol

number

+

number

+

想要设置的音量值(0-1)。

+

想要设置的音量值。

参数名

+ + - - - - -

参数名

类型

+

类型

说明

+

说明

callback

+

callback

ErrorCallback

+

ErrorCallback

错误事件的回调函数。

+

错误事件的回调函数。

-## AudioState +## AudioState 音频播放的状态机。 - -

名称

+ + - - - - - - - - - - diff --git "a/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\347\256\241\347\220\206.md" "b/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\347\256\241\347\220\206.md" index d84cf90dfaeb99cec36facd83a0005c9cd3f39cf..f032c9c90503c18986adfa6d102318579ccf4c40 100644 --- "a/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\347\256\241\347\220\206.md" +++ "b/zh-cn/application-dev/js-reference/\351\237\263\351\242\221\347\256\241\347\220\206.md" @@ -1,78 +1,61 @@ -# 音频管理 - -- [导入模块](#s56d19203690d4782bfc74069abb6bd71) -- [权限](#section11257113618419) -- [getAudioManager\(\): AudioManager](#section84581011418) -- [AudioVolumeType](#section92261857172218) -- [DeviceFlag](#section11285183164210) -- [DeviceRole](#section380038142619) -- [DeviceType](#section11727420122710) -- [AudioRingMode7+](#section14948916131018) -- [AudioManager](#section8265143814015) - - [setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void](#section189141826104616) - - [setVolume\(volumeType: AudioVolumeType, volume: number\): Promise](#section102021249114612) - - [getVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#section4387320194714) - - [getVolume\(volumeType: AudioVolumeType\): Promise](#section04121965119) - - [getMinVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#section188714283511) - - [getMinVolume\(volumeType: AudioVolumeType\): Promise](#section41556389511) - - [getMaxVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void](#section690395418516) - - [getMaxVolume\(volumeType: AudioVolumeType\): Promise](#section155151345217) - - [mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void7+](#section13516136134613) - - [mute\(volumeType: AudioVolumeType, mute: boolean\): Promise7+](#section7519036144616) - - [isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+](#section10684183819585) - - [isMute\(volumeType: AudioVolumeType\): Promise7+](#section6920211145610) - - [isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+](#section380012544121) - - [isActive\(volumeType: AudioVolumeType\): Promise7+](#section1880315481216) - - [setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void7+](#section18572131483613) - - [setRingerMode\(mode: AudioRingMode\): Promise7+](#section55741914143615) - - [getRingerMode\(callback: AsyncCallback\): void7+](#section149044108162) - - [getRingerMode\(\): Promise7+](#section13908210101620) - - [setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void7+](#section1691957174818) - - [setAudioParameter\(key: string, value: string\): Promise7+](#section18121057174820) - - [getAudioParameter\(key: string, callback: AsyncCallback\): void7+](#section1415145714812) - - [getAudioParameter\(key: string\): Promise7+](#section3185577485) - - [getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void](#section11536182020523) - - [getDevices\(deviceFlag: DeviceFlag\): Promise](#section181733125210) - - [setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void7+](#section103558400222) - - [setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise7+](#section1235914401228) - - [isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void7+](#section12363240122219) - - [isDeviceActive\(deviceType: DeviceType\): Promise7+](#section18366184012213) - - [setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void7+](#section14703163618122) - - [setMicrophoneMute\(mute: boolean\): Promise7+](#section56287111791) - - [isMicrophoneMute\(callback: AsyncCallback\): void7+](#section6632141119912) - - [isMicrophoneMute\(\): Promise7+](#section196363111918) - -- [AudioDeviceDescriptor](#section164657411927) - - [属性](#section4947115405) - -- [AudioDeviceDescriptors](#section5181155710523) - -## 导入模块 +# 音频管理 + +- [导入模块](#zh-cn_topic_0000001149807881_s56d19203690d4782bfc74069abb6bd71) +- [权限](#zh-cn_topic_0000001149807881_section11257113618419) +- [方法](#zh-cn_topic_0000001149807881_section1580114415416) +- [getAudioManager\(\)](#zh-cn_topic_0000001149807881_section84581011418) +- [枚举](#zh-cn_topic_0000001149807881_section115029181495) +- [AudioVolumeType](#zh-cn_topic_0000001149807881_section92261857172218) +- [DeviceFlag](#zh-cn_topic_0000001149807881_section11285183164210) +- [DeviceRole](#zh-cn_topic_0000001149807881_section380038142619) +- [DeviceType](#zh-cn_topic_0000001149807881_section11727420122710) +- [附录](#zh-cn_topic_0000001149807881_section1933416317165) +- [AudioManager](#zh-cn_topic_0000001149807881_section8265143814015) + - [setVolume\(AudioVolumeType, number, AsyncCallback\)](#zh-cn_topic_0000001149807881_section189141826104616) + - [setVolume\(AudioVolumeType, number\)](#zh-cn_topic_0000001149807881_section102021249114612) + - [getVolume\(AudioVolumeType, AsyncCallback\)](#zh-cn_topic_0000001149807881_section4387320194714) + - [getVolume\(AudioVolumeType\)](#zh-cn_topic_0000001149807881_section04121965119) + - [getMinVolume\(AudioVolumeType, AsyncCallback\)](#zh-cn_topic_0000001149807881_section188714283511) + - [getMinVolume\(AudioVolumeType\)](#zh-cn_topic_0000001149807881_section41556389511) + - [getMaxVolume\(AudioVolumeType, AsyncCallback\)](#zh-cn_topic_0000001149807881_section690395418516) + - [getMaxVolume\(AudioVolumeType\)](#zh-cn_topic_0000001149807881_section155151345217) + - [getDevices\(DeviceFlag, AsyncCallback\)](#zh-cn_topic_0000001149807881_section11536182020523) + - [getDevices\(DeviceFlag\)](#zh-cn_topic_0000001149807881_section181733125210) + +- [AudioDeviceDescriptor](#zh-cn_topic_0000001149807881_section17427121913310) +- [AudioDeviceDescriptors](#zh-cn_topic_0000001149807881_section5181155710523) + +>![](public_sys-resources/icon-note.gif) **说明:** +>由于权限问题,此部分功能在标准系统暂不可用,待更新。 + +## 导入模块 ``` import audio from '@ohos.multimedia.audio'; ``` -## 权限 +## 权限 无 -## getAudioManager\(\): AudioManager +## 方法 + +## getAudioManager\(\) 获取音频管理器。 **返回值:** - -

名称

描述

+

描述

idle

-

音频播放空闲。

-

playing

+

playing

音频正在播放。

+

音频正在播放。

paused

+

paused

音频暂停播放

+

音频暂停播放

stopped

+

stopped

音频播放停止。

+

音频播放停止。

类型

+ + - - - @@ -84,298 +67,261 @@ import audio from '@ohos.multimedia.audio'; var audioManager = audio.getAudioManager(); ``` -## AudioVolumeType +## 枚举 + +## AudioVolumeType -枚举,音频流类型。 +音频流类型。 - -

类型

说明

+

说明

AudioManager

+

AudioManager

音频管理类。

+

音频管理类。

名称

+ + - - - - - - - -

名称

默认值

+

默认值

描述

+

描述

RINGTONE

+

MEDIA

2

+

1

表示铃声。

+

表示媒体。

MEDIA

+

RINGTONE

3

+

2

表示媒体。

+

表示铃声。

-## DeviceFlag +## DeviceFlag -枚举,可获取的设备种类。 +可获取的设备种类。 - -

名称

+ + - - - - - - - - - - -

名称

默认值

+

默认值

描述

+

描述

OUTPUT_DEVICES_FLAG

+

OUTPUT_DEVICES_FLAG

1

+

1

表示输出设备种类。

+

表示输出设备种类。

INPUT_DEVICES_FLAG

+

INPUT_DEVICES_FLAG

2

+

2

表示输入设备种类。

+

表示输入设备种类。

ALL_DEVICES_FLAG

+

ALL_DEVICES_FLAG

3

+

3

表示所有设备种类。

+

表示所有设备种类。

-## DeviceRole +## DeviceRole -枚举,设备角色。 +设备角色。 - -

名称

+ + - - - - - - - -

名称

默认值

+

默认值

描述

+

描述

INPUT_DEVICE

+

INPUT_DEVICE

1

+

1

输入设备角色。

+

输入设备角色。

OUTPUT_DEVICE

+

OUTPUT_DEVICE

2

+

2

输出设备角色。

+

输出设备角色。

-## DeviceType +## DeviceType -枚举,设备类型。 +设备类型。 - -

名称

+ + - - - - - - - - - - - - - - - - - - - -

名称

默认值

+

默认值

描述

+

描述

INVALID

+

INVALID

0

+

0

无效设备。

+

无效设备。

SPEAKER

+

SPEAKER

1

+

1

扬声器。

+

扬声器。

WIRED_HEADSET

+

WIRED_HEADSET

2

+

2

有线耳机。

+

有线耳机。

BLUETOOTH_SCO

+

BLUETOOTH_SCO

3

+

3

SCO(Synchronous Connection Oriented Link)蓝牙设备。

+

SCO(Synchronous Connection Oriented Link)蓝牙设备。

BLUETOOTH_A2DP

+

BLUETOOTH_A2DP

4

+

4

A2DP(Advanced Audio Distribution Profile )蓝牙设备。

+

A2DP(Advanced Audio Distribution Profile )蓝牙设备。

MIC

+

MIC

5

+

5

麦克风。

+

麦克风。

-## AudioRingMode7+ - -枚举,铃声模式。 - - - - - - - - - - - - - - - - - - - - -

名称

-

默认值

-

描述

-

RINGER_MODE_SILENT

-

0

-

静音模式

-

RINGER_MODE_VIBRATE

-

1

-

震动模式

-

RINGER_MODE_NORMAL

-

2

-

响铃模式

-
+## 附录 -## AudioManager +## AudioManager -管理音频音量和音频设备。 +音频管理器。 -### setVolume\(volumeType: AudioVolumeType, volume: number, callback: AsyncCallback\): void +### setVolume\(AudioVolumeType, number, AsyncCallback\) -设置指定流的音量,使用callback方式返回异步结果。 +设置某个流的音量,使用callback方式作为异步方法。 **参数:** - -

参数名

+ + - - - - - - - - - - - - - - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

volumeType

+

audioType

AudioVolumeType

+

AudioVolumeType

+

音量流类型。

+

流类型。

volume

+

volume

number

+

number

+

音量等级,可设置范围通过getMinVolume和getMaxVolume获取。

+

音量。

callback

+

callback

AsyncCallback<void>

+

AsyncCallback<void>

+

回调表示成功还是失败。

+

回调表示成功还是失败。

-**返回值:** - -无 - **示例:** ``` -audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ +audioManager.setVolume(audio.AudioVolumeType.MEDIA, 30, (err)=>{ if (err) { - console.error('Failed to set the volume. ${err.message}'); + console.error(`failed to set volume ${err.message}`); return; } - console.log('Callback invoked to indicate a successful volume setting.'); + console.log(`Media setVolume successful callback`); }) ``` -### setVolume\(volumeType: AudioVolumeType, volume: number\): Promise +### setVolume\(AudioVolumeType, number\) -设置指定流的音量,使用promise方式返回异步结果。 +设置某个流的音量,使用promise方式作为异步方法。 **参数:** - -

参数名

+ + - - - - - - - - - - - @@ -383,16 +329,16 @@ audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ **返回值:** - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

volumeType

+

audioType

AudioVolumeType

+

AudioVolumeType

+

音量流类型。

+

流类型。

volume

+

volume

number

+

number

+

音量等级,可设置范围通过getMinVolume和getMaxVolume获取。

+

音量。

类型

+ + - - - @@ -401,89 +347,85 @@ audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10, (err)=>{ **示例:** ``` -audioManager.setVolume(audio.AudioVolumeType.MEDIA, 10).then(()=> - console.log('Promise returned to indicate a successful volume setting.'); +audioManager.setVolume(audio.AudioVolumeType.MEDIA, 30).then(()=> + console.log(`Media setVolume successful callback`); ) ``` -### getVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void +### getVolume\(AudioVolumeType, AsyncCallback\) -获取指定流的音量,使用callback方式返回异步结果。 +获取某个流的音量,使用callback方式作为异步方法。 **参数:** - -

类型

说明

+

说明

Promise<void>

+

Promise<void>

Promise回调表示成功还是失败。

+

Promise回调表示成功还是失败。

参数名

+ + - - - - - - - - - - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

volumeType

+

audioType

AudioVolumeType

+

AudioVolumeType

+

音量流类型。

+

流类型。

callback

+

callback

AsyncCallback<number>

+

AsyncCallback<number>

+

回调返回音量大小。

+

回调返回音量大小。

-**返回值:** - -无 - **示例:** ``` -audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { +audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value)=>{ if (err) { - console.error('Failed to obtain the volume. ${err.message}'); + console.error(`failed to get volume ${err.message}`); return; } - console.log('Callback invoked to indicate that the volume is obtained.'); + console.log(`Media getVolume successful callback`); }) ``` -### getVolume\(volumeType: AudioVolumeType\): Promise +### getVolume\(AudioVolumeType\) -获取指定流的音量,使用promise方式返回异步结果。 +获取某个流的音量,使用promise方式作为异步方法。 **参数:** - -

参数名

+ + - - - - - - - @@ -491,16 +433,16 @@ audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { **返回值:** - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

volumeType

+

audioType

AudioVolumeType

+

AudioVolumeType

+

音量流类型。

+

流类型。

类型

+ + - - - @@ -509,89 +451,85 @@ audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { **示例:** ``` -audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the volume is obtained.' + value); +audioManager.getVolume(audio.AudioVolumeType.MEDIA).then((data)=> + console.log(`Media getVolume successful callback`); ) ``` -### getMinVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void +### getMinVolume\(AudioVolumeType, AsyncCallback\) -获取指定流的最小音量,使用callback方式返回异步结果。 +获取某个流的最小音量,使用callback方式作为异步方法。 **参数:** - -

类型

说明

+

说明

Promise<number>

+

Promise<number>

Promise回调返回音量大小。

+

Promise回调返回音量大小。

参数名

+ + - - - - - - - - - - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

volumeType

+

audioType

AudioVolumeType

+

AudioVolumeType

+

音量流类型。

+

流类型。

callback

+

callback

AsyncCallback<number>

+

AsyncCallback<number>

+

回调返回最小音量。

+

回调返回最小音量。

-**返回值:** - -无 - **示例:** ``` -audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the minimum volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the minimum volume is obtained.' + value); +audioManager.getMinVolume(audio.AudioVolumeType.MEDIA, (err, value)=>{ + if (err) { + console.error(`failed to get minvolume ${err.message}`); + return; + } + console.log(`Media getMinVolume successful callback`); }) ``` -### getMinVolume\(volumeType: AudioVolumeType\): Promise +### getMinVolume\(AudioVolumeType\) -获取指定流的最小音量,使用promise方式返回异步结果。 +获取某个流的最小音量,使用promise方式作为异步方法。 **参数:** - -

参数名

+ + - - - - - - - @@ -599,16 +537,16 @@ audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { **返回值:** - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

volumeType

+

audioType

AudioVolumeType

+

AudioVolumeType

+

音量流类型。

+

流类型。

类型

+ + - - - @@ -617,89 +555,85 @@ audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { **示例:** ``` -audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promised returned to indicate that the minimum volume is obtained.' + value); +audioManager.getMinVolume(audio.AudioVolumeType.MEDIA).then((data)=> + console.log(`Media getMinVolume successful callback`); ) ``` -### getMaxVolume\(volumeType: AudioVolumeType, callback: AsyncCallback\): void +### getMaxVolume\(AudioVolumeType, AsyncCallback\) -获取指定流的最大音量,使用callback方式返回异步结果。 +获取某个流的最大音量,使用callback方式作为异步方法。 **参数:** - -

类型

说明

+

说明

Promise<number>

+

Promise<number>

Promise回调返回最小音量。

+

Promise回调返回最小音量。

参数名

+ + - - - - - - - - - - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

volumeType

+

audioType

AudioVolumeType

+

AudioVolumeType

+

音量流类型。

+

流类型。

callback

+

callback

AsyncCallback<number>

+

AsyncCallback<number>

+

回调返回最大音量大小。

+

回调返回最大音量大小。

-**返回值:** - -无 - **示例:** ``` -audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the maximum volume. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the maximum volume is obtained.' + value); +audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value)=>{ + if (err) { + console.error(`failed to get maxvolume ${err.message}`); + return; + } + console.log(`Media getMaxVolume successful callback`); }) ``` -### getMaxVolume\(volumeType: AudioVolumeType\): Promise +### getMaxVolume\(AudioVolumeType\) -获取指定流的最大音量,使用promise方式返回异步结果。 +获取某个流的最大音量,使用promise方式作为异步方法。 **参数:** - -

参数名

+ + - - - - - - - @@ -707,16 +641,16 @@ audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { **返回值:** - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

volumeType

+

audioType

AudioVolumeType

+

AudioVolumeType

+

音量流类型。

+

流类型。

类型

+ + - - - @@ -726,322 +660,84 @@ audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA, (err, value) => { ``` audioManager.getMaxVolume(audio.AudioVolumeType.MEDIA).then((data)=> - console.log('Promised returned to indicate that the maximum volume is obtained.'); -) -``` - -### mute\(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback\): void7+ - -设置指定音量流静音,使用callback方式返回异步结果。 - -**参数:** - - -

类型

说明

+

说明

Promise<number>

+

Promise<number>

Promise回调返回最大音量大小。

+

Promise回调返回最大音量大小。

- - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

mute

-

boolean

-

-

静音状态,true为静音,false为非静音。

-

callback

-

AsyncCallback<void>

-

-

回调表示成功还是失败。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.mute(audio.AudioVolumeType.MEDIA, true, (err) => { - if (err) { - console.error('Failed to mute the stream. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the stream is muted.'); -}) -``` - -### mute\(volumeType: AudioVolumeType, mute: boolean\): Promise7+ - -设置指定音量流静音,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

mute

-

boolean

-

-

静音状态,true为静音,false为非静音。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise回调表示成功还是失败。

-
- -**示例:** - -``` -audioManager.mute(audio.AudioVolumeType.MEDIA, true).then(() => - console.log('Promise returned to indicate that the stream is muted.'); + console.log(`Media getMaxVolume successful callback`); ) ``` -### isMute\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ +### getDevices\(DeviceFlag, AsyncCallback\) -获取指定音量流是否被静音,使用callback方式返回异步结果。 +获取音频设备列表,使用callback方式作为异步方法。 **参数:** - - - - @@ -43,7 +43,7 @@ DevEco Device Tool以插件方式提供,基于Visual Studio Code进行扩展 - @@ -52,7 +52,7 @@ DevEco Device Tool以插件方式提供,基于Visual Studio Code进行扩展 - @@ -70,7 +70,7 @@ DevEco Device Tool以插件方式提供,基于Visual Studio Code进行扩展 -

参数名

+ + - - - - - - - - - - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

volumeType

+

deviceFlag

AudioVolumeType

+

DeviceFlag

+

音量流类型。

+

设备类型的flag。

callback

+

callback

AsyncCallback<boolean>

+

AsyncCallback<AudioDeviceDescriptors>

+

回调返回流静音状态,true为静音,false为非静音。

+

回调,返回设备列表。

-**返回值:** - -无 - **示例:** ``` -audioManager.isMute(audio.AudioVolumeType.MEDIA, (err, value) => { +audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ if (err) { - console.error('Failed to obtain the mute status. ${err.message}'); + console.error(`failed to get getdevices ${err.message}`); return; } - console.log('Callback invoked to indicate that the mute status of the stream is obtained.' + value); -}) -``` - -### isMute\(volumeType: AudioVolumeType\): Promise7+ - -获取指定音量流是否被静音,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<boolean>

-

Promise回调返回流静音状态,true为静音,false为非静音。

-
- -**示例:** - -``` -audioManager.isMute(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the mute status of the stream is obtained.' + value); -) -``` - -### isActive\(volumeType: AudioVolumeType, callback: AsyncCallback\): void7+ - -获取指定音量流是否为活跃状态,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

volumeType

-

AudioVolumeType

-

-

音量流类型。

-

callback

-

AsyncCallback<boolean>

-

-

回调返回流的活跃状态,true为活跃,false为不活跃。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error('Failed to obtain the active status of the stream. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the active status of the stream is obtained.' + value); + console.log(`Media getDevices successful callback`); }) ``` -### isActive\(volumeType: AudioVolumeType\): Promise7+ +### getDevices\(DeviceFlag\) -获取指定音量流是否为活跃状态,使用promise方式返回异步结果。 +获取音频设备列表,使用promise方式作为异步方法。 **参数:** - - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-date.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-date.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-date.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-date.md index 0ee6698e2fc9e1960b5a7a45474570e80633eb9d..aec953c85cfc6d6d66be9eeddde7e41f22c1d30d 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-date.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-date.md @@ -1,4 +1,4 @@ -# date +# date - [命令功能](#section56472016338) - [命令格式](#section16635112512316) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-demsg.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-dmesg.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-demsg.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-dmesg.md index b4e1bbd9eea0c4955f75c2d309474e0ee5a9accf..b753106eeffd6ed3cfe22a233864d2a2f43759ea 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-demsg.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-dmesg.md @@ -1,4 +1,4 @@ -# dmesg +# dmesg - [命令功能](#section4643204919313) - [命令格式](#section6553153635) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-exec.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-exec.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-exec.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-exec.md index c5e437ad7ce79baac800f459b108e50f1c5e9fc2..b4e4f0a9e020a6f03aceee18fed4d0e263092d61 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-exec.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-exec.md @@ -1,4 +1,4 @@ -# exec +# exec - [命令功能](#section4643204919313) - [命令格式](#section6553153635) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-free.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-free.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-free.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-free.md index dcfdc363829fad59170e29da6a16c06a523d86c1..5470f71225fa8388944780a83da7809a4a8a77e1 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-free.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-free.md @@ -1,4 +1,4 @@ -# free +# free - [命令功能](#section175151514841) - [命令格式](#section8488721749) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-help.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-help.md similarity index 96% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-help.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-help.md index 5cd1f81e2809c75f4cf79b8a07910be544c32b7c..6e6a6d8899d8b19e3bc2e7e7d2b745c1d0ef01b6 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-help.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-help.md @@ -1,4 +1,4 @@ -# help +# help - [命令功能](#section991211345413) - [命令格式](#section19103204016410) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-hwi.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-hwi.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-hwi.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-hwi.md index 9414e1f74464147595229f46315a108d4b531eb5..54f8e11e840b5c959f68a0fa00037044ba0d18d8 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-hwi.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-hwi.md @@ -1,4 +1,4 @@ -# hwi +# hwi - [命令功能](#section445335110416) - [命令格式](#section1795712553416) @@ -32,11 +32,11 @@ hwi 1. 显示中断信息(LOSCFG\_CPUP\_INCLUDE\_IRQ关闭) - ![](figure/zh-cn_image_0000001053826366.png) + ![](figure/zh-cn_image_0000001179967527.png) 2. 显示中断信息(LOSCFG\_CPUP\_INCLUDE\_IRQ打开) - ![](figure/zh-cn_image_0000001052810304.png) + ![](figure/zh-cn_image_0000001133848164.png) **表 1** 输出说明 diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-kill.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-kill.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md index 6f1447fbdaa40653977a87780e2d690f953945b5..0d8323058c7be24d7836796cfdfc4da7462daffd 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-kill.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-kill.md @@ -1,4 +1,4 @@ -# kill +# kill - [命令功能](#section366714216619) - [命令格式](#section8833164614615) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-log.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-log.md similarity index 96% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-log.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-log.md index cdadf9859311d2840f490852045b69d409458ad7..2fcad5551a989a2b571a32374bca9938f76cbe70 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-log.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-log.md @@ -1,4 +1,4 @@ -# log +# log - [命令功能](#section128219131856) - [命令格式](#section3894181710519) @@ -70,5 +70,5 @@ log level \[_levelNum_\] ## 输出说明 -![](figure/zh-cn_image_0000001052530298.png) +![](figure/zh-cn_image_0000001179847649.png) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-mem.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-mem.md similarity index 95% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-mem.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-mem.md index 8ff0289bcde30ca0918de0c07ef25194ec5db461..059b1611d10f497762aa7d517b485113868fbcf6 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-mem.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-mem.md @@ -1,4 +1,4 @@ -# memcheck +# memcheck - [命令功能](#section191633812516) - [命令格式](#section428816435510) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-oom.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-oom.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-oom.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-oom.md index e21772b94ea31d1251aa05fcf421ae668bcd6643..436295f423be48b68462bbf62eb35afb69d2a8e3 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-oom.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-oom.md @@ -1,4 +1,4 @@ -# oom +# oom - [命令功能](#section366714216619) - [命令格式](#section8833164614615) @@ -77,7 +77,7 @@ oom -h | --help ## 输出说明 -![](figure/zh-cn_image_0000001053710680.png) +![](figure/zh-cn_image_0000001134008030.png) **表 2** 输出说明 diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-pmm.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-pmm.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-pmm.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-pmm.md index 067433a0b8361351014f52bbe6cb02c523cc1489..39444932521b0144cd4516431afdde003e420e25 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-pmm.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-pmm.md @@ -1,4 +1,4 @@ -# pmm +# pmm - [命令功能](#section445335110416) - [命令格式](#section1795712553416) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-reset.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-reset.md similarity index 92% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-reset.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-reset.md index 22902082a65f3a6e92d713db1b165d7534ed10a1..47c0170574cf4c6898dd4371909fc00f4d2c0e00 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-reset.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-reset.md @@ -1,4 +1,4 @@ -# reset +# reset - [命令功能](#section366714216619) - [命令格式](#section8833164614615) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-sem.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-sem.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-sem.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-sem.md index 4a27c8d10ba557d0821195e56b5d1c930fe1c627..ef768528a5f200621acdf4a774df7324d17a15df 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-sem.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-sem.md @@ -1,4 +1,4 @@ -# sem +# sem - [命令功能](#section366714216619) - [命令格式](#section8833164614615) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-stack.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-stack.md similarity index 96% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-stack.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-stack.md index 8f2904a4b88d28fed4d39423b8ed85de468fb5be..03288fd593e80a780ba0aeb9e879eb3d0168bbab 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-stack.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-stack.md @@ -1,4 +1,4 @@ -# stack +# stack - [命令功能](#section445335110416) - [命令格式](#section1795712553416) @@ -32,7 +32,7 @@ stack **图 1** 系统堆栈使用情况 -![](figure/zh-cn_image_0000001054624363.png) +![](figure/zh-cn_image_0000001133848370.png) **表 1** 输出说明 diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-su.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-su.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-su.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-su.md index a8536a0e4d713453a9cb71b85ad1adb692bfd0b2..e28de2727c85bcd731f17524633d87ab5a6028b7 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-su.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-su.md @@ -1,4 +1,4 @@ -# su +# su - [命令功能](#section297810431676) - [命令格式](#section157131147876) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-swymr.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-swtmr.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-swymr.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-swtmr.md index 07b2b1b04293f87baa0cb9d47448d2913b594b12..6697b64a9a024d0dc570836d3fd3a5f71d233a65 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-swymr.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-swtmr.md @@ -1,4 +1,4 @@ -# swtmr +# swtmr - [命令功能](#section166171064814) - [命令格式](#section424011111682) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-sys.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-sysinfo.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-sys.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-sysinfo.md index 8b59757af0093680a9f16f986e0f3bd864aa6fba..4306973436785f8da283766bacb4e0c30c898b60 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-sys.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-sysinfo.md @@ -1,4 +1,4 @@ -# systeminfo +# systeminfo - [命令功能](#section863016434820) - [命令格式](#section139791817795) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-task.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-task.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-task.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-task.md index 4fb2b3e3f8fcd34a9f102e4a2c75b00ff018445b..1e1ba30f8955b5374f25b8a00f9972946761098a 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-task.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-task.md @@ -1,4 +1,4 @@ -# task +# task - [命令功能](#section0533181714106) - [命令格式](#section1014412308101) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-uname.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-uname.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md index ff2c1b7a3db2ee050c384be9216102e3d8d30eeb..7ee5b951b3fc35988e55fdb19e4b6238cd10ce8b 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-uname.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-uname.md @@ -1,4 +1,4 @@ -# uname +# uname - [命令功能](#section107697383115) - [命令格式](#section162824341116) @@ -68,5 +68,5 @@ uname用于显示当前操作系统名称。语法uname -a | -t| -s| -v 描述un 查看系统信息 -![](figure/zh-cn_image_0000001052370305.png) +![](figure/zh-cn_image_0000001179967909.png) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-vmm.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-vmm.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-vmm.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-vmm.md index 35f4ada41e1f7043ea60d584065662facf59f88a..3ee04442051ae6f83c9afd5a0a6d216f7e3ef45f 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-vmm.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-vmm.md @@ -1,4 +1,4 @@ -# vmm +# vmm - [命令功能](#section445335110416) - [命令格式](#section1795712553416) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-watch.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-watch.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md index c3adf787bbca3f7deb8165ed2c1d8e15204dd168..0adf40f362b6881c58cb390e620b395e7e3233df 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-watch.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-watch.md @@ -1,4 +1,4 @@ -# watch +# watch - [命令功能](#section20643141481314) - [命令格式](#section1075441721316) diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd.md new file mode 100644 index 0000000000000000000000000000000000000000..4766f8598eb8a044d9e89474eb09a9c147a2cb45 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd.md @@ -0,0 +1,47 @@ +# 系统命令 + +- **[cpup](kernel-small-debug-shell-cmd-cpup.md)** + +- **[date](kernel-small-debug-shell-cmd-date.md)** + +- **[dmesg](kernel-small-debug-shell-cmd-dmesg.md)** + +- **[exec](kernel-small-debug-shell-cmd-exec.md)** + +- **[free](kernel-small-debug-shell-cmd-free.md)** + +- **[help](kernel-small-debug-shell-cmd-help.md)** + +- **[hwi](kernel-small-debug-shell-cmd-hwi.md)** + +- **[kill](kernel-small-debug-shell-cmd-kill.md)** + +- **[log](kernel-small-debug-shell-cmd-log.md)** + +- **[memcheck](kernel-small-debug-shell-cmd-mem.md)** + +- **[oom](kernel-small-debug-shell-cmd-oom.md)** + +- **[pmm](kernel-small-debug-shell-cmd-pmm.md)** + +- **[reset](kernel-small-debug-shell-cmd-reset.md)** + +- **[sem](kernel-small-debug-shell-cmd-sem.md)** + +- **[stack](kernel-small-debug-shell-cmd-stack.md)** + +- **[su](kernel-small-debug-shell-cmd-su.md)** + +- **[swtmr](kernel-small-debug-shell-cmd-swtmr.md)** + +- **[systeminfo](kernel-small-debug-shell-cmd-sysinfo.md)** + +- **[task](kernel-small-debug-shell-cmd-task.md)** + +- **[uname](kernel-small-debug-shell-cmd-uname.md)** + +- **[vmm](kernel-small-debug-shell-cmd-vmm.md)** + +- **[watch](kernel-small-debug-shell-cmd-watch.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-shell-details.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-details.md new file mode 100644 index 0000000000000000000000000000000000000000..efb71a669de6aa5a1ad021d4b5f7752cf45f5cdb --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-details.md @@ -0,0 +1,13 @@ +# Shell命令使用详解 + +本章节介绍了系统关键命令的功能、格式、参数范围、使用指南和使用实例。 + +不在本文档范围内的命令,详见[help](kernel-small-debug-shell-cmd-help.md)命令的输出内容,也可以通过命令的“-h | --help”选项,查看该命令的使用帮助。 + +- **[系统命令](kernel-small-debug-shell-cmd.md)** + +- **[文件命令](kernel-small-debug-shell-file.md)** + +- **[网络命令](kernel-small-debug-shell-net.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-cat.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-cat.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-cat.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-cat.md index 89f4a35b9f4980a853899a6db9cb91fe205291ed..0030b579ad07dae61ec0afc920fbda4755ad642a 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-cat.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-cat.md @@ -1,4 +1,4 @@ -# cat +# cat - [命令功能](#section16710153391315) - [命令格式](#section1699392313158) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-cd.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-cd.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-cd.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-cd.md index 61247bfba2e28f771398d9a561063eea382984c8..453cb9e88d81bd2513587483f21b54ecde41573b 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-cd.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-cd.md @@ -1,4 +1,4 @@ -# cd +# cd - [命令功能](#section11690184921316) - [命令格式](#section75695409569) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-chgrp.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-chgrp.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-chgrp.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-chgrp.md index efeccc336faaf14bcab8c01256026cd5e437722c..f3daf2a86cda18702f9c46c8da82b9e7b3f33686 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-chgrp.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-chgrp.md @@ -1,4 +1,4 @@ -# chgrp +# chgrp - [命令功能](#section6103119161418) - [命令格式](#section186958132141) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-chmod.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-chmod.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-chmod.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-chmod.md index 296ab1e3d3890571360162d88a0b139c6c3d00e4..8de5a066f246c26cd7691da5ee3a7438e597343a 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-chmod.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-chmod.md @@ -1,4 +1,4 @@ -# chmod +# chmod - [命令功能](#section13992936121418) - [命令格式](#section63342439147) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-chown.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-chown.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-chown.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-chown.md index 4e63051ec9c9aa6e4e6fea52278e0b9905c08f45..f2a6f3e565219bd015814a52cdaf0ddf16561140 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-chown.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-chown.md @@ -1,4 +1,4 @@ -# chown +# chown - [命令功能](#section247414691513) - [命令格式](#section14773151018159) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-cp.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-cp.md similarity index 96% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-cp.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-cp.md index 299beb065c72efb62c4d54ae5a675b6e0ae7ec20..4ded49759e287e6cb72216fe7b8b90208115f1af 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-cp.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-cp.md @@ -1,4 +1,4 @@ -# cp +# cp - [命令功能](#section6841203041513) - [命令格式](#section24286359150) @@ -64,5 +64,5 @@ cp \[_SOURCEFILE_\] \[_DESTFILE_\] ## 输出说明 **图 1** 显示结果如下 -![](figure/显示结果如下-17.png "显示结果如下-17") +![](figure/显示结果如下-23.png "显示结果如下-23") diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-format.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-format.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-format.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-format.md index 200ddb4fe65b114791341707ba5bea5649f85255..c1fa9baf1bdc23183d1a7a0101141b3d4949c2fb 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-format.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-format.md @@ -1,4 +1,4 @@ -# format +# format - [命令功能](#section1922331919169) - [命令格式](#section249226169) @@ -65,5 +65,5 @@ format <_dev\_inodename_\> <_sectors_\> <_option_\> \[_label_\] 结果如下 -![](figure/zh-cn_image_0000001052370307.png) +![](figure/zh-cn_image_0000001134008686.png) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-is.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-ls.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-is.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-ls.md index 0a1823804e0adc769a94d7dbe961d129310da288..ddba2404bd8e95c2c04063a7c1a1beedaf063c8e 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-is.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-ls.md @@ -1,4 +1,4 @@ -# ls +# ls - [命令功能](#section6538163771614) - [命令格式](#section45881743111616) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-isfd.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-lsfd.md similarity index 93% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-isfd.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-lsfd.md index e1fb8007c539895e4551e5ef6a8d229beba38e93..3a65c4adfaba1728c73e5952a04907ee2f8c9d4a 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-isfd.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-lsfd.md @@ -1,4 +1,4 @@ -# lsfd +# lsfd - [命令功能](#section2053406181716) - [命令格式](#section523771017172) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-mkdir.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-mkdir.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-mkdir.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-mkdir.md index c261ebdca3e37218fb3646c90c3e3a78c854e337..b8d551e7143dbcb51a080e461a930fe248bd7d10 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-mkdir.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-mkdir.md @@ -1,4 +1,4 @@ -# mkdir +# mkdir - [命令功能](#section1083613274175) - [命令格式](#section820913118178) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-mount.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-mount.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-mount.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-mount.md index 103a5d29c4ed79b4ffc4b5b812e07c3ce414e87d..a2bebb1ea133d2ed9c0c998952fa1d1f5930f71d 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-mount.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-mount.md @@ -1,4 +1,4 @@ -# mount +# mount - [命令功能](#section11631837182) - [命令格式](#section1697638111820) @@ -74,5 +74,5 @@ mount后加需要挂载的设备信息、指定目录以及设备文件格式, 将/dev/mmcblk0p0 挂载到/bin1/vs/sd目录 -![](figure/zh-cn_image_0000001051690323.png) +![](figure/zh-cn_image_0000001134008688.png) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-part.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-partinfo.md similarity index 95% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-part.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-partinfo.md index 52ba25e101848e6463d1da65c5b0131059584496..ac4068379ea0a361fbb83f58df7303c604681463 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-part.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-partinfo.md @@ -1,4 +1,4 @@ -# partinfo +# partinfo - [命令功能](#section1777503617199) - [命令格式](#section185501447132114) @@ -48,5 +48,5 @@ partinfo /dev/mmcblk0p0 ## 输出说明 -![](figure/zh-cn_image_0000001052370303.png) +![](figure/zh-cn_image_0000001133848906.png) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-partion.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-partition.md similarity index 96% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-partion.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-partition.md index 458f7f05ef470e91f3813b8bcf8a532aa71b0e99..ee8c8b591edd96cdbc7eb8d173b98854be53144c 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-partion.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-partition.md @@ -1,4 +1,4 @@ -# partition +# partition - [命令功能](#section255095212257) - [命令格式](#section10258056122515) @@ -58,5 +58,5 @@ partition \[_nand / spinor_\] 查看spinor flash分区信息 -![](figure/zh-cn_image_0000001052810300.png) +![](figure/zh-cn_image_0000001179848349.png) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-pwd.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-pwd.md similarity index 95% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-pwd.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-pwd.md index c9d526fc07d50b00ec756a43ebc42a59cd55e531..3ead92783076511baa67bc7d867a0275c944a7c0 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-pwd.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-pwd.md @@ -1,4 +1,4 @@ -# pwd +# pwd - [命令功能](#section197737712267) - [命令格式](#section1544061016267) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-rm.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-rm.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-rm.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-rm.md index b9eb4d90a0a88fc19697f3a7a006b2c957bba948..52898c3dd45ae7ea9897af774ddd32f60fdcac7d 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-rm.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-rm.md @@ -1,4 +1,4 @@ -# rm +# rm - [命令功能](#section181141523142613) - [命令格式](#section8800926132619) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-rmdir.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-rmdir.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-rmdir.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-rmdir.md index c37bbea17c0fd6264888cc1272511434198e54a5..cc762951bbf9ecf7163243d24666786427016c90 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-rmdir.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-rmdir.md @@ -1,4 +1,4 @@ -# rmdir +# rmdir - [命令功能](#section1839611420266) - [命令格式](#section329574512266) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-sta.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-statfs.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-sta.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-statfs.md index 2373311252bb249b17dba03132d8c6fdaf234cc2..09fb5fcb44fcbed6ae73dfa275f3e75ee7ff42eb 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-sta.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-statfs.md @@ -1,4 +1,4 @@ -# statfs +# statfs - [命令功能](#section153921657152613) - [命令格式](#section135391102717) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-sync.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-sync.md similarity index 94% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-sync.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-sync.md index ee4bf7c90220ed5da8fd2d35f1421a1cd7e2fc00..3a6702d0497487a8c21f8f408a2cb16c8dfdb422 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-sync.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-sync.md @@ -1,4 +1,4 @@ -# sync +# sync - [命令功能](#section1285017122274) - [命令格式](#section4731516162712) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-touch.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-touch.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-touch.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-touch.md index 1ec96315b5f0fcd4ae5b92f8b9dc2951dc729128..d98d1833584082919d220bf1cb0e9f129fc1c840 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-touch.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-touch.md @@ -1,4 +1,4 @@ -# touch +# touch - [命令功能](#section17541924112716) - [命令格式](#section866182711274) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-umount.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-umount.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-umount.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-umount.md index def6e2f84bd6f1c8b214ecbfa88ea3dfc4289c56..9a0b489feae2833b7969e65e42cf30affb9ce831 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-umount.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-umount.md @@ -1,4 +1,4 @@ -# umount +# umount - [命令功能](#section365125133520) - [命令格式](#section9615254123512) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-write.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-write.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-write.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-file-write.md index c94ac15b6a2074c51948a04bfe0e53181359c7a1..09fb29883adfa41c083348e5d8d5d4da5b7ac21b 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file-write.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file-write.md @@ -1,4 +1,4 @@ -# writeproc +# writeproc - [命令功能](#section366714216619) - [命令格式](#section8833164614615) diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-shell-file.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file.md new file mode 100644 index 0000000000000000000000000000000000000000..3ba2b47a79660a9639c06b6da8cf738338ae1823 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-file.md @@ -0,0 +1,45 @@ +# 文件命令 + +- **[cat](kernel-small-debug-shell-file-cat.md)** + +- **[cd](kernel-small-debug-shell-file-cd.md)** + +- **[chgrp](kernel-small-debug-shell-file-chgrp.md)** + +- **[chmod](kernel-small-debug-shell-file-chmod.md)** + +- **[chown](kernel-small-debug-shell-file-chown.md)** + +- **[cp](kernel-small-debug-shell-file-cp.md)** + +- **[format](kernel-small-debug-shell-file-format.md)** + +- **[ls](kernel-small-debug-shell-file-ls.md)** + +- **[lsfd](kernel-small-debug-shell-file-lsfd.md)** + +- **[mkdir](kernel-small-debug-shell-file-mkdir.md)** + +- **[mount](kernel-small-debug-shell-file-mount.md)** + +- **[partinfo](kernel-small-debug-shell-file-partinfo.md)** + +- **[partition](kernel-small-debug-shell-file-partition.md)** + +- **[pwd](kernel-small-debug-shell-file-pwd.md)** + +- **[rm](kernel-small-debug-shell-file-rm.md)** + +- **[rmdir](kernel-small-debug-shell-file-rmdir.md)** + +- **[statfs](kernel-small-debug-shell-file-statfs.md)** + +- **[sync](kernel-small-debug-shell-file-sync.md)** + +- **[touch](kernel-small-debug-shell-file-touch.md)** + +- **[writeproc](kernel-small-debug-shell-file-write.md)** + +- **[umount](kernel-small-debug-shell-file-umount.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-guide.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-guide.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-guide.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-guide.md index 7f7327f6b2899440de2152975b099e6127d3d134..44be99dfcddf0f632609240265eb14092e117583 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-guide.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-guide.md @@ -1,8 +1,8 @@ -# Shell命令开发指导 +# Shell命令开发指导 -- [开发指导](#section22071515161018) +- [开发指导](#section13408945163812) -## 开发指导 +## 开发指导 新增Shell命令的典型开发流程如下: @@ -75,7 +75,6 @@ 如:上述“ls”命令注册时,需在build/mk/liteos\_tables\_ldflags.mk中添加“-uls\_shellcmd”。其中-u后面跟SHELLCMD\_ENTRY的第一个参数。 - 2. 动态注册命令方式: 注册函数原型: @@ -125,7 +124,6 @@ osCmdReg(CMD_TYPE_EX, "ls", XARGS, (CMD_CBK_FUNC)osShellCmdLs) ``` - >![](../public_sys-resources/icon-note.gif) **说明:** >命令关键字必须是唯一的,也即两个不同的命令项不能拥有相同的命令关键字,否则只会执行其中一个。 >Shell在执行用户命令时,如果存在多个命令关键字相同的命令,只会执行其中在"help"命令中排序在最前面的一个。 @@ -161,7 +159,7 @@ 4. 输入Shell命令,有两种输入方式: - 在串口工具中直接输入Shell命令。 - - 在telnet工具中输入Shell命令(telnet使用方式详见[telnet](kernel-lite-small-shell-cmd-net-tel.md))。 + - 在telnet工具中输入Shell命令(telnet使用方式详见[telnet](kernel-small-debug-shell-net-telnet.md))。 diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-mag.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-magickey.md similarity index 96% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-mag.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-magickey.md index bc083f86ce0e71e81429707cec8f586d39243d92..3bb14abaf1d095a1a556d904812056e01f96cf30 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-mag.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-magickey.md @@ -1,4 +1,4 @@ -# 魔法键使用方法 +# 魔法键使用方法 - [使用场景](#section2350114718546) - [使用方法](#section3305151511559) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-arp.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-arp.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-arp.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-net-arp.md index 7ff926b41044eafc1ce54354c4c1dabefd753468..d311dc1f5e575ae6078d4ef249982928936ab684 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-arp.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-arp.md @@ -1,4 +1,4 @@ -# arp +# arp - [命令功能](#section201149459368) - [命令格式](#section579813484364) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-dh.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-dhclient.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-dh.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-net-dhclient.md index 05d883c72b22b3a4500af3b13cb9cae3bb5a3f47..01f4445c2f6b531b2dba7c0d85401892dbe42703 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-dh.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-dhclient.md @@ -1,4 +1,4 @@ -# dhclient +# dhclient - [命令功能](#section366714216619) - [命令格式](#section8833164614615) @@ -110,7 +110,7 @@ dhclient -sd 8.8.8.8 ## 使用实例 -![](figure/zh-cn_image_0000001053224218.png) +![](figure/zh-cn_image_0000001179848731.png) ## 输出说明 diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-dns.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-dns.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-dns.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-net-dns.md index 4c32747412df90f3d1c0c9b13998098d0cdd4ced..34806f95381a5cbc404154f4cc88bd33c61aafb2 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-dns.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-dns.md @@ -1,4 +1,4 @@ -# dns +# dns - [命令功能](#section997513673713) - [命令格式](#section146015943711) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ipc.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ifconfig.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ipc.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ifconfig.md index 9ca2b469aa101a985eb5e2002e0b3d563ee6b0d8..9ec90accba30feff77917fa69c4610a45ebbc495 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ipc.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ifconfig.md @@ -1,4 +1,4 @@ -# ifconfig +# ifconfig - [命令功能](#section174940284379) - [命令格式](#section136073203715) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ipd.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ipdebug.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ipd.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ipdebug.md index 56f02cfa01d1b64bf4cfb5adfa763bc52eafa3b1..4949676e2b96284a75e6973a5a59ec52e2b9716d 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ipd.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ipdebug.md @@ -1,4 +1,4 @@ -# ipdebug +# ipdebug - [命令功能](#section10191115553720) - [命令格式](#section124061758123713) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-net.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-netstat.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-net.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-net-netstat.md index b35a6494a18a56fe021cab3206b146565794c382..ee05aa87d8d78a77328e3a369fab492016cf243b 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-net.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-netstat.md @@ -1,4 +1,4 @@ -# netstat +# netstat - [命令功能](#section13469162113816) - [命令格式](#section795712373812) @@ -30,7 +30,7 @@ netstat **图 1** netstat 打印信息 -![](figure/Snipaste_2021-01-26_10-38-58-18.png) +![](figure/Snipaste_2021-01-26_10-38-58-24.png) ## 输出说明 diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ntp.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ntpdate.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ntp.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ntpdate.md index 45bc391ca6d1fe570ccb4c87f8d75f01561e7cd9..1bbb46ba2a4f68421d732cdcf5ee4029c278f974 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ntp.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ntpdate.md @@ -1,4 +1,4 @@ -# ntpdate +# ntpdate - [命令功能](#section38494293815) - [命令格式](#section5503114413387) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ping.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ping.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ping.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ping.md index e1792bc92dd3871588ca67e12a7b56fdc6434230..320d174b419253cd96934d002834d05e4ee424b3 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ping.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ping.md @@ -1,4 +1,4 @@ -# ping +# ping - [命令功能](#section119672573385) - [命令格式](#section869419010390) @@ -95,5 +95,5 @@ ping _-k_ **图 1** ping tftp 服务器地址 -![](figure/Snipaste_2021-01-26_10-38-58-19.png) +![](figure/Snipaste_2021-01-26_10-38-58-25.png) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ping6.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ping6.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ping6.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ping6.md index deec9d577491de4fff472bde4888e4172a3da6ed..252a4bfb1b528a92a249d964696e8a3d6b64491c 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-ping6.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-ping6.md @@ -1,4 +1,4 @@ -# ping6 +# ping6 - [命令功能](#section1057291313393) - [命令格式](#section199901315123919) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-tel.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-telnet.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-tel.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-net-telnet.md index 95e8083c8022da0e67f3e192e8e1fbcb1655c4ce..993a37f128ee19ff0aefd63b20ba720b7deca1e3 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-tel.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-telnet.md @@ -1,4 +1,4 @@ -# telnet +# telnet - [命令功能](#section3551830123913) - [命令格式](#section14897133233918) diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-tftp.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-tftp.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-tftp.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-net-tftp.md index d0a864992ff0d8fe6fb95c5b408eaf9e0b17fc4b..b9dd0d158622a9af0271857fca229d924f08c498 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net-tftp.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-tftp.md @@ -1,4 +1,4 @@ -# tftp +# tftp - [命令功能](#section15142134573911) - [命令格式](#section20958174917394) diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-shell-net.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net.md new file mode 100644 index 0000000000000000000000000000000000000000..85e660cdec14cbaf699cf1eb7d9771dd4c255773 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-net.md @@ -0,0 +1,25 @@ +# 网络命令 + +- **[arp](kernel-small-debug-shell-net-arp.md)** + +- **[dhclient](kernel-small-debug-shell-net-dhclient.md)** + +- **[dns](kernel-small-debug-shell-net-dns.md)** + +- **[ifconfig](kernel-small-debug-shell-net-ifconfig.md)** + +- **[ipdebug](kernel-small-debug-shell-net-ipdebug.md)** + +- **[netstat](kernel-small-debug-shell-net-netstat.md)** + +- **[ntpdate](kernel-small-debug-shell-net-ntpdate.md)** + +- **[ping](kernel-small-debug-shell-net-ping.md)** + +- **[ping6](kernel-small-debug-shell-net-ping6.md)** + +- **[telnet](kernel-small-debug-shell-net-telnet.md)** + +- **[tftp](kernel-small-debug-shell-net-tftp.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-des.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-overview.md similarity index 91% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-des.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-overview.md index 8b7909db2079b4225c6253fee4318d83c3afa16d..0b194732bc595ea3b09050269ee5c3034c601e3a 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-des.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-overview.md @@ -1,4 +1,4 @@ -# Shell介绍 +# Shell介绍 - [注意事项](#section12298165312328) @@ -10,7 +10,7 @@ OpenHarmony内核提供的Shell支持调试常用的基本功能,包含系统 - 网络相关命令:支持查询接到开发板的其他设备的IP、查询本机IP、测试网络连接、设置开发板的AP和station模式等相关功能。 - 新增命令的详细流程可参见[开发指导](kernel-lite-small-shell-guide.md)和[编程实例](kernel-lite-small-shell-sample.md)。 + 新增命令的详细流程可参见[Shell命令开发指导](kernel-small-debug-shell-guide.md)和[Shell命令编程实例](kernel-small-debug-shell-build.md)。 ## 注意事项 diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-shell.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell.md new file mode 100644 index 0000000000000000000000000000000000000000..1c22715ff8c6678cc5249580fbd81e56da6b115e --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell.md @@ -0,0 +1,15 @@ +# Shell + +- **[Shell介绍](kernel-small-debug-shell-overview.md)** + +- **[Shell命令开发指导](kernel-small-debug-shell-guide.md)** + +- **[Shell命令编程实例](kernel-small-debug-shell-build.md)** + +- **[Shell命令使用详解](kernel-small-debug-shell-details.md)** + +- **[魔法键使用方法](kernel-small-debug-shell-magickey.md)** + +- **[用户态异常信息说明](kernel-small-debug-shell-abnormal.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-trace-other-faqs.md b/zh-cn/device-dev/kernel/kernel-small-debug-trace-other-faqs.md new file mode 100644 index 0000000000000000000000000000000000000000..8f1ead1f8b506304b8572a09fd7b3f407c0593ed --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-trace-other-faqs.md @@ -0,0 +1,36 @@ +# 常见问题定位方法 + +- [通过异常信息定位问题](#section695838161711) +- [内存池节点完整性验证](#section362917569179) +- [全局变量踩内存定位方法](#section18971311121816) + +## 通过异常信息定位问题 + +系统异常被挂起后,会在串口看到一些关键寄存器的信息,如图1所示。可通过这些信息定位到异常所在函数和其调用栈关系,为原因分析提供第一手资料。 + +图1 异常信息 + +![](figure/zh-cn_image_0000001173429547.png) + +上图中的异常信息主要解释4个标签: + +**标签1**:标识异常在内核态; + +**标签2**:标识了异常类型(数据异常时,far后的值是系统异常时CPU访问的地址); + +**标签3**:pc的值标识系统异常时执行指令的位置,klr的值一般标识pc所在函数执行完后下一条要执行的命令。(**注:标签4处 traceback 0 lr有值时不用关注klr**)。 + +**标签4**:lr 的值依次标识正常情况下PC要依次执行的指令的位置。 + +对于内核异常打印信息,确定PC和LR的具体位置的指令需要结合out目录下OHOS\_Image.asm(跟烧写的系统镜像OHOS\_Image.bin对应的汇编文件)查看,根据指令所在的位置可确认使用该指令的函数,依次确定LR位置所在的函数,即得到异常发生时的函数调用关系。 + +## 内存池节点完整性验证 + +仅凭上节异常信息定位的基本方法,常常无法直接定位问题所在。并且常常会因为异常的寄存器值而无法对问题进行定位。若怀疑是堆内存越界导致的问题,可以调用内存池完整性检测函数LOS\_MemIntegrityCheck进行检查。函数LOS\_MemIntegrityCheck将会对系统动态内存池所有的节点进行遍历,如果所有节点正常则函数返回0,不会有任何打印,否则将打印相关的错误信息。该函数的入参使用\(VOID \*\)OS\_SYS\_MEM\_ADDR。 + +定位堆内存越界踩的问题,一般是在可能存在问题的业务逻辑代码前后使用LOS\_MemIntegrityCheck,如果该业务代码不存在问题,则前后两次LOS\_MemIntegrityCheck调用不会失败,按前述方式逐步缩小问题定位范围。 + +## 全局变量踩内存定位方法 + +如果已知一个全局变量内存域被踩,可在OHOS\_Image.map文件中找到该全局变量所在的地址,并且特别注意该地址之前最近被使用的变量,有极大概率是前面的变量(尤其数组类型的或会被强转成其他类型的变量)在使用的过程中内存越界,破坏了这个全局变量。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-trace-other-topic.md b/zh-cn/device-dev/kernel/kernel-small-debug-trace-other-topic.md new file mode 100644 index 0000000000000000000000000000000000000000..538a2190f03f0d3890d242f669cc92ac4bfc04ff --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-trace-other-topic.md @@ -0,0 +1,96 @@ +# 临终遗言 + +- [使用场景](#section158501652121514) +- [功能说明](#section1186411122215) +- [参数说明](#section1083765723015) +- [开发流程](#section783435801510) + +## 使用场景 + +在无串口的设备上,将系统异常时打印的信息保存到不丢失的存储介质上,方便对运行时问题进行定位。 + +## 功能说明 + +该调测功能提供了一种用于保存系统异常时打印信息到不丢失存储介质中的机制,用户可自行注册读写异常时打印信息的钩子函数,实现在不同存储介质上保存异常信息的能力,这样方便无串口的设备的问题定位。接口名为LOS\_ExcInfoRegHook,该函数声明在los\_config.h中,函数原型: + +``` +typedef VOID (*log_read_write_fn)(UINT32 startAddr, UINT32 space, UINT32 rwFlag, CHAR *buf); +...... +VOID LOS_ExcInfoRegHook(UINT32 startAddr, UINT32 space, CHAR *buf, log_read_write_fn hook); +``` + +## 参数说明 + +**表 1** LOS\_ExcInfoRegHook 参数说明 + + +

参数名

+ + - - - - - - - @@ -1049,16 +745,16 @@ audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { **返回值:** - -

参数名

类型

+

类型

必填

+

必填

说明

+

说明

volumeType

+

deviceFlag

AudioVolumeType

+

DeviceFlag

+

音量流类型。

+

设备类型的flag。

类型

+ + - - - @@ -1067,1011 +763,59 @@ audioManager.isActive(audio.AudioVolumeType.MEDIA, (err, value) => { **示例:** ``` -audioManager.isActive(audio.AudioVolumeType.MEDIA).then((value) => - console.log('Promise returned to indicate that the active status of the stream is obtained.' + value); +audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> + console.log(`Media getDevices successful callback`); ) ``` -### setRingerMode\(mode: AudioRingMode, callback: AsyncCallback\): void7+ - -设置铃声模式,使用callback方式返回异步结果。 - -**参数:** - - -

类型

说明

+

说明

Promise<boolean>

+

Promise<AudioDeviceDescriptors>

Promise回调返回流的活跃状态,true为活跃,false为不活跃。

+

Promise回调返回设备列表。

- - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

mode

-

AudioRingMode

-

-

音频铃声模式。

-

callback

-

AsyncCallback<void>

-

-

回调返回设置成功或失败。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL, (err) => { - if (err) { - console.error('Failed to set the ringer mode.​ ${err.message}'); - return; - } - console.log('Callback invoked to indicate a successful setting of the ringer mode.'); -}) -``` - -### setRingerMode\(mode: AudioRingMode\): Promise7+ - -设置铃声模式,使用promise方式返回异步结果。 +## AudioDeviceDescriptor -**参数:** +描述音频设备。 - -

参数名

+ + - - - - - - - - - -

名称

类型

+

类型

必填

+

必填

说明

+

描述

mode

+

deviceRole

AudioRingMode

+

DeviceRole

-

音频铃声模式。

-
- -**返回值:** - - - - - - - - - -

类型

-

说明

-

Promise<void>

+

Promise回调返回设置成功或失败。

+

设备角色。

- -**示例:** - -``` -audioManager.setRingerMode(audio.AudioRingMode.RINGER_MODE_NORMAL).then(() => - console.log('Promise returned to indicate a successful setting of the ringer mode.'); -) -``` - -### getRingerMode\(callback: AsyncCallback\): void7+ - -获取铃声模式,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

callback

-

AsyncCallback<AudioRingMode>

-

-

回调返回系统的铃声模式。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.getRingerMode((err, value) => { - if (err) { - console.error('Failed to obtain the ringer mode.​ ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the ringer mode is obtained.' + value); -}) -``` - -### getRingerMode\(\): Promise7+ - -获取铃声模式,使用promise方式返回异步结果。 - -**参数:** - -无 - -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<AudioRingerMode>

-

Promise回调返回系统的铃声模式。

-
- -**示例:** - -``` -audioManager.getRingerMode().then((value) => - console.log('Promise returned to indicate that the ringer mode is obtained.' + value); -) -``` - -### setAudioParameter\(key: string, value: string, callback: AsyncCallback\): void7+ - -音频参数设置,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

被设置的音频参数的键。

-

value

-

string

-

-

被设置的音频参数的值。

-

callback

-

AsyncCallback<void>

-

-

回调返回设置成功或失败。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.setAudioParameter('PBits per sample', '8 bit', (err) => { - if (err) { - console.error('Failed to set the audio parameter. ${err.message}'); - return; - } - console.log('Callback invoked to indicate a successful setting of the audio parameter.'); -}) -``` - -### setAudioParameter\(key: string, value: string\): Promise7+ - -音频参数设置,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

被设置的音频参数的键。

-

value

-

string

-

-

被设置的音频参数的值。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise回调返回设置成功或失败。

-
- -**示例:** - -``` -audioManager.setAudioParameter('PBits per sample', '8 bit').then(() => - console.log('Promise returned to indicate a successful setting of the audio parameter.'); -) -``` - -### getAudioParameter\(key: string, callback: AsyncCallback\): void7+ - -获取指定音频参数值,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

待获取的音频参数的键。

-

callback

-

AsyncCallback<string>

-

-

回调返回获取的音频参数的值。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.getAudioParameter('PBits per sample', (err, value) => { - if (err) { - console.error('Failed to obtain the value of the audio parameter. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the value of the audio parameter is obtained.' + value); -}) -``` - -### getAudioParameter\(key: string\): Promise7+ - -获取指定音频参数值,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

key

-

string

-

-

待获取的音频参数的键。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<string>

-

Promise回调返回获取的音频参数的值。

-
- -**示例:** - -``` -audioManager.getAudioParameter('PBits per sample').then((value) => - console.log('Promise returned to indicate that the value of the audio parameter is obtained.' + value); -) -``` - -### getDevices\(deviceFlag: DeviceFlag, callback: AsyncCallback\): void - -获取音频设备列表,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceFlag

-

DeviceFlag

-

-

设备类型的flag。

-

callback

-

AsyncCallback<AudioDeviceDescriptors>

-

-

回调,返回设备列表。

-
- -**示例:** - -``` -audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (err, value)=>{ - if (err) { - console.error('Failed to obtain the device list. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the device list is obtained.'); -}) -``` - -### getDevices\(deviceFlag: DeviceFlag\): Promise - -获取音频设备列表,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceFlag

-

DeviceFlag

-

-

设备类型的flag。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<AudioDeviceDescriptors>

-

Promise回调返回设备列表。

-
- -**示例:** - -``` -audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data)=> - console.log('Promise returned to indicate that the device list is obtained.'); -) -``` - -### setDeviceActive\(deviceType: DeviceType, active: boolean, callback: AsyncCallback\): void7+ - -设置设备激活状态,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceType

-

DeviceType

-

-

音频设备类型。

-

active

-

boolean

-

-

设备激活状态。

-

callback

-

AsyncCallback<void>

-

-

回调返回设置成功或失败。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true, (err)=> { - if (err) { - console.error('Failed to set the active status of the device. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the device is set to the active status.'); -}) -``` - -### setDeviceActive\(deviceType: DeviceType, active: boolean\): Promise7+ - -设置设备激活状态,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceType

-

DeviceType

-

-

音频设备类型。

-

active

-

boolean

-

-

设备激活状态。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise回调返回设置成功或失败。

-
- -**示例:** - -``` -audioManager.setDeviceActive(audio.DeviceType.SPEAKER, true).then(()=> - console.log('Promise returned to indicate that the device is set to the active status.'); -) -``` - -### isDeviceActive\(deviceType: DeviceType, callback: AsyncCallback\): void7+ - -获取指定设备激活状态,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceType

-

DeviceType

-

-

音频设备类型。

-

callback

-

AsyncCallback<boolean>

-

-

回调返回设备的激活状态。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.isDeviceActive(audio.DeviceType.SPEAKER, (err, value) => { - if (err) { - console.error('Failed to obtain the active status of the device. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the active status of the device is obtained.'); -}) -``` - -### isDeviceActive\(deviceType: DeviceType\): Promise7+ - -获取指定设备激活状态,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

deviceType

-

DeviceType

-

-

音频设备类型。

-
- -**返回值:** - - - - - - - - - - -

Type

-

Description

-

Promise<boolean>

-

Promise回调返回设备的激活状态。

-
- -**示例:** - -``` -audioManager.isDeviceActive(audio.DeviceType.SPEAKER).then((value) => - console.log('Promise returned to indicate that the active status of the device is obtained.' + value); -) -``` - -### setMicrophoneMute\(mute: boolean, callback: AsyncCallback\): void7+ - -设置麦克风静音状态,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

mute

-

boolean

-

-

待设置的静音状态,true为静音,false为非静音。

-

callback

-

AsyncCallback<void>

-

-

回调返回设置成功或失败。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.setMicrophoneMute(true, (err) => { - if (err) { - console.error('Failed to mute the microphone. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the microphone is muted.'); -}) -``` - -### setMicrophoneMute\(mute: boolean\): Promise7+ - -设置麦克风静音状态,使用promise方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

mute

-

boolean

-

-

待设置的静音状态,true为静音,false为非静音。

-
- -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<void>

-

Promise回调返回设置成功或失败。

-
- -**示例:** - -``` -audioManager.setMicrophoneMute(true).then(() => - console.log('Promise returned to indicate that the microphone is muted.'); -) -``` - -### isMicrophoneMute\(callback: AsyncCallback\): void7+ - -获取麦克风静音状态,使用callback方式返回异步结果。 - -**参数:** - - - - - - - - - - - - - - -

参数名

-

类型

-

必填

-

说明

-

callback

-

AsyncCallback<boolean>

-

-

回调返回系统麦克风静音状态,true为静音,false为非静音。

-
- -**返回值:** - -无 - -**示例:** - -``` -audioManager.isMicrophoneMute((err, value) => { - if (err) { - console.error('Failed to obtain the mute status of the microphone. ${err.message}'); - return; - } - console.log('Callback invoked to indicate that the mute status of the microphone is obtained.' + value); -}) -``` - -### isMicrophoneMute\(\): Promise7+ - -获取麦克风静音状态,使用promise方式返回异步结果。 - -**参数:** - -无 - -**返回值:** - - - - - - - - - - -

类型

-

说明

-

Promise<boolean>

-

Promise回调返回系统麦克风静音状态,true为静音,false为非静音。

-
- -**示例:** - -``` -audioManager.isMicrophoneMute().then((value) => - console.log('Promise returned to indicate that the mute status of the microphone is obtained.', + value); -) -``` - -## AudioDeviceDescriptor - -描述音频设备。 - -### 属性 - - - - - - - - - - - - - - - - - - - -

名称

-

参数型

-

可读

-

可写

-

说明

-

deviceRole

-

DeviceRole

-

-

-

设备角色。

-

deviceType

-

DeviceType

+

deviceType

+

DeviceType

+

设备类型。

+

设备类型。

-## AudioDeviceDescriptors +## AudioDeviceDescriptors - - - - - diff --git a/zh-cn/device-dev/kernel/kernel-mini-basic.md b/zh-cn/device-dev/kernel/kernel-mini-basic.md new file mode 100644 index 0000000000000000000000000000000000000000..82230d2f4ae930d8b49d08e90ad817b4afd48181 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-mini-basic.md @@ -0,0 +1,15 @@ +# 基础内核 + +- **[中断管理](kernel-mini-basic-interrupt.md)** + +- **[任务管理](kernel-mini-basic-task.md)** + +- **[内存管理](kernel-mini-basic-memory.md)** + +- **[内核通信机制](kernel-mini-basic-ipc.md)** + +- **[时间管理](kernel-basic-mini-time.md)** + +- **[软件定时器](kernel-mini-basic-soft.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-cpup-basic.md b/zh-cn/device-dev/kernel/kernel-mini-extend-cpup-basic.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-extend-cpup-basic.md rename to zh-cn/device-dev/kernel/kernel-mini-extend-cpup-basic.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-cpup-guide.md b/zh-cn/device-dev/kernel/kernel-mini-extend-cpup-guide.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-extend-cpup-guide.md rename to zh-cn/device-dev/kernel/kernel-mini-extend-cpup-guide.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-cpup.md b/zh-cn/device-dev/kernel/kernel-mini-extend-cpup.md similarity index 32% rename from zh-cn/device-dev/kernel/kernel-lite-mini-extend-cpup.md rename to zh-cn/device-dev/kernel/kernel-mini-extend-cpup.md index e49d8a7175b407625353d87a11996a65bf990992..96919626749f2bf894a040d326964730d9e00c4c 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-cpup.md +++ b/zh-cn/device-dev/kernel/kernel-mini-extend-cpup.md @@ -1,7 +1,7 @@ # CPU占用率 -- **[基本概念](kernel-lite-mini-extend-cpup-basic.md)** +- **[基本概念](kernel-mini-extend-cpup-basic.md)** -- **[开发指导](kernel-lite-mini-extend-cpup-guide.md)** +- **[开发指导](kernel-mini-extend-cpup-guide.md)** diff --git a/zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading-0.md b/zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading-0.md new file mode 100644 index 0000000000000000000000000000000000000000..809498749c51a43008ed83ed19083665dadc6037 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading-0.md @@ -0,0 +1,7 @@ +# 动态加载 + +- **[基本概念](kernel-mini-extend-dynamic-loading-basic.md)** + +- **[开发指导](kernel-mini-extend-dynamic-loading-guide.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading-basic.md b/zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading-basic.md new file mode 100644 index 0000000000000000000000000000000000000000..d18b1cfc921423cd995b056d91972c0eda393639 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading-basic.md @@ -0,0 +1,91 @@ +# 基本概念 + +- [运行机制](#section139861939219) + - [符号表导出](#section15414650102716) + - [ELF文件加载](#section5221181562810) + - [ELF文件链接](#section68441639182817) + +- [ELF支持规格](#section187315541916) + - [ELF支持类型](#section1701552268) + - [ELF共享库编译链接选项](#section17292133274) + + +在硬件资源有限的小设备中,需要通过算法的动态部署能力来解决无法同时部署多种算法的问题。以开发者易用为主要考虑因素,同时考虑到多平台的通用性,LiteOS-M选择业界标准的ELF方案,方便拓展算法生态。LiteOS-M提供类似于dlopen、dlsym等接口,APP通过动态加载模块提供的接口可以加载、卸载相应算法库。如图1所示,APP需要通过三方算法库所需接口获取对应信息输出,三方算法库又依赖内核提供的基本接口,如malloc等。APP加载所需接口,并对相关的未定义符号完成重定位后,APP即可调用该接口完成功能调用。目前动态加载组件只支持arm架构。 + +**图 1** LiteOS-M内核动态加载架构图 +![](figure/LiteOS-M内核动态加载架构图.png "LiteOS-M内核动态加载架构图") + +## 运行机制 + +### 符号表导出 + +共享库调用内核接口需要内核主动暴露动态库所需的接口,如图2所示,该机制将符号信息编译到指定段中,调用SYM\_EXPORT宏即可完成对指定符号的信息导出。符号信息通过结构体SymInfo描述,成员包括符号名和符号地址信息,宏SYM\_EXPORT通过\_\_attribute\_\_编译属性将符号信息导入.sym.\*段中。 + +``` +typedef struct { + CHAR *name; + UINTPTR addr; +} SymInfo; + +#define SYM_EXPORT(func) \ +const SymInfo sym_##func __attribute__((section(".sym."#func))) = { \ + .name = #func, \ + .addr = (UINTPTR)func \ +}; +``` + +**图 2** 导出的符号表信息 +![](figure/导出的符号表信息.png "导出的符号表信息") + +### ELF文件加载 + +加载过程中,根据ELF文件的句柄以及程序头表的段偏移可以得到需要加载到内存的LOAD段,一般有两个段,只读段及读写段,如下所示,可以用readelf -l查看ELF文件的LOAD段信息。如图3所示,根据相应的对齐属性申请物理内存,通过每个段的加载基址及偏移将代码段或数据段写入内存中。 + +``` +$ readelf -l lib.so + +Elf file type is DYN (Shared object file) +Entry point 0x5b4 +There are 4 program headers, starting at offset 52 + +Program Headers: + Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align + EXIDX 0x000760 0x00000760 0x00000760 0x00008 0x00008 R 0x4 + LOAD 0x000000 0x00000000 0x00000000 0x0076c 0x0076c R E 0x10000 + LOAD 0x00076c 0x0001076c 0x0001076c 0x0010c 0x00128 RW 0x10000 + DYNAMIC 0x000774 0x00010774 0x00010774 0x000c8 0x000c8 RW 0x4 + + Section to Segment mapping: + Segment Sections... + 00 .ARM.exidx + 01 .hash .dynsym .dynstr .rel.dyn .rel.plt .init .plt .text .fini .ARM.exidx .eh_frame + 02 .init_array .fini_array .dynamic .got .data .bss + 03 .dynamic +``` + +**图 3** ELF文件的加载过程 +![](figure/ELF文件的加载过程.png "ELF文件的加载过程") + +### ELF文件链接 + +如图4所示,通过ELF文件的.dynamic段获取重定位表,遍历表中每一个需要重定位的条目,再根据需要重定位的符号名在共享库和内核提供的导出符号表中查找相应符号并更新相应的重定位信息。 + +**图 4** ELF文件的链接过程 +![](figure/ELF文件的链接过程.png "ELF文件的链接过程") + +## ELF支持规格 + +### ELF支持类型 + +编译共享库时,添加-fPIC可以编译出位置无关代码(-fPIC为编译选项),此时共享库文件类型为ET\_DYN,其可以加载至任意有效的地址区间。 + +例:arm-none-eabi-gcc -fPIC –shared –o lib.so lib.c + +### ELF共享库编译链接选项 + +1. “-nostdlib”编译链接选项:不依赖编译器中lib库。 +2. “-nostartfiles”编译链接选项:不依赖编译器中启动相关的文件。 +3. “-fPIC”编译选项:可编译位置无关的共享库。 +4. “-z max-page-size=4”链接选项:二进制文件中可加载段的对齐字节数为4,可节约内存,可用于动态库。 +5. “-mcpu=”需要指定对应的cpu架构。 + diff --git a/zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading-guide.md b/zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading-guide.md new file mode 100644 index 0000000000000000000000000000000000000000..64f8859363b95b65fbc704d10746ab9603b92d18 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading-guide.md @@ -0,0 +1,187 @@ +# 开发指导 + +- [接口说明](#section158501652121514) +- [开发流程](#section5241132917523) +- [编程实例](#section8708112313531) + +## 接口说明 + +**表 1** 功能列表 + + +

名称

+ + - - - diff --git "a/zh-cn/application-dev/media/figures/\351\237\263\351\242\221\346\222\255\346\224\276\347\212\266\346\200\201\346\234\272.png" "b/zh-cn/application-dev/media/figures/\351\237\263\351\242\221\346\222\255\346\224\276\347\212\266\346\200\201\346\234\272.png" index e0777e28838f6d2455233f2068339f8548f50c67..2bd16cf5945b3347a2bebdb8f78e2e5fcab992f8 100755 Binary files "a/zh-cn/application-dev/media/figures/\351\237\263\351\242\221\346\222\255\346\224\276\347\212\266\346\200\201\346\234\272.png" and "b/zh-cn/application-dev/media/figures/\351\237\263\351\242\221\346\222\255\346\224\276\347\212\266\346\200\201\346\234\272.png" differ diff --git "a/zh-cn/application-dev/media/\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" "b/zh-cn/application-dev/media/\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" index 4bf8fc7269c5664de3c93c1c390245de98db2d93..67e223951882bfcdad4219a76577cdf9226ac0c2 100755 --- "a/zh-cn/application-dev/media/\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" +++ "b/zh-cn/application-dev/media/\351\237\263\351\242\221\346\222\255\346\224\276\345\274\200\345\217\221\346\214\207\345\257\274.md" @@ -63,11 +63,6 @@ - - - - - + + + @@ -103,6 +103,11 @@ + + + - - - - @@ -133,7 +133,7 @@ - @@ -143,7 +143,7 @@ - @@ -162,70 +162,73 @@ ``` player.on('play', (err, action) => { if (err) { - console.error('Error returned in the play() callback.'); + console.log(`err returned in play() callback`); return; } - console.info('Current player duration: '+ player.duration); - console.info('Current player time: ' + player.currentTime); - console.info('Current player status: '+player.state); - console.info('Pause MP3'); + console.info('Current Song duration: '+duration); + console.log(`In play callback current time: ${player.currentTime}`); + console.info('Current Player Status: '+player.state); + console.info('Pause Mp3'); player.pause(); }); player.on('pause', (err, action) => { if (err) { - console.error('Error returned in the pause() callback.'); + console.log(`err returned in pause() callback`); return; } - console.info('Current player status: ' + player.state); - console.info('Current player time: ' + player.currentTime); - player.seek(30000); // Seek for 30 seconds. + console.log(`pause callback, state: ${player.state}`); + console.info('Current Player Status: '+player.state); + var currentTime = player.currenTime; + console.info('Current Player Time: '+currentTime); + player.seek(30000); //seek for 30 seconds }); player.on('stop', (err, action) => { if (err) { - console.error('Error returned in the stop() callback.'); + console.log(`err returned in stop() callback`); return; } - console.info('stop callback invoked. State:' + player.state); - player.reset(); + console.log(`stop callback, state: ${player.state}`); }); player.on('dataLoad', (err, action) => { if (err) { - console.error('Error returned in the dataLoad() callback.'); + console.log(`err returned in dataLoad() callback`); return; } - console.info('dataLoad callback invoked. Current time: ' + player.currentTime); - console.info('Duration of the source:' + player.duration); - player.play(); - }); - player.on('reset', (err, action) => { - if (err) { - console.error('Error returned in the reset() callback.'); - return; - } - console.info('reset callback invoked.'); - player.release(); + console.log(`dataLoad callback is called, cuurent time: ${player.currentTime}`); + console.log(`Duration of the source: ${player.duration}`); }); player.on('finish', (err, action) => { if (err) { - console.error('Error returned in the finish() callback.'); + console.log(`err returned in finish() callback`); return; } - console.info('finish callback invoked.'); + console.log(`Player finish callback is called`); }); - player.on('timeUpdate', (seekTime, action) => { - console.info('Seek time: ' + seekTime); - console.info('Current player time: ' + player.currentTime); - var newTime = player.currentTime; - if(newTime == 30000) { - console.info('Seek succeeded. New time: ' + newTime); + player.on('timeUpdate', (err, action) => { + if (err) { + console.log(`err returned in timeUpdate() callback`); + return; + } + console.log(`In timeupdate callback current time: ${player.currentTime}`); + var newTime = player.currenTime; + if(newTime = 30000) { + console.info('Seek success, new time : '+newTime); } else { - console.error('Seek failed: ', + newTime); + console.info('Seek Failed'); } player.stop(); }); + player.on('durationchange', (err, action) => { + if (err) { + console.log(`err returned in durationchange callback`); + return; + } + console.log(`Durationchange callback is called`); + }); player.on('error', (err) => { - console.error('Player error: ${err.message}'); + console.error(`player error: ${err.message}`); }); + ``` 3. 启动播放。 @@ -234,6 +237,7 @@ var audioSourceMp3 = 'file://test.mp3'; player.src = audioSourceMp3; player.loop = true; + player.play(); ``` diff --git "a/zh-cn/contribute/\347\254\254\344\270\211\346\226\271\345\274\200\346\272\220\350\275\257\344\273\266\345\217\212\350\256\270\345\217\257\350\257\201\350\257\264\346\230\216.md" "b/zh-cn/contribute/\347\254\254\344\270\211\346\226\271\345\274\200\346\272\220\350\275\257\344\273\266\345\217\212\350\256\270\345\217\257\350\257\201\350\257\264\346\230\216.md" index 7ac73667609edfce4255ea5b188463b15655ed63..0f32b1be89cc8d09a555d7c5b6af05448d92871f 100755 --- "a/zh-cn/contribute/\347\254\254\344\270\211\346\226\271\345\274\200\346\272\220\350\275\257\344\273\266\345\217\212\350\256\270\345\217\257\350\257\201\350\257\264\346\230\216.md" +++ "b/zh-cn/contribute/\347\254\254\344\270\211\346\226\271\345\274\200\346\272\220\350\275\257\344\273\266\345\217\212\350\256\270\345\217\257\350\257\201\350\257\264\346\230\216.md" @@ -4,17 +4,11 @@ OpenHarmony使用了如下第三方开源软件,下表对各开源软件采用 | :----- | :----- | :----- | | third_party_bounds_checking_function | Mulan Permissive Software License,Version 2 | 该License无强制开放源码义务条款。 | | third_party_cJSON | MIT License | 该License无强制开放源码义务条款。 | -| third_party_JSON-C | MIT License | 该License无强制开放源码义务条款。 | -| third_party_libuuid | BSD 3-Clause License | 该License无强制开放源码义务条款。 | -| third_party_popt | MIT License | 该License无强制开放源码义务条款。 | -| third_party_LVM2 | GPL V2.0 | 独立进程,不会导致受到GPL许可的影响。 | -| third_party_cryptsetup | GPL V2.0 | 独立进程,不会导致受到GPL许可的影响。| | third_party_cmsis | Apache License V2.0 | 该License无强制开放源码义务条款。 | | third_party_curl | Curl License | 该License无强制开放源码义务条款。 | | third_party_FatFs | FatFs license(BSD-style licenses) | 该License无强制开放源码义务条款。 | | third_party_FreeBSD | BSD 2-Clause License | 该License无强制开放源码义务条款。 | | third_party_freetype | The FreeType Project License | 该License无强制开放源码义务条款。 | -| third_party_giflib | MIT License | 该License无强制开放源码义务条款。 | | third_party_googletest | BSD 3-Clause License | 该License无强制开放源码义务条款。 | | third_party_harfbuzz | MIT License | 该License无强制开放源码义务条款。 | | third_party_iniparser | MIT License | 该License无强制开放源码义务条款。 | @@ -29,7 +23,6 @@ OpenHarmony使用了如下第三方开源软件,下表对各开源软件采用 | third_party_musl | BSD 2-Clause License | 该License无强制开放源码义务条款。 | | third_party_NuttX | BSD 3-Clause License | 该License无强制开放源码义务条款。 | | third_party_openssl | OpenSSL License and Original SSLeay License | 该License无强制开放源码义务条款。 | -| third_party_qrcodegen| MIT License | 该License无强制开放源码义务条款。 | | third_party_unity | MIT License | 该License无强制开放源码义务条款。 | | third_party_wpa_supplicant | BSD 3-Clause License | 该License无强制开放源码义务条款。 | | third_party_zlib | zlib/libpng License | 该License无强制开放源码义务条款。 | @@ -85,11 +78,3 @@ OpenHarmony使用了如下第三方开源软件,下表对各开源软件采用 | third_party_weston | MIT license | 该License无强制开放源码义务条款。 | | third_party_lz4 | BSD 2-Clause License | 该License无强制开放源码义务条款。 | | third_party_bzip2 | bzip2 and libbzip2 License | 该License无强制开放源码义务条款。 | -| third_party_mksh | MirOS License | 该License无强制开放源码义务条款。 | -| third_party_toybox | Public Domain License | 该License无强制开放源码义务条款。 | -| third_party_optimized_routines | MIT License | 该License无强制开放源码义务条款。 | -| third_party_libsnd | LGPL v2.1 | 该License无强制开放源码义务条款。部分测试代码使用GPL-3.0-or-later协议,部分测试代码使用GPL-2.0-or-later协议 | -| third_party_pulseaudio | LGPL v2.1 | 该License无强制开放源码义务条款。 | -| third_party_ffmpeg | LGPL v2.1 | OpenHarmony采用动态链接方式使用LGPL许可证下的ffmpeg库,不会导致该项目其它代码受到LGPL许可证的影响。 | -| third_party_quickjs | MIT licence | 该License无强制开放源码义务条款。| -| third_party_icu | BSD 3-Clause License, ICU License, UNICODE INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE | License无强制开放源码义务条款。 | diff --git a/zh-cn/device-dev/Readme-CN.md b/zh-cn/device-dev/Readme-CN.md index d81215a76fdddf5556cb348a676ad0e619655979..dd63d9da3552ad518c28052409427bc7471728d8 100644 --- a/zh-cn/device-dev/Readme-CN.md +++ b/zh-cn/device-dev/Readme-CN.md @@ -69,28 +69,28 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按 - - - - - - - - - - - - - - - - - - - - - - -

名称

描述

+

描述

设备属性数组

+

设备属性队列

AudioDeviceDescriptor的数组,只读。

+

AudioDeviceDescriptor的队列,只读。

停止播放。

reset()7+

-

重置播放音频源。

-

setVolume(vol: number)

改变音频播放音量

@@ -83,12 +78,17 @@

音频播放的媒体URI。

state:AudioState

+

state:string

播放的状态属性。

currentTime:number

+

autoplay:boolean

+

音频的自动播放属性。

+

currenttime:number

音频的当前播放位置。

音频的循环播放属性。

muted:boolean

+

音频的静音属性。

+

on('play', function callback)

监听音频播放开始事件。

@@ -118,12 +123,7 @@

监听音频播放停止事件。

on('reset', function callback)

-

监听音频播放重置事件。

-

on('finish',function callback)

+

on('ended',function callback)

监听音频播放结束事件。

监听音频播放错误事件。

on('dataload', function callback)

+

on('loaderdata', function callback)

监听音频播放加载数据事件。

监听音频播放音量变化事件。

on('timeUpdate', function callback)

+

on('timeupdate', function callback)

监听音频播放进度改变事件。

使用OpenHarmony提供的基础能力

+

进阶开发

结合系统能力开发智能设备

+

移植适配

  • 针对特定芯片做移植适配
  • 对三方库进行移植适配
+

贡献组件

OpenHarmony贡献功能组件

+

参考

@@ -139,7 +139,7 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按

使用OpenHarmony提供的基础能力

+

进阶开发

@@ -153,14 +153,14 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按

对三方库进行移植适配

+

贡献组件

OpenHarmony贡献功能组件

+

参考

diff --git a/zh-cn/device-dev/bundles/Readme-CN.md b/zh-cn/device-dev/bundles/Readme-CN.md index 7233ea64d4297bef0816b08f413009882a6e3a64..c9dc4d77c4cb4f392e876a91f2b2d39eee557978 100755 --- a/zh-cn/device-dev/bundles/Readme-CN.md +++ b/zh-cn/device-dev/bundles/Readme-CN.md @@ -1,12 +1,12 @@ # 组件开发指南 -- [组件开发规范](bundles-standard-rules.md) -- [组件开发指南](bundles-guide.md) - - [组件开发指南](bundles-guide-overview.md) - - [准备工作](bundles-guide-prepare.md) - - [组件开发](bundles-guide-develop.md) -- [组件开发示例](bundles-demo.md) +- [组件开发规范](oem_bundle_standard_des.md) +- [开发指南](bundles-guide.md) + - [概述](bundles-guide-overview.md) + - [安装hpm命令行工具](bundles-guide-prepare.md) + - [开发Bundle](bundles-guide-develop.md) +- [开发示例](bundles-demo.md) - [HPM介绍](bundles-demo-hpmdescription.md) - - [环境准备](bundles-demo-environment.md) + - [编译环境准备](bundles-demo-environment.md) - [操作实例](bundles-demo-devsample.md) diff --git a/zh-cn/device-dev/bundles/bundles-demo-devsample.md b/zh-cn/device-dev/bundles/bundles-demo-devsample.md index 1de6091e00561003efb769708a6dd5af62bd3f24..1447934d6b26b985b151b5ebe2bd0757e253e2f6 100644 --- a/zh-cn/device-dev/bundles/bundles-demo-devsample.md +++ b/zh-cn/device-dev/bundles/bundles-demo-devsample.md @@ -1,25 +1,25 @@ # 操作实例 -环境准备好后,接下来本文以Hi3861平台为例,演示如何利用HPM进行组件的安装、编译和打包。 +环境准备好后,接下来本文以Hi3861平台为例,演示如何利用hpm进行发行版的安装、编译。 -1. 执行以下命令,初始化安装目录(目录名可自行设置): +1. 执行以下命令,创建目录,并根据模板dist创建一个默认工程(目录名可自行设置): ``` mkdir test3861 cd test3861 - hpm init -t dist + hpm init -t dist myproduct ``` - 初始化成功则显示: + 创建成功则显示: ``` Initialization finished. ``` -2. 安装wifi\_iot发行版。 +2. 安装hispark\_pegasus发行版。 ``` - hpm install @ohos/wifi_iot + hpm install @ohos/hispark_pegasus ``` 安装成功则显示: @@ -31,11 +31,11 @@ >![](../public_sys-resources/icon-note.gif) **说明:** >Hi3516平台采用下述命令: >``` - >hpm install @ohos/ip_camera_hi3516dv300 + >hpm install @ohos/hispark_taurus >``` >Hi3518平台采用下述命令: >``` - >hpm install @ohos/ip_camera_hi3518ev300 + >hpm install @ohos/hispark_aries >``` 3. 编译打包 diff --git a/zh-cn/device-dev/bundles/bundles-demo-environment.md b/zh-cn/device-dev/bundles/bundles-demo-environment.md index 1a05b2a302aa04390d4b294e784f30f07ebc0e72..69b28aa8e5a52a9347b677bc8c4e867ae092a031 100644 --- a/zh-cn/device-dev/bundles/bundles-demo-environment.md +++ b/zh-cn/device-dev/bundles/bundles-demo-environment.md @@ -1,15 +1,17 @@ -# 环境准备 +# 编译环境准备 - [linux服务器](#section20979554791) - [安装Node.js](#section9954105413153) -- [安装HPM](#section15937194904819) +- [安装HPM命令行工具](#section15937194904819) - [安装python环境](#section1621819180417) - [安装文件打包工具](#section77617165913) -- [安装SCons](#section20558439191516) +- [安装SCons](#section873135716233) + +![](figure/3516dv300.png) ## linux服务器 -准备一台装有Ubuntu 16.04 及以上 64 位系统的linux服务器(hpm是支持windows的,但是目前OpenHarmony开源的Hi3861、Hi3516、Hi3518三个解决方案都只支持Ubuntu)。 +准备一台装有Ubuntu 16.04 及以上 64 位系统的linux服务器(当前未完全支持window环境下的编译)。 将linux shell改为bash: @@ -25,12 +27,6 @@ ln -s bash /bin/sh ## 安装Node.js ->![](../public_sys-resources/icon-note.gif) **说明:** ->如果配置的源的nodejs版本太低,可以执行以下语句后再执行apt-get install: ->``` ->curl -L https://deb.nodesource.com/setup_12.x | bash ->``` - 推荐安装 Node.js 12.x (包含 npm 6.14.4)或更高版本(推荐 12.13.0+): ``` @@ -45,7 +41,7 @@ node --version # 查看nodejs版本 npm --version # 查看npm版本 ``` -## 安装HPM +## 安装HPM命令行工具 通过 Node.js 自带的 npm(使用默认的源 https://registry.npmjs.org/ )安装 hpm-cli 命令行工具: @@ -59,7 +55,7 @@ npm install -g @ohos/hpm-cli hpm config ``` -上述命令执行后将会显示hpm的默认配置,您可以根据自己的喜好对默认配置进行修改,以下是hpm的常用配置: +上述命令执行后将会显示hpm的默认配置,您可以根据实际情况对默认配置进行修改,以下是hpm的常用配置: ``` registry = https://hpm.harmonyos.com # hpm注册中心地址,下载组件必须 @@ -68,7 +64,7 @@ http_proxy = http://your-proxy-server:port # 配置HTTP代理 https_proxy = http://your-proxy-server:port # 配置HTTPS代理 ``` -hpm-cli的命令介绍可以参考:[hpm操作命令](bundles-standard-rules.md) +hpm-cli的命令介绍可以参考:[hpm操作命令](oem_bundle_standard_des.md) ## 安装python环境 @@ -115,7 +111,7 @@ sudo apt-get install mtools >![](../public_sys-resources/icon-note.gif) **说明:** >Hi3518和Hi3516两种平台需要安装打包工具,Hi3861平台不需要。 -## 安装SCons +## 安装SCons 1. 打开Linux编译服务器终端。 2. 运行如下命令,安装SCons安装包。 @@ -131,7 +127,7 @@ sudo apt-get install mtools ``` **图 1** SCons安装成功界面,版本要求3.0.4以上 - ![](figure/SCons安装成功界面-版本要求3-0-4以上-21.png "SCons安装成功界面-版本要求3-0-4以上-21") + ![](figure/SCons安装成功界面-版本要求3-0-4以上-26.png "SCons安装成功界面-版本要求3-0-4以上-26") >![](../public_sys-resources/icon-note.gif) **说明:** diff --git a/zh-cn/device-dev/bundles/bundles-demo-hpmdescription.md b/zh-cn/device-dev/bundles/bundles-demo-hpmdescription.md index 9b4daa91976492a0019ef831252eb38202ef0756..ee4d429d32e4b6e15aa29a0921663d924402607d 100644 --- a/zh-cn/device-dev/bundles/bundles-demo-hpmdescription.md +++ b/zh-cn/device-dev/bundles/bundles-demo-hpmdescription.md @@ -1,4 +1,4 @@ # HPM介绍 -随着OpenHarmony正式开源,HPM包管理器也应运而生。HPM全称HarmonyOS Package Manager,是OpenHarmony组件包的管理和分发工具。HPM主要是面向设备开发者,用于获取/定制OpenHarmony源码,执行安装、编译、打包、升级等操作的工具集。本文档将向开发者介绍如何使用HPM工具进行OpenHarmony组件的安装、编译、打包等操作。 +HPM全称HarmonyOS Package Manager,是OpenHarmonyBundle的管理和分发工具。HPM主要是面向HamronyOS开发者,用于获取/定制OpenHarmony源码,执行安装依赖、编译、打包、升级等操作的工具集。本文档将向开发者介绍如何使用HPM工具进行OpenHarmonyBundle的安装、编译、打包等操作。 diff --git a/zh-cn/device-dev/bundles/bundles-demo.md b/zh-cn/device-dev/bundles/bundles-demo.md index bcdc877e6dd00f49a3195ff4443a08de52917a1c..748887b67f83e3bba358e7799fad18602f36e875 100644 --- a/zh-cn/device-dev/bundles/bundles-demo.md +++ b/zh-cn/device-dev/bundles/bundles-demo.md @@ -1,8 +1,8 @@ -# 组件开发示例 +# 开发示例 - **[HPM介绍](bundles-demo-hpmdescription.md)** -- **[环境准备](bundles-demo-environment.md)** +- **[编译环境准备](bundles-demo-environment.md)** - **[操作实例](bundles-demo-devsample.md)** diff --git a/zh-cn/device-dev/bundles/bundles-guide-develop.md b/zh-cn/device-dev/bundles/bundles-guide-develop.md index bc462fd12dceefd0cb04dcfbdccf97a8412c6027..57e029f539564412db71d5d788467e7ad92e8868 100644 --- a/zh-cn/device-dev/bundles/bundles-guide-develop.md +++ b/zh-cn/device-dev/bundles/bundles-guide-develop.md @@ -1,128 +1,233 @@ -# 组件开发 - -- [创建OpenHarmony组件](#section1976410130540) -- [新建组件](#section717481119145) -- [改造组件](#section102861955201410) -- [从模板创建组件](#section15882846181510) -- [编译组件](#section136732148541) +# 开发Bundle + +- [创建Bundle](#section717481119145) +- [将现有工程定义为Bundle](#section102861955201410) +- [发布Bundle到HPM平台](#section1318574233211) +- [引用Bundle](#section57959284315) +- [全局安装Bundle](#section647375516313) +- [编译Bundle](#section7972161715325) - [定义编译脚本](#section10274147111610) - [执行编译](#section879301916172) -- [定义发行版](#section413216495619) +- [定义发行版](#section127388393326) - [定义脚本](#section11503171219190) -- [发行](#section4694125521912) -- [烧录](#section1746331545413) -- [运行调试](#section6742131615549) - -## 创建OpenHarmony组件 +- [编译发行版](#section4694125521912) +- [烧录](#section2061514431039) -创建OpenHarmony组件有如下几种方式: +创建OpenHarmonyBundle有如下几种方式: -- 从头开发一个全新的组件。 -- 将一个现有的非组件的代码改造成组件。 -- hpm提供了一些组件模板方便快速创建组件。 +- 从头创建一个全新的Bundle。 +- 将一个现有的源码项目定义为Bundle。 -## 新建组件 +## 创建Bundle -通常情况下,[HPM网站](https://hpm.harmonyOS.com)上能找到您开发常用的组件,如果现有的组件不能完全满足开发,这时可以自己动手开发一个组件。 +通常情况下,[HPM网站](https://hpm.harmonyOS.com)上能找到您开发常用的Bundle,如果现有的Bundle不能完全满足开发,这时可以自己动手开发一个Bundle。 -如果您愿意,可以将组件发布到HPM的仓库中供其他用户使用。假设要在D:/source目录下新建一个全新的组件my-bundle: +如果您愿意,可以将Bundle发布到HPM的仓库中供其他用户使用。 -可以使用hpm init 创建该组件的脚手架代码,例如,进入D:/source目录,执行如下命令: +假设要在D:/source目录下新建一个全新的Bundle:my-bundle,可以使用hpm init 创建该Bundle的脚手架代码,例如,进入D:/source目录,执行如下命令: ``` -hpm init -t default -d demo my-bundle +hpm init -t default -d demo mybundle ``` -会在 source 目录下生成如下文件: +将使用'default' 模板 在当前目录下的demo路径下,创建一个名为mybundle的Bundle: ``` -mybundle -├── bundle.json # 组件元数据描述文件 -├── example # 测试组件功能的示例 -│ └── main.c -├── include # 组件的内部头文件 -│ └── mybundle.h -├── README.md # 组件的简要说明 -└── src # 组件的源代码 - └─ mybundle.c +demo +├── headers # 头文件(样例) +│ └── main.h +└── src # 源代码(样例) +│ └─ main.c +├── bundle.json # 元数据声明文件 +└── LICENSE # 许可协议文本 +└── Makefile # 编译描述文件(样例) +└── README.md # Bundle的自述文件 + ``` -接下来根据您的业务需要,实现组件内部的功能代码,完成代码开发后,通过git将代码(包括bundle.json文件)提交到组件代码托管仓库中(如gitee)。 +接下来根据您的业务需要,实现Bundle内部的功能代码,以及编译脚本,完成代码开发后,通过git将代码(包括bundle.json文件)提交到组件代码托管仓库中(如gitee)。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>``` +>hpm init -t {templatename} -d {dir} {name} +>``` +>- -t \{templatename\} :指的是模板名称。 +>- -d \{dir\}:是要创建的Bundle所存放的路径。 +>- name:为要创建的Bundle名称。 + +hpm 除了提供了少量默认模板之外,其他模板均存储在服务器端,可以使用命令hpm search -t template 从服务器端搜索模板。 -## 改造组件 +![](figure/zh-cn_image_0000001141641532.png) -如果您已经有了代码,只是还不满足OpenHarmony的组件结构,需要改造成为hpm的组件包,只需要在当前要改造的代码目录下(例如mybundle2),执行如下命令,会提示您输入组件名称和版本。 +## 将现有工程定义为Bundle + +如果您已经有了代码工程,需要分发的HPM平台,只需要在当前工程目录下(例如mybundle2),执行如下命令,会引导您输入组件名称和版本等信息。 ``` hpm init ``` 1. 输入名称后回车(如mybundle2)。 -2. 输入版本后(如1.0.0)回车,在当前组件目录下会生成一个bundle.json文件。 -3. 打开bundle.json文件再添加其他的描述,这时候他已经是一个具备可发布的组件了。 +2. 接下来依次输入版本、描述等信息后,会在当前目录下会生成一个bundle.json文件。 +3. 也可以打开bundle.json文件。 ``` $ hpm init - Your bundle will be created in dirname E:\demo\mybundle2 + Your bundle will be created in directory ~\demo\mybundle2 ? bundle name mybundel2 ? version 1.0.0 - Init finished! + ... + Initialization finished. ``` -1. 打开bundle.json文件修改其他信息(如作者,代码仓库,代码目录,命令脚本,依赖组件等),如下: +1. 打开bundle.json文件修改其他信息(如作者,代码仓库,代码目录,命令脚本,依赖组件等),如下(仅示意): ``` { "name": "mybundle2", "version": "1.0.0", - "publishAs": "source", + "publishAs": "code-segment", "dirs":{ - ".":[ - "README.md" - ], - "src":[ - "test.c" - ], - "header":[ - "header/test.h" - ], - "src/common":[ - "src/common/foobar.txt" - ] + ".":["README.md"], + "src":["test.c"], + "header":["header/test.h" ], + "src/common":["src/common/foobar.txt"] }, "scripts": { - "build": "make -${args}" + "build": "make -${args}" }, "dependencies": { - "@ohos/cjson": "^1.0.0", - "@ohos/": "^1.2.0" + "@ohos/cjson": "^1.0.0", + "@ohos/foobar": "^1.2.0" } } ``` -## 从模板创建组件 +## 发布Bundle到HPM平台 -hpm 除了提供了默认模板 default和simple两个简单的模板之外,其他模板均存储在服务器端。 +要在发布Bundle到HPM,你需要先具备账号,并创建组织,创建组织的条件及详细步骤请参考hpm网站上的帮助说明。 -可以使用命令hpm search -t template 从服务器端搜索模板。 +完成账号申请和组织创建(或者加入一个现有的组织)后,您需要根据个人的邀请码(在HPM网站的个人中心页查看),在本机生成公钥,并在HPM网站的个人中心配置。 -![](figure/zh-cn_image_0000001051452177.png) +``` +hpm config set loginUser {your-invitation-code} +hpm gen-keys +``` + +生成的文件将会存放在 \~\\Users\\yourname\\.hpm\\key 下,将公钥文件\(publicKey\_your-accout.pem\)中内容拷贝到 HPM 个人中心的 SSH 公钥中。 -根据description简要中的描述,找到适合的模板,基于模板可以快速创建一个组件的脚手架,执行如下初始化命令(指定-t -d 参数)。 +完成上述操作后,你就具备了在您的组织内发布Bundle的权限了。 + +在bundle所在目录,执行命令hpm publish,将会完成组件的打包发布操作。 ``` -hpm init -t {templatename} -d dir name +hpm publish ``` -- \{templatename\} :指的是模板名称。 -- -d 后面的参数dir:是要创建的组件所存放的路径。 -- name:为要创建的组件名称。 +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 为避免Bundle名称冲突,发布的Bundle的名称需限定在组织范围内,即命名为@org\_name/bundle\_name的格式。 +>- 你的账号也必须是org\_name内的成员,才可以发布或更新组织内的Bundle。 +>- 发布的组件,需要通过安全及内容审核,才能正式生效。 + +## 引用Bundle + +通常开发一个项目,需要引用其他的组件以加快特定功能的开发,可以采用安装依赖的方式。 + +首先去HPM网站,根据关键字去搜索满足您的需求的组件,找到合适的组件后,将其引入到您的工程。 -## 编译组件 +在您的bundle工程中(工程目录中必须包含bundle.json文件)执行如下命令: + +``` +$ hpm install @scope/the_bundle +``` + +引用的bundle将会被安装到你的工程所在的目录的 ohos\_bundle下 + +``` +project +├── ohos_bundle +│ └── scope +│ └─ the_bundle # <---引用的组件将会出现在这 +└── src +│ └─ main.c +├── bundle.json # 元数据声明文件 +└── LICENSE +└── Makefile +└── README.md +``` + +打开bundle.json文件,可以看到bundle已经被引入到您的工程的依赖中。 + +``` +{ +"dependencies": { + "@scope/the_bundle": "^1.0.0" + } +} +``` -完成代码开发后,需要对组件进行编译。hpm提供了命令集成的能力,您可以选择任意的适合项目的编译工具(如make,gcc,gn等等)。只需在当前项目的bundle.json文件中定义scripts脚本中的build命令,就可以通过执行hpm build执行编译。 +您也可以一次性在此文件中编辑多个Bundle的依赖 + +``` +{ +"dependencies": { + "@scope/the_bundle1": "^1.0.0", + "@scope/the_bundle2": "^2.0.0", + "@scope/the_bundle3": "^3.0.0", + "@scope/the_bundle4": "^1.1.0" + } +} +``` + +再执行hpm install命令,将会一次性将所有未安装的Bundle一次性全部下载并安装完成。 + +## 全局安装Bundle + +如果引用的Bundle是多个项目共用的组件(如编译工具链),你可以全局安装 + +在您的bundle工程中(工程目录中必须包含bundle.json文件)执行如下命令: + +``` +$ hpm install -g @scope/the_tool +``` + +引用的bundle将会被安装到你在hpm config中设置的globalRepo所指定的目录下: + +``` +~\.hpm\global +│ └── scope +│ └─ the_tool # <---引用的组件将会出现在这 +``` + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 在项目安装的Bundle,在执行hpm编译命令时可以通过引用环境变量 DEP\_SCOPE\_bundle\_name,例如: +>通过 hpm i @opensource/gn 安装后,可以编辑bundle.json中的编译脚本,如下: +>``` +>"scripts": { +> "build": "${DEP_OPENSOURCE_gn}/gn --version" +> }, +>``` +>然后就可以通过执行hpm build将调用gn的功能。 +>- 在全局安装的Bundle,可以通过设置系统环境变量,直接调用,或者hpm config set key value的方式,通过 $\{key\}/tool\_name 的方式 引用,例如: +>``` +>hpm i -g @ohos/opensource/gn +>hpm config BUILD_SYS_GN ~/.hpm/global/ohos_bundles/opensource/gn +>``` +>可以编辑bundle.json中的编译脚本,如下: +>``` +>"scripts": { +> "build": "${BUILD_SYS_GN}/gn --version" +> }, +>``` +>然后就可以通过执行hpm build将调用gn的功能。 + +## 编译Bundle + +完成代码开发后,如果Bundle的代码是可以独立编译的,可以配置编译工具和脚本以完成二进制的生成。 + +hpm具备命令集成的能力,您可以选择任意的适合项目所采用的语言编译工具(如make,gcc,gn等等)。只需在当前项目的bundle.json文件中定义scripts脚本中的build命令,就可以通过执行hpm build执行编译。 ## 定义编译脚本 @@ -172,37 +277,54 @@ hpm build 在完成一系列的编译动作后,显示build succeed。检查编译的输出结果: -![](figure/zh-cn_image_0000001051770876.png) +![](figure/zh-cn_image_0000001188041297.png) + +## 定义发行版 -## 定义发行版 +发行版的元数据文件中定义了其依赖的Bundles,以及如何编译、链接这些bundles,生成镜像文件。 -发行版是将一组组件组合起来的,编译生成可以运行的OpenHarmony解决方案,里面包含了较多依赖的组件,以及以脚本形式描述如何完整编译、链接这些组件。 +示例如下(以下示例的编译命令dist,采用hb编译框架描述) ## 定义脚本 -bundle.json中定义 +bundle.json中定义如下(示例) ``` { -"name": "my_dist", -"version": "1.0.0", +"name": "@your/dist_name", +"version": "2.2.0", "publishAs": "distribution", +"description": "describe it", "scripts": { -"dist": "make -${args}" - }, -"base": { -"name": "dist-bundle", -"version": "1.0.0" - }, +"config_hb": "hb set -root $DEP_BUNDLE_BASE", +"dist": "PATH=/root/.local/bin:${DEP_OHOS_gn}:${DEP_OHOS_ninja}/ninja:${DEP_OHOS_llvm}/llvm/bin:${DEP_OHOS_hc_gen}/hc-gen:${PATH} && ./scripts/dist.sh" +}, "envs": { -"args": "x86" - }, +"debug": false +}, +"dirs": { +"scripts": "scripts/*" +}, "dependencies": { -} +"@ohos/build_lite": "2.2.0", +"@ohos/gn": "1.1.1", +"@ohos/llvm": "1.1.1", +"@ohos/hc_gen": "1.1.0", +"@ohos/ninja": "1.1.0", +...... +}, +"ohos": { +"os": "2.2-Beta", +"board": "hi3516", +"kernel": "liteos-a" +}, +"keywords": [ "hispark", "hi3516" ], +"repository": "https://gitee.com/openharmony/your-project", +"license": "Apache V2" } ``` -## 发行 +## 编译发行版 在当前发行版根目录下,执行如下命令。 @@ -210,7 +332,7 @@ bundle.json中定义 hpm dist ``` -hpm-cli工具会自动执行编译,打包操作,将根据scripts定义的dist脚本生成镜像文件,如: +hpm-cli工具会自动执行编译,生成镜像文件,如: ``` out @@ -218,23 +340,23 @@ out |-xx.file ``` -## 烧录 +## 烧录 发行版的编译结果可以烧录到设备中运行,例如使用hiburn工具进行烧录。在发行版的bundle.json文件配置烧录参数。 ``` "scripts": { -"flash": "{$DEP_HIBURN}/hiburn" + "flash": "{$DEP_HIBURN}/hiburn" }, ``` -配置烧录相关的参数(参考烧录工具的说明进行配置)。 +设置烧录命令行工具的所在路径,配置烧录相关的参数(参考烧录工具的说明进行配置)。 ``` +hpm config set DEP_HIBURN {hiburn_path} hpm run flash ``` -## 运行调试 - -将发行版的镜像烧录到设备中后,就可以启动运行调试了,由于运行调试和具体的开发板和IDE调试工具相关,此处不再详细描述。 +>![](../public_sys-resources/icon-note.gif) **说明:** +>上述仅描述如何定义bundle.json的样例,烧录工具取决于实际开发板所需的工具。 diff --git a/zh-cn/device-dev/bundles/bundles-guide-overview.md b/zh-cn/device-dev/bundles/bundles-guide-overview.md index 332a8fc00782f0ca9db5bbe4668e3ad6d68f38ef..372bb76c2e719b347f2b5cf16eaf5f15b7e261d9 100644 --- a/zh-cn/device-dev/bundles/bundles-guide-overview.md +++ b/zh-cn/device-dev/bundles/bundles-guide-overview.md @@ -1,54 +1,41 @@ # 概述 -本章节将简要介绍如何开发OpenHarmony组件和发行版,并通过命令行工具方式完成组件创建、开发、编译、烧录、调试等开发过程。 - -- 一个组件(bundle)通常和一个代码仓库对应,在代码的基础上增加bundle.json、README文件、LICENSE描述文件。 -- 一个发行版(distribution)是由多个组件构成的。发行版中集合了一个完整系统的各种组件(如驱动、内核、框架、应用),可以用于设备的烧录。 - -**表 1** 组件和发行版的差异对比 - - - - - - - - - - - - - - - - - - - - - - - - -

异同点

-

组件

-

发行版

-

应用场景

-

面向功能特性开发

-

面向系统开发

-

内容

-

功能或特性的实现代码或二进制库

-

依赖的组件清单及编译构建脚本

-

完整程度

-

操作系统的一部分

-

一个完整操作系统版本

-

编译后结果

-

组件包

-

系统镜像

-
- -**图 1** 组件和发行版的构成 - - -![](figure/组件0924.png) +- [Bundle](#section196713235514) +- [Distribution](#section155387501033) + +本章节将介绍HarmonyOS中的Bundle相关概念以及如何定义Bundle,并以一个示例说明如何使用hpm命令行工具完成Bundle的创建、开发、编译、发布、安装使用的全过程。 + +## Bundle + +Bundle是HarmonyOS中一个用来表示分发单元的术语,等同于包,一个Bundle中通常包含以下内容: + +- 被分发的二进制文件(二进制类型) +- 被分发的源代码文件(源代码/代码片段类型) +- 编译脚本(发行版类型需要) +- 自身的说明文件 + - bundle.json:元数据声明(名称,版本,依赖等) + - LICENSE:许可协议文本 + - README.md:自述文件 + - CHANGELOG.md:变更日志(可选) + + +>![](../public_sys-resources/icon-note.gif) **说明:** +>Bundle的类型可以分为二进制,源代码,代码片段,模板,插件,发行版等。一个Bundle可以依赖其他的Bundles,依赖关系为有向无环图 + +一个Bundle被发布到HPM服务器(https://hpm.harmonyos.com)后,另外一些开发者就可以通过hpm包管理器下载安装使用 。 + +一个Bundle在命名空间内拥有唯一的名称(命名格式为:@scope/name),可以进行独立的版本演进。 + +## Distribution + +Distribution是HarmonyOS的发行版,是一个完整的操作系统版本,集合了各种Bundle(驱动,内核,框架,应用等),也通过Bundle在HPM平台分发。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>发行版的元数据中仅描述了依赖的Bundles以及如何编译该发行版的编译脚本,并不包含发行版的二进制镜像。下载发行版后,需要在本地将依赖的Bundles下载下来,安装编译后才能得到可用于烧录的系统镜像文件。 +>发行版可以继承,即在一个既有的发行版的基础上,通过增加/删除Bundle形成新的发行版,以实现发行版的定制。 + +**图 1** 组Bundle和Distribution的关系 + + +![](figure/组件和发行版的构成-英文.png) diff --git a/zh-cn/device-dev/bundles/bundles-guide-prepare.md b/zh-cn/device-dev/bundles/bundles-guide-prepare.md index 4068e7d7bee57afd03cd3098b97e923dc16edb66..ec3206a3a9bee16684c7015ac44fa274adfdf587 100644 --- a/zh-cn/device-dev/bundles/bundles-guide-prepare.md +++ b/zh-cn/device-dev/bundles/bundles-guide-prepare.md @@ -1,21 +1,12 @@ -# 准备工作 +# 安装hpm命令行工具 -- [硬件要求](#section98535485518) -- [安装Node.js和hpm命令行工具](#section106591616205311) -- [更改hpm的配置(可选)](#section71821165412) -- [下载OpenHarmony代码](#section102338221707) -- [安装开发依赖的组件](#section19233183315020) +- [安装](#section14480912380) +- [配置hpm(可选)](#section138983413013) +- [下载OpenHarmony代码](#section669905815300) -## 硬件要求 +要进行Bundle的开发,需要安装包管理器hpm(HarmonyOS Package Manager),这是一个基于Node.js开发的跨平台的命令行工具,所以要运行hpm,需要先安装Node.js,然后可以npm 来安装hpm。 -- 准备设备开发的开发板(如Hi3861、Hi3516DV300、Hi3518EV300) -- 主机电脑(Windows工作台) -- Linux服务器 - -**图 1** 硬件环境连接关系 -![](figure/硬件环境连接关系.png "硬件环境连接关系") - -## 安装Node.js和hpm命令行工具 +## 安装 1. 安装Node.js。 @@ -42,43 +33,41 @@ ``` -## 更改hpm的配置(可选) +## 配置hpm(可选) -安装完hpm-cli命令行工具后,执行以下命令可以查看hpm配置: +安装完hpm-cli命令行工具后,如果需要更改配置信息(如代理,shell),执行以下命令可以查看hpm配置: ``` hpm config ``` -上述命令执行后将会显示hpm的默认配置,您可以根据自己的喜好对默认配置进行修改,以下是hpm的常用配置: +上述命令执行后将会显示hpm的默认配置,您可以根据自己需要对默认配置进行修改,以下是hpm的常用配置: ``` -registry = https://hpm.harmonyos.com/hpm/registry/api # hpm注册中心地址,下载组件必须 -login = https://hpm.harmonyos.com/hpm/auth/pk # hpm处理登录地址,发布组件必须 -loginUser = {your-account} # 配置hpm登录账号,发布组件必须 -shellPath = C:\WINDOWS\System32\cmd.exe # hpm命令执行使用的shell -globalRepo = C:\Users\yourname\.global # 配置全局安装的组件存放路径 -http_proxy = http://your-proxy-server:port # 配置HTTP代理 -https_proxy = http://your-proxy-server:port # 配置HTTPS代理 +registry = https://hpm.harmonyos.com +### login Settings +# loginUser = invitation_code + +#### Path Settings +shellPath = C:\WINDOWS\System32\cmd.exe +# shellPath = C:\Program Files\Git\bin\sh.exe +# globalRepo = C:\Users\username\.hpm\global + +#### Network Settings +# no_proxy = *.server.com +# http_proxy = http://user:pwd@proxy_server:port +# https_proxy = http://user:pwd@proxy_server:port +# strictSsl = true + +#### Other Settings +# privateSupport = true|false +# ignoreBundles = @ohos/llvm,@ohos/gn, +# OSPlatform = Auto|linux|darwin|win32 ``` hpm-cli的命令介绍可以参考:[hpm操作命令](bundles-guide-overview.md) -## 下载OpenHarmony代码 +## 下载OpenHarmony代码 参考[《源码获取》](../get-code/sourcecode-acquire.md)。 -## 安装开发依赖的组件 - -hpm包管理器将常用开发开发工具(如烧录,编译,压缩等)也发布成了组件。可以通过如下命令方式进行安装,执行完该命令后,系统会自动将开发依赖的工具下载安装,且这些组件只需全局安装一次。 - -``` -hpm i -g @ohos/llvm -hpm i -g @ohos/ninja -hpm i -g @ohos/gn -hpm i -g @ohos/hc_gen -hpm i -g @ohos/sysroot -``` - -这是一组开发工具的组件包(如包含gn,ninja等工具),有了这些开发态的组件,就可以进行常规的源码组件的开发了。 - diff --git a/zh-cn/device-dev/bundles/bundles-guide.md b/zh-cn/device-dev/bundles/bundles-guide.md index ca5ee5824bee855bc41e9c5d0bf758fee2e29041..0fb2602a57fbd60814110f935b8207e7b1750268 100644 --- a/zh-cn/device-dev/bundles/bundles-guide.md +++ b/zh-cn/device-dev/bundles/bundles-guide.md @@ -1,9 +1,9 @@ -# 组件开发指南 +# 开发指南 - **[概述](bundles-guide-overview.md)** -- **[准备工作](bundles-guide-prepare.md)** +- **[安装hpm命令行工具](bundles-guide-prepare.md)** -- **[组件开发](bundles-guide-develop.md)** +- **[开发Bundle](bundles-guide-develop.md)** diff --git a/zh-cn/device-dev/bundles/bundles.md b/zh-cn/device-dev/bundles/bundles.md index 9c560fca9d5b6ac9381ebc8dbc3a11de2eaba84b..2df2bea589116963c0773237af6d3ff633fc0622 100644 --- a/zh-cn/device-dev/bundles/bundles.md +++ b/zh-cn/device-dev/bundles/bundles.md @@ -1,9 +1,9 @@ -# 组件开发指南 +# HPM bundle -- **[组件开发规范](bundles-standard-rules.md)** +- **[组件开发规范](oem_bundle_standard_des.md)** -- **[组件开发指南](bundles-guide.md)** +- **[开发指南](bundles-guide.md)** -- **[组件开发示例](bundles-demo.md)** +- **[开发示例](bundles-demo.md)** diff --git "a/zh-cn/device-dev/bundles/figure/\347\241\254\344\273\266\347\216\257\345\242\203\350\277\236\346\216\245\345\205\263\347\263\273.png" b/zh-cn/device-dev/bundles/figure/3516dv300.png similarity index 100% rename from "zh-cn/device-dev/bundles/figure/\347\241\254\344\273\266\347\216\257\345\242\203\350\277\236\346\216\245\345\205\263\347\263\273.png" rename to zh-cn/device-dev/bundles/figure/3516dv300.png diff --git "a/zh-cn/device-dev/bundles/figure/SCons\345\256\211\350\243\205\346\210\220\345\212\237\347\225\214\351\235\242-\347\211\210\346\234\254\350\246\201\346\261\2023-0-4\344\273\245\344\270\212-21.png" "b/zh-cn/device-dev/bundles/figure/SCons\345\256\211\350\243\205\346\210\220\345\212\237\347\225\214\351\235\242-\347\211\210\346\234\254\350\246\201\346\261\2023-0-4\344\273\245\344\270\212-26.png" similarity index 100% rename from "zh-cn/device-dev/bundles/figure/SCons\345\256\211\350\243\205\346\210\220\345\212\237\347\225\214\351\235\242-\347\211\210\346\234\254\350\246\201\346\261\2023-0-4\344\273\245\344\270\212-21.png" rename to "zh-cn/device-dev/bundles/figure/SCons\345\256\211\350\243\205\346\210\220\345\212\237\347\225\214\351\235\242-\347\211\210\346\234\254\350\246\201\346\261\2023-0-4\344\273\245\344\270\212-26.png" diff --git a/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001051452177.png b/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001051452177.png deleted file mode 100644 index 1fb6e4a1742434b1151b428647a161f5107d244e..0000000000000000000000000000000000000000 Binary files a/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001051452177.png and /dev/null differ diff --git a/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001141641532.png b/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001141641532.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab29d3ee328f0bf30766b9561db445f35cd4e73 Binary files /dev/null and b/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001141641532.png differ diff --git a/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001173313501.png b/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001188040429.png similarity index 100% rename from zh-cn/device-dev/bundles/figure/zh-cn_image_0000001173313501.png rename to zh-cn/device-dev/bundles/figure/zh-cn_image_0000001188040429.png diff --git a/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001051770876.png b/zh-cn/device-dev/bundles/figure/zh-cn_image_0000001188041297.png similarity index 100% rename from zh-cn/device-dev/bundles/figure/zh-cn_image_0000001051770876.png rename to zh-cn/device-dev/bundles/figure/zh-cn_image_0000001188041297.png diff --git "a/zh-cn/device-dev/bundles/figure/\347\273\204\344\273\2660924.png" "b/zh-cn/device-dev/bundles/figure/\347\273\204\344\273\2660924.png" deleted file mode 100644 index cc5cad349ff2e55e9d36eb3f564bd7107b94f182..0000000000000000000000000000000000000000 Binary files "a/zh-cn/device-dev/bundles/figure/\347\273\204\344\273\2660924.png" and /dev/null differ diff --git "a/zh-cn/device-dev/bundles/figure/\347\273\204\344\273\266\345\222\214\345\217\221\350\241\214\347\211\210\347\232\204\346\236\204\346\210\220-\350\213\261\346\226\207.png" "b/zh-cn/device-dev/bundles/figure/\347\273\204\344\273\266\345\222\214\345\217\221\350\241\214\347\211\210\347\232\204\346\236\204\346\210\220-\350\213\261\346\226\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..08d9dccdd2371b02f2732d0e4eb4ad9871dccdbe Binary files /dev/null and "b/zh-cn/device-dev/bundles/figure/\347\273\204\344\273\266\345\222\214\345\217\221\350\241\214\347\211\210\347\232\204\346\236\204\346\210\220-\350\213\261\346\226\207.png" differ diff --git a/zh-cn/device-dev/bundles/bundles-standard-rules.md b/zh-cn/device-dev/bundles/oem_bundle_standard_des.md similarity index 76% rename from zh-cn/device-dev/bundles/bundles-standard-rules.md rename to zh-cn/device-dev/bundles/oem_bundle_standard_des.md index 350c2f80db60eba6fe7f2a4b1adf5b304ff5e8b8..574dce8f908e371b0bd8f23760800f2ac92a8fc0 100644 --- a/zh-cn/device-dev/bundles/bundles-standard-rules.md +++ b/zh-cn/device-dev/bundles/oem_bundle_standard_des.md @@ -1,68 +1,68 @@ # 组件开发规范 -- [概述](#section1725818533344) - - [定义](#section4821219183514) - - [组件划分原则](#section1089794263513) - - [组件依赖](#section25701647163710) +- [概述](#section16820114352316) + - [定义](#section123361236249) + - [Bundle划分原则](#section1918162512419) + - [Bundle依赖](#section1687484311240) -- [组件构成](#section185538333914) - - [代码文件](#section8431268393) - - [说明文件](#section168121548173914) - - [元数据描述文件](#section7107181819406) +- [Bundle构成](#section18351162611254) + - [代码文件](#section1575645102513) + - [说明文件](#section15300198132611) + - [元数据描述文件](#section10956525102613) -- [组件管理](#section32061634104110) - - [依赖关系](#section791115242423) - - [hpm操作命令参考](#section1183205411429) +- [Bundle管理](#section32061634104110) + - [依赖关系](#section37361058192610) + - [hpm操作命令参考](#section72383420271) -- [组件版本](#section12612142864316) - - [版本号命名规范](#section1487612416432) - - [版本发布](#section1548171014440) +- [Bundle版本](#section162921336288) + - [版本号命名规范](#section176561816172819) + - [版本发布](#section8683417284) -- [发行版](#section1264139114413) -- [环境变量说明](#section15352105174512) +- [发行版](#section243845052819) +- [环境变量说明](#section19567181517299) -## 概述 +## 概述 -本文档将介绍组件的基本概念以及如何按照规范定义组件。 +本文档将介绍Bundle的基本概念以及如何按照规范定义Bundle。 -### 定义 +### 定义 -OpenHarmony软件以组件\(bundle\)作为基本单元,从系统角度看,凡是运行在OpenHarmony上的软件都可以定义为组件;一般来讲,根据组件的应用范围,可以分为: +OpenHarmony软件以bundle作为基本单元,从系统角度看,凡是运行在OpenHarmony上的软件都可以定义为Bundle;一般来讲,根据Bundle的应用范围,可以分为: -- 板级组件:如board、arch、mcu这些与设备硬件相关的组件。 -- 系统组件:一组独立功能的集合,如内核、文件系统、框架等。 -- 应用组件:直接面向用户提供服务的应用\(如wifi\_iot,ip\_camera\)。 +- 板级Bundle:如board、arch、mcu这些与设备硬件相关的Bundle。 +- 系统Bundle:一组独立功能的集合,如内核、文件系统、框架等。 +- 应用Bundle:直接面向用户提供服务的应用\(如wifi\_iot,ip\_camera\)。 -从形式上看,组件是为复用而生,一切可以复用的模块都可以定义为组件,可以分为: +从形式上看,Bundle是为复用而生,一切可以复用的模块都可以定义为Bundle,可以分为: - 源代码 - 二进制 - 代码片段 - 发行版 -### 组件划分原则 +### Bundle划分原则 -原则上应尽可能划分为细颗粒度的组件,以满足最大限度的复用。主要考虑以下几点: +原则上应尽可能划分为细颗粒度的Bundle,以满足最大限度的复用。主要考虑以下几点: -- 独立性:组件的功能应该相对独立,支持独立编译,可以单独对外提供接口和服务; -- 耦合性:如果组件必须依赖其他的组件,才能对外提供服务,应考虑和被依赖的组件合并为一个组件。 -- 相关性:如果一组组件共同完成一项功能,且没有被其他组件依赖,未来也没有被依赖的可能,则可以考虑合并为一个组件。 +- 独立性:Bundle的功能应该相对独立,支持独立编译,可以单独对外提供接口和服务; +- 耦合性:如果Bundle必须依赖其他的Bundle,才能对外提供服务,应考虑和被依赖的Bundle合并为一个Bundle。 +- 相关性:如果一组Bundle共同完成一项功能,且没有被其他Bundle依赖,未来也没有被依赖的可能,则可以考虑合并为一个Bundle。 -### 组件依赖 +### Bundle依赖 -组件的依赖关系分为两种:必选依赖和可选依赖。 +Bundle的依赖关系分为两种:必选依赖和可选依赖。 -- 必选依赖:是指组件A在完成某个功能时,必须引入组件B,调用B的接口或服务配合才能完成。称B为A的必选依赖。 -- 可选依赖:是在组件A在完成某个功能时,可以引入组件C,也可以引入组件D。C和D可以相互替换,称C和D为A的可选依赖。 +- 必选依赖:是指BundleA在完成某个功能时,必须引入BundleB,调用B的接口或服务配合才能完成。称B为A的必选依赖。 +- 可选依赖:是在BundleA在完成某个功能时,可以引入BundleC,也可以引入BundleD。C和D可以相互替换,称C和D为A的可选依赖。 -## 组件构成 +## Bundle构成 -一个组件包一般包含如下内容: +一个Bundle包一般包含如下内容: -- 组件包的代码或库(src目录下的代码文件) -- ohos\_bundles文件夹(存放依赖的组件,安装组件时自动生成,无需提交到代码库) -- 组件包的说明文件\(README.md\) -- 组件包元数据声明文件\(bundle.json\) +- Bundle包的代码或库(src目录下的代码文件) +- ohos\_bundles文件夹(存放依赖的Bundle,安装Bundle时自动生成,无需提交到代码库) +- Bundle包的说明文件\(README.md\) +- Bundle包元数据声明文件\(bundle.json\) - 开源许可文件\(LICENSE\) ``` @@ -75,23 +75,23 @@ OpenHarmony软件以组件\(bundle\)作为基本单元,从系统角度看, ``` -### 代码文件 +### 代码文件 -组件的代码文件和普通的代码目录没有差异。但要注意的是,组件中对外暴露的接口(头文件),会被其他组件所引用,需要单独在bundle.json的dirs中声明。 +Bundle的代码文件和普通的代码目录没有差异。但要注意的是,Bundle中对外暴露的接口(头文件),会被其他Bundle所引用,需要单独在bundle.json的dirs中声明。 -### 说明文件 +### 说明文件 -README.md,为markdown格式的描述关于组件自述说明文件。([语法参考](https://www.markdownguide.org/getting-started/)\) +README.md,为markdown格式的描述关于Bundle自述说明文件。([语法参考](https://www.markdownguide.org/getting-started/)\) -为了帮助他人在hpm上找到该组件,并更方便的使用它,在组件的根目录中包含一个README文件。 +为了帮助他人在hpm上找到该Bundle,并更方便的使用它,在Bundle的根目录中包含一个README文件。 -README文件可能包括如何安装,配置和使用组件包中的实例代码说明,以及可能会对用户有所帮助的任何其他信息。 +README文件可能包括如何安装,配置和使用Bundle包中的实例代码说明,以及可能会对用户有所帮助的任何其他信息。 -每个组件的自述文件将显示在hpm系统的组件详情页面的描述中。 +每个Bundle的自述文件将显示在hpm系统的Bundle详情页面的描述中。 -### 元数据描述文件 +### 元数据描述文件 -bundle.json文件是对当前组件的元数据描述,每个组件中必须包含一个bundle.json文件。 +bundle.json文件是对当前Bundle的元数据描述,每个Bundle中必须包含一个bundle.json文件。 ``` { @@ -133,20 +133,20 @@ bundle.json文件是对当前组件的元数据描述,每个组件中必须包 bundle.json文件具有如下功能: -- name:定义组件的名称,放到组织下, 以@开头,/分割,如:@myorg/mybundle +- name:定义Bundle的名称,放到组织下, 以@开头,/分割,如:@myorg/mybundle -- version:定义组件版本号,如1.0.0,需满足semver的标准。 +- version:定义Bundle版本号,如1.0.0,需满足semver的标准。 -- description:一句话对组件进行简要的描述。 -- dependencies:定义组件的依赖组件。 +- description:一句话对Bundle进行简要的描述。 +- dependencies:定义Bundle的依赖Bundle。 -- envs: 定义组件编译时所需要的参数,包括全局参数以及依赖所需的参数。 +- envs: 定义Bundle编译时所需要的参数,包括全局参数以及依赖所需的参数。 -- scripts:定义在当前组件下能够执行的命令(如编译,构建,测试,烧录等)。 +- scripts:定义在当前Bundle下能够执行的命令(如编译,构建,测试,烧录等)。 -- publishAs:定义组件的发布类型(source:源码,binary:二进制,distribution:发行版,code-segment:代码片段)。 +- publishAs:定义Bundle的发布类型(source:源码,binary:二进制,distribution:发行版,code-segment:代码片段)。 -- segment: 仅针对code-segment类型的组件,定义组件的目标路径(即安装后,组件包中包含的文件复制到的目标路径) +- segment: 仅针对code-segment类型的Bundle,定义Bundle的目标路径(即安装后,Bundle包中包含的文件复制到的目标路径) - dirs:定义发布时打包的目录结构(如头文件)。 - ram&rom:统计相关信息:预计占用ROM和RAM信息。 @@ -154,11 +154,11 @@ bundle.json文件具有如下功能: - 定义其他扩展信息:作者,主页,代码仓库,许可协议,标签,关键字。 - 对于发行版类型,还有个base,可以定义继承自的发行版。 -## 组件管理 +## Bundle管理 -### 依赖关系 +### 依赖关系 -生成基础bundle.json以后,需要继续添加组件依赖来实现更复杂的功能。此时需要知道所依赖组件的名称和版本号,并且把它们定义在bundle.json里面的dependencies字段中。 +生成基础bundle.json以后,需要继续添加Bundle依赖来实现更复杂的功能。此时需要知道所依赖Bundle的名称和版本号,并且把它们定义在bundle.json里面的dependencies字段中。 ``` { @@ -170,13 +170,13 @@ bundle.json文件具有如下功能: } ``` -上述示例中,my-bundle组件依赖于net 1.0.0组件。在全局安装了 hpm CLI 工具之后,执行如下命令可以从远端仓库获取到依赖: +上述示例中,my-bundleBundle依赖于net 1.0.0Bundle。在全局安装了 hpm CLI 工具之后,执行如下命令可以从远端仓库获取到依赖: ``` hpm install ``` -依赖获取以后,会保存到当前组件根目录下到ohos\_bundles文件夹中。组件以及依赖之间会形成一个依赖关系的树状结构。全局安装了 hpm CLI 工具之后,在组件根目录下执行如下命令: +依赖获取以后,会保存到当前Bundle根目录下到ohos\_bundles文件夹中。Bundle以及依赖之间会形成一个依赖关系的树状结构。全局安装了 hpm CLI 工具之后,在Bundle根目录下执行如下命令: ``` username@server MINGW64 /f/showcase/demo/demo @@ -194,22 +194,22 @@ $ hpm list | | +--@demo/dist_tools@4.0.0 ``` -还可以使用可视化的形式,来查看当前组件的依赖关系,执行如下命令: +还可以使用可视化的形式,来查看当前Bundle的依赖关系,执行如下命令: ``` hpm ui ``` -会在本地启动一个web服务(默认会打开浏览器并进入项目页),点击侧边栏的项目依赖图标,打开页面,可以看到项目的依赖组件列表,点击右侧按钮切换到树状视图,就可以看到依赖关系的图形化展示\(如下图\)。 +会在本地启动一个web服务(默认会打开浏览器并进入项目页),点击侧边栏的项目依赖图标,打开页面,可以看到项目的依赖Bundle列表,点击右侧按钮切换到树状视图,就可以看到依赖关系的图形化展示\(如下图\)。 -**图 1** 组件包依赖关系图 +**图 1** Bundle包依赖关系图 -![](figure/zh-cn_image_0000001173313501.png) +![](figure/zh-cn_image_0000001188040429.png) -### hpm操作命令参考 +### hpm操作命令参考 -组件的全生命周期管理,可以通过hpm命令工具进行操作,hpm的操作命令如下(详细帮助可以执行 hpm -h学习): +Bundle的全生命周期管理,可以通过hpm命令工具进行操作,hpm的操作命令如下(详细帮助可以执行 hpm -h学习): **表 1** hpm操作命令 @@ -246,7 +246,7 @@ hpm ui

hpm init bundle

创建组件工程。

+

创建Bundle工程。

hpm init -t template

@@ -259,12 +259,12 @@ hpm ui

hpm install 或hpm i

安装bundle.json中依赖的组件。

+

安装bundle.json中依赖的Bundle。

hpm install bundle@version

安装指定组件版本。

+

安装指定Bundle版本。

卸载

@@ -272,12 +272,12 @@ hpm ui

hpm uninstall bundle

删除depedencies依赖的组件。

+

删除depedencies依赖的Bundle。

hpm remove 或hpm rm bundlename

删除depedencies依赖的组件。

+

删除depedencies依赖的Bundle。

查看

@@ -285,19 +285,19 @@ hpm ui

hpm list 或者 hpm ls

显示当前组件/发行版所有的组件树。

+

显示当前Bundle/发行版所有的Bundle树。

hpm dependencies

生成当前组件/发行版依赖关系数据(在hpm ui也集成了该命令的调用,可以图形化的展示)

+

生成当前Bundle/发行版依赖关系数据(在hpm ui也集成了该命令的调用,可以图形化的展示)

搜索

hpm search name

搜索组件,--json,可以以json格式输出 -type 可以设置搜索组件的类型,包括bundle,distribution,code-segment三种。

+

搜索Bundle,--json,可以以json格式输出 -type 可以设置搜索Bundle的类型,包括bundle,distribution,code-segment三种。

设置hpm配置项

@@ -317,12 +317,12 @@ hpm ui

hpm update

更新当前组件依赖的组件的版本。

+

更新当前Bundle依赖的Bundle的版本。

hpm check-update

检查依赖的组件版本是否有更新。

+

检查依赖的Bundle版本是否有更新。

编译

@@ -330,7 +330,7 @@ hpm ui

hpm build

编译组件/发行版。

+

编译Bundle/发行版。

hpm dist

@@ -342,7 +342,7 @@ hpm ui

hpm pack

本地组件打包依赖。

+

本地Bundle打包依赖。

烧录

@@ -356,7 +356,7 @@ hpm ui

hpm publish

发布组件,发布的组件在仓库中必须唯一,且版本唯一(需要账号登录)。

+

发布Bundle,发布的Bundle在仓库中必须唯一,且版本唯一(需要账号登录)。

执行扩展命令

@@ -398,49 +398,49 @@ hpm ui

hpm code clean|restore

针对依赖的代码段(code-segment)组件,执行清理或还原操作(即根据segment.destPath执行拷贝/删除操作)

+

针对依赖的代码段(code-segment)Bundle,执行清理或还原操作(即根据segment.destPath执行拷贝/删除操作)

生成秘钥

hpm gen-keys

生成公钥/私钥对,将公钥配置到HPM服务端,可以实现hpm-cli 免密登录,发布组件。

+

生成公钥/私钥对,将公钥配置到HPM服务端,可以实现hpm-cli 免密登录,发布Bundle。

生成第三方开源说明

hpm gen-notice

根据每个组件的说明,生成一份合并后的第三方开源说明的合并文件。

+

根据每个Bundle的说明,生成一份合并后的第三方开源说明的合并文件。

-## 组件版本 +## Bundle版本 -### 版本号命名规范 +### 版本号命名规范 名称需要为全小写字母,中间可以使用中划线或者下划线分隔。比如 "bundle", "my\_bundle"。 版本号的格式为 "主版本号.次版本号.修订号" 或 "主版本号.次版本号.修订号-先行版本号",比如 "1.0.0", "1.0.0-beta",详细规格可以参考 [https://semver.org](https://semver.org/)。 -### 版本发布 +### 版本发布 -为了使组件能被其他开发者使用,组件需要上传到远端仓库。组件上传使用如下命令: +为了使Bundle能被其他开发者使用,Bundle需要上传到远端仓库。Bundle上传使用如下命令: ``` hpm publish ``` -命令执行以后,系统会对的整个依赖关系进行检查,下载缺失依赖组件。依赖检查完成后,如果发布类型为binary,系统会对整个组件进行编译,生成二进制文件,然后打包上传。如果使其他上传类型,则直接根据定义的打包规则进行打包,然后上传。 +命令执行以后,系统会对的整个依赖关系进行检查,下载缺失依赖Bundle。依赖检查完成后,如果发布类型为binary,系统会对整个Bundle进行编译,生成二进制文件,然后打包上传。如果使其他上传类型,则直接根据定义的打包规则进行打包,然后上传。 -注意:发布组件需要用户账号登录,需要先拥有hpm的系统账号后,并注册组织,申请组织认证通过后,才拥有发布的权限。 +注意:发布Bundle需要用户账号登录,需要先拥有hpm的系统账号后,并注册组织,申请组织认证通过后,才拥有发布的权限。 -## 发行版 +## 发行版 -发行版通常是将一系列组件组合起来,成为编译可以运行的OpenHarmony解决方案镜像,里面包含了多个依赖的组件,以及脚本,用于描述如何完整编译、链接这些组件。 +发行版通常是将一系列Bundle组合起来,成为编译可以运行的OpenHarmony解决方案镜像,里面包含了多个依赖的Bundle,以及脚本,用于描述如何完整编译、链接这些Bundle。 发行版本身通常不需要包含功能实现代码,仅包含bundle.json描述(设置publishAs为distribution)和一些编译脚本组成。 @@ -472,9 +472,9 @@ hpm dist } ``` -上述定义表明当前组件继承自发行版组件dist-wifi-iot 1.0.0。 +上述定义表明当前Bundle继承自发行版Bundledist-wifi-iot 1.0.0。 -发行版由很多的依赖组件组成,通过bundle.json中的dependencies段来描述,有些依赖是必须的,有些依赖则是根据可以需求增加或删除的。bundle.json中名称前带有?的依赖表示可选依赖,继承它的发行版,可以移除掉该可选组件,再增加别的组件进行替换。 +发行版由很多的依赖Bundle组成,通过bundle.json中的dependencies段来描述,有些依赖是必须的,有些依赖则是根据可以需求增加或删除的。bundle.json中名称前带有?的依赖表示可选依赖,继承它的发行版,可以移除掉该可选Bundle,再增加别的Bundle进行替换。 ``` { @@ -492,13 +492,13 @@ hpm dist } ``` -依赖被移除后,就不会参入组件的构建过程。只有标记为可选的依赖才能够被移除,强行移除未被标记的依赖会出现错误提示。 +依赖被移除后,就不会参入Bundle的构建过程。只有标记为可选的依赖才能够被移除,强行移除未被标记的依赖会出现错误提示。 -## 环境变量说明 +## 环境变量说明 -组件在编译的过程中需要依赖系统提供的环境变量来自定义输出,链接所需二进制文件等等。这里提出的环境变量均指根据需求把所需变量注入脚本执行的上下文中。所以在脚本中可以直接获取到变量的值。下面介绍当前系统存在的几种环境变量。 +Bundle在编译的过程中需要依赖系统提供的环境变量来自定义输出,链接所需二进制文件等等。这里提出的环境变量均指根据需求把所需变量注入脚本执行的上下文中。所以在脚本中可以直接获取到变量的值。下面介绍当前系统存在的几种环境变量。 -全局变量由bundle.json中的envs属性来定义。整个组件中的依赖都可以获取到全局变量定义的值。 +全局变量由bundle.json中的envs属性来定义。整个Bundle中的依赖都可以获取到全局变量定义的值。 ``` { @@ -508,7 +508,7 @@ hpm dist } ``` -不同组件在引入依赖的过程中可以传入不同的参数,从而使依赖的编译可以满足当前组件的需求。依赖中定义的参数可以在对应依赖脚本执行的上下文中获取到。 +不同Bundle在引入依赖的过程中可以传入不同的参数,从而使依赖的编译可以满足当前Bundle的需求。依赖中定义的参数可以在对应依赖脚本执行的上下文中获取到。 ``` { @@ -521,7 +521,7 @@ hpm dist } ``` -组件在链接二进制文件的时候,需要知道二进制文件在依赖中的路径,所以依赖的路径会作为环境变量传入编译组件中。 +Bundle在链接二进制文件的时候,需要知道二进制文件在依赖中的路径,所以依赖的路径会作为环境变量传入编译Bundle中。 传入的环境变量的格式为DEP\_BundleName,BundleName为依赖的名称,例如 DEP\_first\_bundle。 @@ -545,5 +545,5 @@ hpm dist 系统中存在两个固定环境变量: - DEP\_OHOS\_BUNDLES:表示ohos\_bundles文件夹所在的路径。 -- DEP\_BUNDLE\_BASE:表示最外层组件的路径。 +- DEP\_BUNDLE\_BASE:表示最外层Bundle的路径。 diff --git a/zh-cn/device-dev/driver/Readme-CN.md b/zh-cn/device-dev/driver/Readme-CN.md index 6651085f3517295a31202d656c994a57540fa765..30995bfc1b6c039d9dfe05a24249ab74a0603026 100755 --- a/zh-cn/device-dev/driver/Readme-CN.md +++ b/zh-cn/device-dev/driver/Readme-CN.md @@ -1,6 +1,6 @@ -# 驱动使用指南 +# 驱动使用指南 -- [HDF驱动框架](driver.md) +- [HDF驱动框架](driver-hdf.md) - [HDF开发概述](driver-hdf-overview.md) - [驱动开发](driver-hdf-development.md) - [驱动服务管理](driver-hdf-servicemanage.md) diff --git a/zh-cn/device-dev/driver/driver-hdf-development.md b/zh-cn/device-dev/driver/driver-hdf-development.md index 492abc6c66f47310c998d216acf5409cad6ee775..60f3a0918908d3b8d2598926f3a8c142d196ca34 100644 --- a/zh-cn/device-dev/driver/driver-hdf-development.md +++ b/zh-cn/device-dev/driver/driver-hdf-development.md @@ -66,7 +66,6 @@ HDF框架以组件化的驱动模型作为核心设计思路,为开发者提 HDF_INIT(g_sampleDriverEntry); ``` - 2. 驱动编译 - 驱动代码的编译必须要使用HDF框架提供的Makefile模板进行编译。 @@ -86,7 +85,6 @@ HDF框架以组件化的驱动模型作为核心设计思路,为开发者提 LIB_SUBDIRS += #驱动代码Makefile的目录 ``` - 3. 驱动配置 HDF使用HCS作为配置描述源码,HCS详细介绍参考[配置管理](driver-hdf-manage.md)介绍。 diff --git a/zh-cn/device-dev/driver/driver-hdf.md b/zh-cn/device-dev/driver/driver-hdf.md new file mode 100644 index 0000000000000000000000000000000000000000..8c8cb3c3482f81e23937cc64408f039989db86f3 --- /dev/null +++ b/zh-cn/device-dev/driver/driver-hdf.md @@ -0,0 +1,15 @@ +# HDF驱动框架 + +- **[HDF开发概述](driver-hdf-overview.md)** + +- **[驱动开发](driver-hdf-development.md)** + +- **[驱动服务管理](driver-hdf-servicemanage.md)** + +- **[驱动消息机制管理](driver-hdf-news.md)** + +- **[配置管理](driver-hdf-manage.md)** + +- **[HDF开发实例](driver-hdf-sample.md)** + + diff --git a/zh-cn/device-dev/driver/driver-peripherals-lcd-des.md b/zh-cn/device-dev/driver/driver-peripherals-lcd-des.md index 90f54e12fbaa67eab88e46ecb651c4f7fb4bb7d1..95b1bfb103250a7e3e7f4d0a0af69c1a62b10dfd 100644 --- a/zh-cn/device-dev/driver/driver-peripherals-lcd-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-lcd-des.md @@ -66,7 +66,6 @@ Display驱动模型基于HDF驱动框架、Platform接口及OSAL接口开发, 根据LCD硬件接口,使用Platform接口层提供的I2C、SPI、MIPI等接口,下载LCD初始化序列,初始化参数序列可以参考LCD供应商提供的SPEC。 - 4. 根据需求实现HDF框架其他接口,比如Release接口。 5. 根据需求使用HDF框架可创建其他设备节点,用于业务逻辑或者调试功能。 diff --git a/zh-cn/device-dev/driver/driver-peripherals-touch-des.md b/zh-cn/device-dev/driver/driver-peripherals-touch-des.md index 5f4c46ba8ba7880cc11846b81f618167626bc455..d2e35a9c8822e87d3a8bbdec7be37f0994ca72d8 100644 --- a/zh-cn/device-dev/driver/driver-peripherals-touch-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-touch-des.md @@ -68,14 +68,13 @@ Touchscreen器件的硬件接口相对简单,根据PIN脚的属性,可以简 通常情况下,touchscreen驱动IC和LCD驱动IC是相互分离的,这种情况下,touchscreen驱动IC一般同时需要1.8v和3.3v两路供电。随着芯片演进,业内已有touchscreen驱动IC和LCD驱动IC集成在一颗IC中的芯片案例,对touchscreen而言,只需要关注1.8v供电即可,其内部需要的3.3v电源,会在驱动IC内部从LCD的VSP电源(典型值5.5V)中分出来。 - 2. **IO控制接口** - Reset:reset管脚,用于在系统休眠、唤醒时,由主机侧对驱动IC进行复位操作。 - INT:中断管脚,需要在驱动初始化时,配置为输入上拉状态。在驱动IC检测到外部触摸信号后,通过操作中断管脚来触发中断,器件驱动则会在中断处理函数中进行报点数据读取等操作。 3. **通信接口** - - I2C:由于touchscreen的报点数据量相对较少,所以一般选用I2C方式传输数据。I2C的具体协议及对应操作接口,可以参考Platform接口层中的[“I2C”使用指南](drive-platform-i2c-des.md#section1695201514281)。 - - SPI:部分厂商,由于需要传递的数据不止报点坐标,而是需要获取基础容值,数据量较大,所以会选用SPI通信方式。SPI的具体协议及对应操作接口,可以参考Platform接口层中的[“SPI” 使用指南](drive-platform-spi-des.md#section71363452477)。 + - I2C:由于touchscreen的报点数据量相对较少,所以一般选用I2C方式传输数据。I2C的具体协议及对应操作接口,可以参考Platform接口层中的[“I2C”使用指南](driver-platform-i2c-des.md#section1695201514281)。 + - SPI:部分厂商,由于需要传递的数据不止报点坐标,而是需要获取基础容值,数据量较大,所以会选用SPI通信方式。SPI的具体协议及对应操作接口,可以参考Platform接口层中的[“SPI” 使用指南](driver-platform-spi-des.md#section71363452477)。 ## 开发指导 @@ -109,7 +108,7 @@ Input驱动模型是基于HDF框架、Platform接口和OSAL接口开发,不区 3. 实现器件差异化适配接口 - 根据硬件单板设计的通信接口,使用Platform接口层提供的管脚操作接口配置对应的复位管脚、中断管脚以及电源操作,对于GPIO的操作,可参考[GPIO操作接口指导](drive-platform-gpio-des.md#section259614242196) + 根据硬件单板设计的通信接口,使用Platform接口层提供的管脚操作接口配置对应的复位管脚、中断管脚以及电源操作,对于GPIO的操作,可参考[GPIO操作接口指导](driver-platform-gpio-des.md#section259614242196) ## 开发实例 diff --git a/zh-cn/device-dev/driver/driver-platform-i2c-des.md b/zh-cn/device-dev/driver/driver-platform-i2c-des.md index 915c5f440eeb70bb1ebff2640306885b272c33e9..ec00c3728c1015b057c0424337e80e1fa350ffe2 100644 --- a/zh-cn/device-dev/driver/driver-platform-i2c-des.md +++ b/zh-cn/device-dev/driver/driver-platform-i2c-des.md @@ -405,7 +405,7 @@ static int32_t TestCaseI2c(void) } OsalMSleep(10); - /* 从TP-IC的0xDO寄存器连续读7字节数据 */ + /* 从TP-IC的0xD5寄存器连续读7字节数据 */ ret = TpI2cReadReg(&tpDevice, 0xD5, bufRead, 7); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: tp i2c read reg fail!:%d", __func__, ret); diff --git a/zh-cn/device-dev/driver/driver-platform-spi-des.md b/zh-cn/device-dev/driver/driver-platform-spi-des.md index 47581f9a40529bf796a1b544cb059d6e8032ff54..b903ae469fc1ff91ea3a0bf0ad2713ea20e0de09 100644 --- a/zh-cn/device-dev/driver/driver-platform-spi-des.md +++ b/zh-cn/device-dev/driver/driver-platform-spi-des.md @@ -224,7 +224,7 @@ int32\_t SpiGetCfg\(DevHandle handle, struct SpiCfg \*cfg\); ``` int32_t ret; struct SpiCfg cfg = {0}; /* SPI配置信息*/ -ret = SpiGetCfg(spiHandle, &cfg); /* 配置SPI设备属性 */ +ret = SpiGetCfg(spiHandle, &cfg); /* 获取SPI设备属性 */ if (ret != 0) { HDF_LOGE("SpiGetCfg: failed, ret %d\n", ret); } diff --git a/zh-cn/device-dev/driver/driver.md b/zh-cn/device-dev/driver/driver.md index a0825c12d1ed8456318aca70316eaf6500251dab..58ee5fe7bc877da89acf3d2c7a5f08d2fd2f0a69 100644 --- a/zh-cn/device-dev/driver/driver.md +++ b/zh-cn/device-dev/driver/driver.md @@ -1,16 +1,6 @@ # 驱动使用指南 -- **[HDF开发概述](driver-hdf-overview.md)** - -- **[驱动开发](driver-hdf-development.md)** - -- **[驱动服务管理](driver-hdf-servicemanage.md)** - -- **[驱动消息机制管理](driver-hdf-news.md)** - -- **[配置管理](driver-hdf-manage.md)** - -- **[HDF开发实例](driver-hdf-sample.md)** +- **[HDF驱动框架](driver-hdf.md)** - **[平台驱动](driver-platform.md)** diff --git a/zh-cn/device-dev/get-code/Readme-CN.md b/zh-cn/device-dev/get-code/Readme-CN.md index 82da2d561e3ade5ee95dbe4c1411c4114ad6ad2b..354df4aa3df3d3cf052620b391bc9be827f146a4 100755 --- a/zh-cn/device-dev/get-code/Readme-CN.md +++ b/zh-cn/device-dev/get-code/Readme-CN.md @@ -1,9 +1,7 @@ # 获取源码 -- [获取源码](sourcecode.md) - - [源码获取](sourcecode-acquire.md) - -- [获取工具](gettools.md) - - [Docker编译环境](gettools-acquire.md) - - [IDE](gettools-ide.md) - +- [获取源码](sourcecode.md) + - [源码获取](sourcecode-acquire.md) +- [获取工具](gettools.md) + - [Docker编译环境](gettools-acquire.md) + - [IDE](gettools-ide.md) \ No newline at end of file diff --git a/zh-cn/device-dev/get-code/figure/3-20.png b/zh-cn/device-dev/get-code/figure/3-27.png similarity index 100% rename from zh-cn/device-dev/get-code/figure/3-20.png rename to zh-cn/device-dev/get-code/figure/3-27.png diff --git a/zh-cn/device-dev/get-code/gettools-acquire.md b/zh-cn/device-dev/get-code/gettools-acquire.md index 942635e189a91797d3624a574a4d2892d52e6a7d..e148884a940a092798c637185a3bd5f68c338973 100644 --- a/zh-cn/device-dev/get-code/gettools-acquire.md +++ b/zh-cn/device-dev/get-code/gettools-acquire.md @@ -287,7 +287,6 @@ docker\_dist是一个[HPM](https://hpm.harmonyos.com/)系统中的模板组件 hpm run docker ``` - 以上两种方式以@ohos/hispark\_taurus为例,执行成功结果如下: ``` diff --git a/zh-cn/device-dev/get-code/gettools-ide.md b/zh-cn/device-dev/get-code/gettools-ide.md index 8217ddc1222045e4633d5cd05289e20169ce90e4..64dd88b151b356c4dd124b8bcf989f3c1f6e1c42 100644 --- a/zh-cn/device-dev/get-code/gettools-ide.md +++ b/zh-cn/device-dev/get-code/gettools-ide.md @@ -9,7 +9,7 @@ HUAWEI DevEco Device Tool是OpenHarmony面向智能设备开发者提供的一 Huawei DevEco Device Tool支持 OpenHarmony设备开发的演进路标如下: -![](figure/3-20.png) +![](figure/3-27.png) ## 获取应用开发工具(HUAWEI DevEco Studio) diff --git a/zh-cn/device-dev/get-code/sourcecode-acquire.md b/zh-cn/device-dev/get-code/sourcecode-acquire.md index 622d4cd83b108673913067f2dea6ff3b883403dc..5c61d356c04001e28293ca9a1e275b1928940f71 100644 --- a/zh-cn/device-dev/get-code/sourcecode-acquire.md +++ b/zh-cn/device-dev/get-code/sourcecode-acquire.md @@ -21,12 +21,9 @@ OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及 开源代码仓库地址:[https://openharmony.gitee.com](https://openharmony.gitee.com) ->![](../public_sys-resources/icon-note.gif) **说明:** ->当前的OpenHarmony源代码仅支持在Linux环境下编译。 - ## 源码获取概述 -本文档将介绍如何获取OpenHarmony源码并说明OpenHarmony的源码目录结构。OpenHarmony的代码以[组件](../bundles/bundles-standard-rules.md)的形式开放,开发者可以通过如下其中一种方式获取: +本文档将介绍如何获取OpenHarmony源码并说明OpenHarmony的源码目录结构。OpenHarmony的代码以[组件](../bundles/oem_bundle_standard_des.md)的形式开放,开发者可以通过如下其中一种方式获取: - **获取方式1**:从代码仓库获取。通过repo或git工具从代码仓库中下载,此方式可获取最新代码。 - **获取方式2**:通过HPM包管理器获取。在[HPM](https://hpm.harmonyos.com)网站,查找满足需求的开源发行版,直接下载(或者定制后下载),再通过hpm-cli命令工具将所需的组件及工具链下载、安装到本地。 @@ -159,7 +156,6 @@ OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及 ![](figure/zh-cn_image_0000001119915556.png) - 2. 了解发行版详情。 1. 仔细阅读发行版的说明信息,以了解使用场景、特性、组件构成、使用方法以及如何进行定制化,如下图所示。 @@ -182,7 +178,6 @@ OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及 ![](figure/zh-cn_image_0000001166715379.png) - 4. 下载安装组件。 1. 解压下载的压缩文件,用命令行工具CMD(Linux下的Shell终端) 2. 在解压后的文件目录下执行hpm install指令 diff --git a/zh-cn/device-dev/glossary/Readme-CN.md b/zh-cn/device-dev/glossary/Readme-CN.md index e69d48c93789ee931046637f2f6262f867c7a4ef..7b99afde7fd27ef3bc83f063d1735194d114f6cc 100755 --- a/zh-cn/device-dev/glossary/Readme-CN.md +++ b/zh-cn/device-dev/glossary/Readme-CN.md @@ -1,4 +1,3 @@ # 术语 -- [术语](glossary.md) - +[术语](glossary.md) \ No newline at end of file diff --git a/zh-cn/device-dev/glossary/glossary.md b/zh-cn/device-dev/glossary/glossary.md index 7d73579241e5befbae77bbba662eb15df86a04ab..f14d2560745085f42606085fc9afaea7e02024a1 100644 --- a/zh-cn/device-dev/glossary/glossary.md +++ b/zh-cn/device-dev/glossary/glossary.md @@ -97,3 +97,6 @@ - Standard System,标准系统:面向应用处理器,例如Arm Cortex-A的设备,参考内存≥128MiB,提供增强的交互能力,提供3D GPU以及硬件合成能力,提供更多控件以及动效更丰富的图形能力,提供完整的应用框架。典型产品有高端的冰箱显示屏等。 +- **[术语](glossary.md)** + + diff --git a/zh-cn/device-dev/guide/Readme-CN.md b/zh-cn/device-dev/guide/Readme-CN.md index aa2470b29a038a4c9b924c787a6cb564b5c97abb..e476a6f215c60a2d45c37964258860fb7bb079e3 100755 --- a/zh-cn/device-dev/guide/Readme-CN.md +++ b/zh-cn/device-dev/guide/Readme-CN.md @@ -1,39 +1,35 @@ -# 设备开发指南 - -- [WLAN连接类产品](device-wifi.md) - - [LED外设控制](device-wifi-led-outcontrol.md) - - [集成三方SDK](device-wifi-sdk.md) - -- [无屏摄像头类产品](device-iotcamera.md) - - [概述](device-iotcamera-control-overview.md) - - [示例开发](device-iotcamera-control-demo.md) - - [拍照开发指导](device-iotcamera-control-demo-photodevguide.md) - - [录像开发指导](device-iotcamera-control-demo-videodevguide.md) - - - [应用实例](device-iotcamera-control-example.md) - -- [带屏摄像头类产品](device-camera.md) - - [屏幕和摄像头控制](device-camera-control.md) - - [概述](device-camera-control-overview.md) - - [示例开发](device-camera-control-demo.md) - - [拍照开发指导](device-camera-control-demo-photoguide.md) - - [录像开发指导](device-camera-control-demo-videoguide.md) - - [预览开发指导](device-camera-control-demo-previewguide.md) - - - [应用实例](device-camera-control-example.md) - - - [视觉应用开发](device-camera-visual.md) - - [概述](device-camera-visual-overview.md) - - [开发准备](device-camera-visual-prepare.md) - - [添加页面](device-camera-visual-addpage.md) - - [开发首页](device-camera-visual-first-page.md) - - [开发详情页](device-camera-visual-details.md) - - [调试打包](device-camera-visual-debug.md) - - [真机运行](device-camera-visual-run.md) - - [常见问题](device-camera-visual-faqs.md) - -- [时钟应用开发指导](device-clock-guide.md) -- [平台驱动开发示例](device-driver-demo.md) -- [外设驱动开发示例](device-outerdriver-demo.md) - +# 设备开发指南 + +- [轻量和小型系统设备](device-lite.md) + - [WLAN连接类产品](device-wlan.md) + - [LED外设控制](oem_wifi_sdk_des.md) + - [集成三方SDK](device-wlan-sdk.md) + - [无屏摄像头类产品](device-iotcamera.md) + - [摄像头控制](device-iotcamera-control.md) + - [概述](device-iotcamera-control-overview.md) + - [示例开发](device-iotcamera-control-demo.md) + - [拍照开发指导](device-iotcamera-control-demo-photodevguide.md) + - [录像开发指导](device-iotcamera-control-demo-videodevguide.md) + - [应用实例](device-iotcamera-control-example.md) + - [带屏摄像头类产品](device-camera.md) + - [屏幕和摄像头控制](device-camera-control.md) + - [概述](device-camera-control-overview.md) + - [示例开发](device-camera-control-demo.md) + - [拍照开发指导](device-camera-control-demo-photoguide.md) + - [录像开发指导](device-camera-control-demo-videoguide.md) + - [预览开发指导](device-camera-control-demo-previewguide.md) + - [应用实例](device-camera-control-example.md) + - [视觉应用开发](device-camera-visual.md) + - [概述](device-camera-visual-overview.md) + - [开发准备](device-camera-visual-prepare.md) + - [添加页面](device-camera-visual-addpage.md) + - [开发首页](device-camera-visual-firstpage.md) + - [开发详情页](device-camera-visual-details.md) + - [调试打包](device-camera-visual-debug.md) + - [真机运行](device-camera-visual-run.md) + - [常见问题](device-camera-visual-faqs.md) +- [标准系统设备](device-standard.md) + - [时钟应用开发指导](device-clock-guide.md) + - [平台驱动开发示例](device-driver-demo.md) + - [外设驱动开发示例](device-outerdriver-demo.md) diff --git a/zh-cn/device-dev/guide/device-camera-control-example.md b/zh-cn/device-dev/guide/device-camera-control-example.md index a092908acd9e92234b09634c4cdef1cf1a3d3c94..b6d605b04e649928de22fc84d90d947128c5dd2e 100644 --- a/zh-cn/device-dev/guide/device-camera-control-example.md +++ b/zh-cn/device-dev/guide/device-camera-control-example.md @@ -3,7 +3,7 @@ 本示例将运行源码中的camera示例代码,通过本示例可以实现对开发板拍照、录像及预览功能的控制。 - 本示例源码路径为“applications/sample/camera/media/camera\_sample.cpp”。 -- 在运行本示例前需先完成编译烧录、运行镜像等步骤,相关操作请参考[Hi3516快速入门](../quick-start/quickstart-lite-introduction-hi3516.md#section26131214194212)。 +- 在运行本示例前需先完成编译烧录、运行镜像等步骤,相关操作请参考[Hi3516快速入门](../quick-start/oem_minitinier_des_3516.md#section26131214194212)。 >![](../public_sys-resources/icon-note.gif) **说明:** >开发板启动后默认会加载launcher应用,应用的图形界面默认显示在媒体图层上方,会影响camera\_sample的演示结果,因此需要在编译或是打包时去掉launcher应用。 diff --git a/zh-cn/device-dev/guide/device-camera-visual-first-page.md b/zh-cn/device-dev/guide/device-camera-visual-firstpage.md similarity index 99% rename from zh-cn/device-dev/guide/device-camera-visual-first-page.md rename to zh-cn/device-dev/guide/device-camera-visual-firstpage.md index 354097ab25c36055562f5c6469393e8f73fba01d..bbfa60c30d6d6a901aa1e190145711955b69af50 100644 --- a/zh-cn/device-dev/guide/device-camera-visual-first-page.md +++ b/zh-cn/device-dev/guide/device-camera-visual-firstpage.md @@ -111,7 +111,6 @@ } ``` - - index="\{\{swiperPage\}\}" duration="500" onchange="swiperChange" 这些代码用来设置组件的属性和事件。其中,duration="500" 表示设置swiper的页面滑动的动画时长为500ms。 - index="\{\{swiperPage\}\}"设置了swiper子组件索引值,\{\{swiperPage\}\}这种写法表示index的值是和js代码中的swiperPage变量动态绑定的,index的值会随着swiperPage变动而改变。 - onchange="swiperChange" 设置了swiper组件的change事件和函数swiperChange绑定,对应的js代码如下: @@ -141,7 +140,6 @@ } ``` - 4. 设置一个城市的空气质量信息为一屏,在一屏内,要展示多种信息,分别使用不同的控件进行展示。 在swiper中添加两个子组件stack(绝对布局),每个stack组件内分别添加text、image、progress等组件来显示对应的信息 ,页面结构如下: diff --git a/zh-cn/device-dev/guide/device-camera-visual-run.md b/zh-cn/device-dev/guide/device-camera-visual-run.md index 3e7c3f1d165781cccae6694ca9327357317a6e40..59cea7e09931c4aff998255917c9ec2804d5eb3a 100644 --- a/zh-cn/device-dev/guide/device-camera-visual-run.md +++ b/zh-cn/device-dev/guide/device-camera-visual-run.md @@ -1,6 +1,6 @@ # 真机运行 -应用编译打包后即可安装到开发板。安装应用前需要先完成[DevEco Device Tool的安装配置](https://device.harmonyos.com/cn/docs/ide/user-guides/service_introduction-0000001050166905),然后将OpenHarmony烧录到开发板并运行。编译烧录、运行镜像的基本操作请参考快速入门手册:[Hi3516快速入门](../quick-start/quickstart-lite-introduction-hi3516.md#section26131214194212)。完成镜像运行,系统正常启动后,执行如下步骤安装或卸载三方应用。 +应用编译打包后即可安装到开发板。安装应用前需要先完成[DevEco Device Tool的安装配置](https://device.harmonyos.com/cn/docs/ide/user-guides/service_introduction-0000001050166905),然后将OpenHarmony烧录到开发板并运行。编译烧录、运行镜像的基本操作请参考快速入门手册:[Hi3516快速入门](../quick-start/oem_minitinier_des_3516.md#section26131214194212)。完成镜像运行,系统正常启动后,执行如下步骤安装或卸载三方应用。 1. 将IDE编译的未签名应用安装包和安装工具(镜像文件生成目录中的dev\_tools)放在sdcard中,将sdcard插入开发板卡槽。 2. 应用安装默认要校验签名,需要执行以下命令,关闭签名校验。 diff --git a/zh-cn/device-dev/guide/device-camera-visual.md b/zh-cn/device-dev/guide/device-camera-visual.md index ca4e46538b7894fdc3ce840b2b67f185d6e47d29..a0b185fbb0dbe44407302c27b9876869b7d1b723 100644 --- a/zh-cn/device-dev/guide/device-camera-visual.md +++ b/zh-cn/device-dev/guide/device-camera-visual.md @@ -6,7 +6,7 @@ - **[添加页面](device-camera-visual-addpage.md)** -- **[开发首页](device-camera-visual-first-page.md)** +- **[开发首页](device-camera-visual-firstpage.md)** - **[开发详情页](device-camera-visual-details.md)** diff --git a/zh-cn/device-dev/guide/device-clock-guide.md b/zh-cn/device-dev/guide/device-clock-guide.md index a615280a6e27bcf8c37efb75c72ac494e638ad11..4905dd828652d844a1f3670a8a6f66600ed2d79a 100644 --- a/zh-cn/device-dev/guide/device-clock-guide.md +++ b/zh-cn/device-dev/guide/device-clock-guide.md @@ -177,7 +177,6 @@ ``` - - **index.css文件** ``` @@ -217,7 +216,6 @@ } ``` - - **index.js:** js文件主要用于实现App应用的逻辑交互。在本页面js文件中,需要实现如下功能:定时获取系统时间。 @@ -263,7 +261,7 @@ ## 真机运行 -应用签名打包后即可安装到开发板。安装应用前需要先完成[DevEco Device Tool的安装配置](https://device.harmonyos.com/cn/docs/ide/user-guides/service_introduction-0000001050166905),然后将OpenHarmony系统烧录到开发板并运行。编译烧录、运行镜像的基本操作请参考快速入门手册:[标准系统Hi3516快速入门](../quick-start/quickstart-standard.md)。完成镜像运行,系统正常启动后,执行如下步骤安装或卸载应用。 +应用签名打包后即可安装到开发板。安装应用前需要先完成[DevEco Device Tool的安装配置](https://device.harmonyos.com/cn/docs/ide/user-guides/service_introduction-0000001050166905),然后将OpenHarmony系统烧录到开发板并运行。编译烧录、运行镜像的基本操作请参考快速入门手册:[标准系统Hi3516快速入门](../quick-start/quickstart-standard-overview.md)。完成镜像运行,系统正常启动后,执行如下步骤安装或卸载应用。 1. 从开发者工具代码仓路径中获取hdc客户端。 diff --git a/zh-cn/device-dev/guide/device-driver-demo.md b/zh-cn/device-dev/guide/device-driver-demo.md index 73e75ffda88df9a190e7e818a90852cb29c26734..1220e92265d08302120f54b3173db207529d966f 100644 --- a/zh-cn/device-dev/guide/device-driver-demo.md +++ b/zh-cn/device-dev/guide/device-driver-demo.md @@ -34,7 +34,7 @@ HDF驱动框架为常用外围设备提供了标准的驱动框架,驱动开 ## 环境准备 -环境准备具体操作请参考[标准系统基础环境搭建](../quick-start/quickstart-standard.md)。 +环境准备具体操作请参考[标准系统基础环境搭建](../quick-start/quickstart-standard-overview.md)。 >![](../public_sys-resources/icon-notice.gif) **须知:** >本示例针对OpenHarmony轻量系统、小型系统、标准系统都适用,本文以标准系统为例。其他系统的开发者可参考对应系统的指导文档进行环境搭建。 diff --git a/zh-cn/device-dev/guide/device-iotcamera-control-example.md b/zh-cn/device-dev/guide/device-iotcamera-control-example.md index 8f7e480ded6a00d4f830b0bde6413d9412cf7e2d..56bd5df7ff309943182b86a5da61732f251f9fdd 100644 --- a/zh-cn/device-dev/guide/device-iotcamera-control-example.md +++ b/zh-cn/device-dev/guide/device-iotcamera-control-example.md @@ -1,6 +1,6 @@ # 应用实例 -- 开发板介绍、编译烧录、运行镜像等操作请参考[Hi3518快速入门](../quick-start/quickstart-lite-introduction-hi3518.md#section14815247616),编译结果包含示例,结果文件为out/ipcamera\_hi3518ev300/dev\_tools/bin/camera\_sample,可将文件通过读卡器复制至TF卡中,或者修改camera\_sample的编译脚本将结果文件复制至rootfs.img中。 +- 开发板介绍、编译烧录、运行镜像等操作请参考[Hi3518快速入门](../quick-start/oem_minitinier_des_3518.md#section14815247616),编译结果包含示例,结果文件为out/ipcamera\_hi3518ev300/dev\_tools/bin/camera\_sample,可将文件通过读卡器复制至TF卡中,或者修改camera\_sample的编译脚本将结果文件复制至rootfs.img中。 修改applications/sample/camera/media/BUILD.gn中的output\_dir。 diff --git a/zh-cn/device-dev/guide/device-lite.md b/zh-cn/device-dev/guide/device-lite.md new file mode 100644 index 0000000000000000000000000000000000000000..5e2ac4c8748d7eb7572c07e2b886b3fd3d6ad344 --- /dev/null +++ b/zh-cn/device-dev/guide/device-lite.md @@ -0,0 +1,9 @@ +# 轻量和小型系统设备 + +- **[WLAN连接类产品](device-wlan.md)** + +- **[无屏摄像头类产品](device-iotcamera.md)** + +- **[带屏摄像头类产品](device-camera.md)** + + diff --git a/zh-cn/device-dev/guide/device-outerdriver-demo.md b/zh-cn/device-dev/guide/device-outerdriver-demo.md index 9526546a58e1da063e682b36e30a6a5f887ea6e7..523d084d55a16489d99fe4c2816d9beb13e77433 100644 --- a/zh-cn/device-dev/guide/device-outerdriver-demo.md +++ b/zh-cn/device-dev/guide/device-outerdriver-demo.md @@ -22,7 +22,7 @@ ## 概述 -本文档将介绍如何基于Hi3516DV300开发板完成基于HDF\_Input模型的触摸屏器件驱动开发,从而使开发者快速入门,进行基于的外设驱动开发。 +本文档将介绍如何基于Hi3516DV300开发板完成基于HDF\_Input模型的触摸屏器件驱动开发,从而使开发者快速入门,进行基于OpenHarmony的外设驱动开发。 ### 硬件资源简介 @@ -44,7 +44,7 @@ Input驱动模型核心部分由设备管理层、公共驱动层、器件驱动 ## 环境搭建 -环境准备具体操作请参考[标准系统基础环境搭建](../quick-start/quickstart-standard.md)。 +环境准备具体操作请参考[标准系统基础环境搭建](../quick-start/quickstart-standard-overview.md)。 >![](../public_sys-resources/icon-notice.gif) **须知:** >本示例针对OpenHarmony轻量系统、小型系统、标准系统都适用,本文以标准系统为例。其他系统的开发者可参考对应系统的指导文档进行环境搭建。 @@ -335,7 +335,7 @@ Input模型由三层驱动组成,开发者适配一款全新触摸屏驱动只 其中touch\_gt911.o为本示例中追加的内容。 -2. 具体编译及烧录操作请参考[标准系统快速入门编译及烧录章节](../nottoctopics/zh-cn_topic_0000001135402541.md#section375234715135)。 +2. 具体编译及烧录操作请参考[标准系统快速入门编译及烧录章节](../quick-start/quickstart-standard-burn.md)。 ## 调试验证 diff --git a/zh-cn/device-dev/guide/device-standard.md b/zh-cn/device-dev/guide/device-standard.md new file mode 100644 index 0000000000000000000000000000000000000000..15aec1754a40139d57b8b98058b5a4d5037e231a --- /dev/null +++ b/zh-cn/device-dev/guide/device-standard.md @@ -0,0 +1,9 @@ +# 标准系统设备 + +- **[时钟应用开发指导](device-clock-guide.md)** + +- **[平台驱动开发示例](device-driver-demo.md)** + +- **[外设驱动开发示例](device-outerdriver-demo.md)** + + diff --git a/zh-cn/device-dev/guide/device-wifi-sdk.md b/zh-cn/device-dev/guide/device-wlan-sdk.md similarity index 100% rename from zh-cn/device-dev/guide/device-wifi-sdk.md rename to zh-cn/device-dev/guide/device-wlan-sdk.md diff --git a/zh-cn/device-dev/guide/device-wifi.md b/zh-cn/device-dev/guide/device-wlan.md similarity index 39% rename from zh-cn/device-dev/guide/device-wifi.md rename to zh-cn/device-dev/guide/device-wlan.md index 3f85bc6f6c8626e1314093b28146dc989ee55167..ece3a35d670fe43de2892f4eae35b6d8f25a4e29 100644 --- a/zh-cn/device-dev/guide/device-wifi.md +++ b/zh-cn/device-dev/guide/device-wlan.md @@ -1,7 +1,7 @@ # WLAN连接类产品 -- **[LED外设控制](device-wifi-led-outcontrol.md)** +- **[LED外设控制](oem_wifi_sdk_des.md)** -- **[集成三方SDK](device-wifi-sdk.md)** +- **[集成三方SDK](device-wlan-sdk.md)** diff --git a/zh-cn/device-dev/guide/device.md b/zh-cn/device-dev/guide/device.md index 1cb2d60315d1a1a78b6b1452c4a4167bbc48ab8a..f524abc29dce1400b1767ae97a67f28383768d9c 100644 --- a/zh-cn/device-dev/guide/device.md +++ b/zh-cn/device-dev/guide/device.md @@ -1,15 +1,7 @@ -# 设备开发指南 +# 设备 -- **[WLAN连接类产品](device-wifi.md)** +- **[轻量和小型系统设备](device-lite.md)** -- **[无屏摄像头类产品](device-iotcamera.md)** - -- **[带屏摄像头类产品](device-camera.md)** - -- **[时钟应用开发指导](device-clock-guide.md)** - -- **[平台驱动开发示例](device-driver-demo.md)** - -- **[外设驱动开发示例](device-outerdriver-demo.md)** +- **[标准系统设备](device-standard.md)** diff --git a/zh-cn/device-dev/guide/device-wifi-led-outcontrol.md b/zh-cn/device-dev/guide/oem_wifi_sdk_des.md similarity index 91% rename from zh-cn/device-dev/guide/device-wifi-led-outcontrol.md rename to zh-cn/device-dev/guide/oem_wifi_sdk_des.md index 2d4970fa19c09b4fc4140751446e32bbed4e7ee3..678a8f2f287387542b48e814888d8676bac99f81 100644 --- a/zh-cn/device-dev/guide/device-wifi-led-outcontrol.md +++ b/zh-cn/device-dev/guide/oem_wifi_sdk_des.md @@ -10,7 +10,7 @@ OpenHarmony WLAN模组基于Hi3861平台提供了丰富的外设操作能力, ## 开发 -1. 请先完成[《Hi3861快速入门》](../quick-start/quickstart-lite-introduction-hi3861.md#section19352114194115)。 +1. 请先完成[《Hi3861快速入门》](../quick-start/oem_minitinier_des_3861.md#section19352114194115)。 LED控制参考示例存放于applications/sample/wifi-iot/app/iothardware/led\_example.c文件中。 @@ -101,7 +101,7 @@ OpenHarmony WLAN模组基于Hi3861平台提供了丰富的外设操作能力, ## 验证 -编译过程请参考《[Hi3861快速入门-源码编译](../quick-start/quickstart-lite-steps-board3861-connection.md#section191121332125319)》,烧录过程请参考《[Hi3861快速入门-镜像烧录](../quick-start/quickstart-lite-steps-board3861-connection.md#section19458165166)》。 +编译过程请参考《[Hi3861快速入门-源码编译](../quick-start/quickstart-lite-steps-hi3861-connection.md#section191121332125319)》,烧录过程请参考《[Hi3861快速入门-镜像烧录](../quick-start/quickstart-lite-steps-hi3861-connection.md#section19458165166)》。 完成以上两步后,按下RST键复位模组,可发现LED在周期性闪烁,与预期相符,验证完毕。 diff --git a/zh-cn/device-dev/kernel/Readme-CN.md b/zh-cn/device-dev/kernel/Readme-CN.md index 3149ba1128ab511901f59a3614f077695b183cf0..09e9e75f840c7c37d92b69e0040304ceee7ad85d 100755 --- a/zh-cn/device-dev/kernel/Readme-CN.md +++ b/zh-cn/device-dev/kernel/Readme-CN.md @@ -1,152 +1,186 @@ -# 内核使用指南 - -- [轻量和小型系统内核](kernel-lite.md) - - - [轻量系统内核](kernel-lite-mini.md) - - [内核概述](kernel-lite-mini-m.md) - - [基础内核](kernel-lite-mini-basic.md) - - [中断管理](kernel-lite-mini-basic-interrupt.md) - - [基本概念](kernel-lite-mini-basic-interrupt-concept.md) - - [开发指导](kernel-lite-mini-basic-interrupt-guide.md) - - [任务管理](kernel-lite-mini-basic-task.md) - - [基本概念](kernel-lite-mini-basic-task-basic.md) - - [开发指导](kernel-lite-mini-basic-task-guide.md) - - [内存管理](kernel-lite-mini-basic-memory.md) - - [基本概念](kernel-lite-mini-basic-memory-basic.md) - - [静态内存](kernel-lite-mini-basic-memory-static.md) - - [动态内存](kernel-lite-mini-basic-memory-dynamic.md) - - [内核通信机制](kernel-lite-mini-basic-ipc.md) - - [事件](kernel-lite-mini-basic-ipc-event.md) - - [基本概念](kernel-lite-mini-basic-ipc-event-guide.md) - - [开发指导](kernel-lite-mini-basic-ipc-event-basic.md) - - [互斥锁](kernel-lite-mini-basic-ipc-mutex.md) - - [基本概念](kernel-lite-mini-basic-ipc-mutex-basic.md) - - [开发指导](kernel-lite-mini-basic-ipc-mutex-guide.md) - - [消息队列](kernel-lite-mini-basic-ipc-queue.md) - - [基本概念](kernel-lite-mini-basic-ipc-queue-basic.md) - - [开发指导](kernel-lite-mini-basic-ipc-queue-guide.md) - - [信号量](kernel-lite-mini-basic-ipc-sem.md) - - [基本概念](kernel-lite-mini-basic-ipc-sem-basic.md) - - [开发指导](kernel-lite-mini-basic-ipc-sem-guide.md) - - [时间管理](kernel-lite-basic-mini-time.md) - - [基本概念](kernel-lite-mini-basic-time-basic.md) - - [开发指导](kernel-lite-mini-basic-time-guide.md) - - [软件定时器](kernel-lite-mini-basic-soft.md) - - [基本概念](kernel-lite-mini-basic-soft-basic.md) - - [开发指导](kernel-lite-mini-basic-soft-guide.md) - - [扩展组件](kernel-lite-mini-extend.md) - - [C++支持](kernel-lite-mini-extend-support.md) - - [CPU占用率](kernel-lite-mini-extend-cpup.md) - - [基本概念](kernel-lite-mini-extend-cpup-basic.md) - - [开发指导](kernel-lite-mini-extend-cpup-guide.md) - - [文件系统](kernel-lite-mini-extend-file.md) - - [FAT](kernel-lite-mini-extend-file-fat.md) - - [LittleFS](kernel-lite-mini-extend-file-lit.md) - - [基本概念](kernel-lite-mini-extend-file-lit-basic.md) - - [开发指导](kernel-lite-mini-extend-file-lit-guide.md) - - [内核调测](kernel-lite-mini-inner.md) - - [内存调测](kernel-lite-mini-inner-debug.md) - - [内存信息统计](kernel-lite-mini-inner-debug-mes.md) - - [内存泄漏检测](kernel-lite-mini-inner-debug-det.md) - - [踩内存检测](kernel-lite-mini-inner-debug-cet.md) - - [异常调测](kernel-lite-mini-inner-exception.md) - - [Trace调测](kernel-lite-mini-inner-trace.md) - - [附录](kernel-lite-mini-app.md) - - [内核编码规范](kernel-lite-mini-app-code.md) - - [基本数据结构](kernel-lite-mini-app-data.md) - - [双向链表](kernel-lite-mini-app-data-list.md) - - [标准库支持](kernel-lite-mini-app-lib.md) - - [CMSIS支持](kernel-lite-mini-app-lib-cmsis.md) - - [POSIX支持](kernel-lite-mini-app-lib-posix.md) - - - [小型系统内核](kernel-lite-small.md) - - [基础内核](kernel-lite-small-basic.md) - - [进程](kernel-lite-small-process.md) - - [线程](kernel-lite-small-thread.md) - - [内存](kernel-lite-small-memory.md) - - [网络](kernel-lite-small-net.md) - - - [文件系统](kernel-lite-small-file.md) - - [VFS](kernel-lite-small-file-vfs.md) - - [NFS](kernel-lite-small-file-nfs.md) - - [RAMFS](kernel-lite-small-file-ramfs.md) - - [FAT](kernel-lite-small-file-fat.md) - - [JFFS2](kernel-lite-small-file-jffs.md) - - - [标准库](kernel-lite-small-lib.md) - - [标准库](kernel-lite-small-lib-standard.md) - - [与Linux标准库的差异](kernel-lite-small-lib-differ.md) - - - [调测](kernel-lite-small-shell.md) - - [Shell介绍](kernel-lite-small-shell-des.md) - - [Shell命令开发指导](kernel-lite-small-shell-guide.md) - - [Shell命令编程实例](kernel-lite-small-shell-sample.md) - - [Shell命令使用详解](kernel-lite-small-shell-cmd.md) - - [系统命令](kernel-lite-small-shell-cmd-sys.md) - - [cpup](kernel-lite-small-shell-cmd-sys-cpup.md) - - [date](kernel-lite-small-shell-cmd-sys-date.md) - - [dmesg](kernel-lite-small-shell-cmd-sys-demsg.md) - - [exec](kernel-lite-small-shell-cmd-sys-exec.md) - - [free](kernel-lite-small-shell-cmd-sys-free.md) - - [help](kernel-lite-small-shell-cmd-sys-help.md) - - [hwi](kernel-lite-small-shell-cmd-sys-hwi.md) - - [kill](kernel-lite-small-shell-cmd-sys-kill.md) - - [log](kernel-lite-small-shell-cmd-sys-log.md) - - [memcheck](kernel-lite-small-shell-cmd-sys-mem.md) - - [oom](kernel-lite-small-shell-cmd-sys-oom.md) - - [pmm](kernel-lite-small-shell-cmd-sys-pmm.md) - - [reset](kernel-lite-small-shell-cmd-sys-reset.md) - - [sem](kernel-lite-small-shell-cmd-sys-sem.md) - - [stack](kernel-lite-small-shell-cmd-sys-stack.md) - - [su](kernel-lite-small-shell-cmd-sys-su.md) - - [swtmr](kernel-lite-small-shell-cmd-sys-swymr.md) - - [systeminfo](kernel-lite-small-shell-cmd-sys-sys.md) - - [task](kernel-lite-small-shell-cmd-sys-task.md) - - [uname](kernel-lite-small-shell-cmd-sys-uname.md) - - [vmm](kernel-lite-small-shell-cmd-sys-vmm.md) - - [watch](kernel-lite-small-shell-cmd-sys-watch.md) - - - [文件命令](kernel-lite-small-shell-cmd-file.md) - - [cat](kernel-lite-small-shell-cmd-file-cat.md) - - [cd](kernel-lite-small-shell-cmd-file-cd.md) - - [chgrp](kernel-lite-small-shell-cmd-file-chgrp.md) - - [chmod](kernel-lite-small-shell-cmd-file-chmod.md) - - [chown](kernel-lite-small-shell-cmd-file-chown.md) - - [cp](kernel-lite-small-shell-cmd-file-cp.md) - - [format](kernel-lite-small-shell-cmd-file-format.md) - - [ls](kernel-lite-small-shell-cmd-file-is.md) - - [lsfd](kernel-lite-small-shell-cmd-file-isfd.md) - - [mkdir](kernel-lite-small-shell-cmd-file-mkdir.md) - - [mount](kernel-lite-small-shell-cmd-file-mount.md) - - [partinfo](kernel-lite-small-shell-cmd-file-part.md) - - [partition](kernel-lite-small-shell-cmd-file-partion.md) - - [pwd](kernel-lite-small-shell-cmd-file-pwd.md) - - [rm](kernel-lite-small-shell-cmd-file-rm.md) - - [rmdir](kernel-lite-small-shell-cmd-file-rmdir.md) - - [statfs](kernel-lite-small-shell-cmd-file-sta.md) - - [sync](kernel-lite-small-shell-cmd-file-sync.md) - - [touch](kernel-lite-small-shell-cmd-file-touch.md) - - [writeproc](kernel-lite-small-shell-cmd-file-write.md) - - [umount](kernel-lite-small-shell-cmd-file-umount.md) - - - [网络命令](kernel-lite-small-shell-cmd-net.md) - - [arp](kernel-lite-small-shell-cmd-net-arp.md) - - [dhclient](kernel-lite-small-shell-cmd-net-dh.md) - - [dns](kernel-lite-small-shell-cmd-net-dns.md) - - [ifconfig](kernel-lite-small-shell-cmd-net-ipc.md) - - [ipdebug](kernel-lite-small-shell-cmd-net-ipd.md) - - [netstat](kernel-lite-small-shell-cmd-net-net.md) - - [ntpdate](kernel-lite-small-shell-cmd-net-ntp.md) - - [ping](kernel-lite-small-shell-cmd-net-ping.md) - - [ping6](kernel-lite-small-shell-cmd-net-ping6.md) - - [telnet](kernel-lite-small-shell-cmd-net-tel.md) - - [tftp](kernel-lite-small-shell-cmd-net-tftp.md) - - - [魔法键使用方法](kernel-lite-small-shell-cmd-mag.md) - - [用户态异常信息说明](kernel-lite-small-shell-cmd-abn.md) +# 内核使用指南 +- [轻量系统内核](kernel-mini.md) + - [内核概述](kernel-mini-extend-dynamic-loading.md) + - [基础内核](kernel-mini-basic.md) + - [中断管理](kernel-mini-basic-interrupt.md) + - [基本概念](kernel-mini-basic-interrupt-concept.md) + - [开发指导](kernel-mini-basic-interrupt-guide.md) + - [任务管理](kernel-mini-basic-task.md) + - [基本概念](kernel-mini-basic-task-basic.md) + - [开发指导](kernel-mini-basic-task-guide.md) + - [内存管理](kernel-mini-basic-memory.md) + - [基本概念](kernel-mini-basic-memory-basic.md) + - [静态内存](kernel-mini-basic-memory-static.md) + - [动态内存](kernel-mini-basic-memory-dynamic.md) + - [内核通信机制](kernel-mini-basic-ipc.md) + - [事件](kernel-mini-basic-ipc-event.md) + - [基本概念](kernel-mini-basic-ipc-event-guide.md) + - [开发指导](kernel-mini-basic-ipc-event-basic.md) + - [互斥锁](kernel-mini-basic-ipc-mutex.md) + - [基本概念](kernel-mini-basic-ipc-mutex-basic.md) + - [开发指导](kernel-mini-basic-ipc-mutex-guide.md) + - [消息队列](kernel-mini-basic-ipc-queue.md) + - [基本概念](kernel-mini-basic-ipc-queue-basic.md) + - [开发指导](kernel-mini-basic-ipc-queue-guide.md) + - [信号量](kernel-mini-basic-ipc-sem.md) + - [基本概念](kernel-mini-basic-ipc-sem-basic.md) + - [开发指导](kernel-mini-basic-ipc-sem-guide.md) + - [时间管理](kernel-basic-mini-time.md) + - [基本概念](kernel-mini-basic-time-basic.md) + - [开发指导](kernel-mini-basic-time-guide.md) + - [软件定时器](kernel-mini-basic-soft.md) + - [基本概念](kernel-mini-basic-soft-basic.md) + - [开发指导](kernel-mini-basic-soft-guide.md) + - [扩展组件](kernel-mini-extend.md) + - [C++支持](kernel-mini-extend-support.md) + - [CPU占用率](kernel-mini-extend-cpup.md) + - [基本概念](kernel-mini-extend-cpup-basic.md) + - [开发指导](kernel-mini-extend-cpup-guide.md) + - [动态加载](kernel-mini-extend-dynamic-loading-0.md) + - [基本概念](kernel-mini-extend-dynamic-loading-basic.md) + - [开发指导](kernel-mini-extend-dynamic-loading-guide.md) + - [文件系统](kernel-mini-extend-file.md) + - [FAT](kernel-mini-extend-file-fat.md) + - [LittleFS](kernel-mini-extend-file-lit.md) + - [基本概念](kernel-mini-extend-file-littlefs-basic.md) + - [开发指导](kernel-mini-extend-file-littlefs-guide.md) + - [内核调测](kernel-mini-inner.md) + - [内存调测](kernel-mini-inner-debug.md) + - [内存信息统计](kernel-mini-inner-debug-mes.md) + - [内存泄漏检测](kernel-mini-inner-debug-det.md) + - [踩内存检测](kernel-mini-inner-debug-cet.md) + - [异常调测](kernel-mini-inner-exception.md) + - [Trace调测](kernel-mini-inner-trace.md) + - [附录](kernel-mini-app.md) + - [内核编码规范](kernel-mini-appx-code.md) + - [基本数据结构](kernel-mini-appx-data.md) + - [双向链表](kernel-mini-appx-data-list.md) + - [标准库支持](kernel-mini-appx-lib.md) + - [CMSIS支持](kernel-mini-appx-lib-cmsis.md) + - [POSIX支持](kernel-mini-appx-lib-posix.md) +- [小型系统内核](kernel-small.md) + - [内核概述](kernel-small-overview.md) + - [内核启动](kernel-small-start.md) + - [内核态启动](kernel-small-start-kernel.md) + - [用户态启动](kernel-small-start-users.md) + - [基础内核](kernel-small-basic.md) + - [中断及异常处理](kernel-small-basic-breakdeal.md) + - [进程管理](kernel-small-basic-manage.md) + - [进程](kernel-small-basic-manage-process.md) + - [线程](kernel-small-basic-manage-thread.md) + - [调度器](kernel-small-basic-manage-debug.md) + - [内存管理](kernel-small-basic-inner.md) + - [堆内存管理](kernel-small-basic-inner-head.md) + - [物理内存管理](kernel-small-basic-inner-physical.md) + - [虚拟内存管理](kernel-small-basic-inner-virtual.md) + - [虚实映射](kernel-small-basic-inner-reflect.md) + - [内核通信机制](kernel-small-basic-trans.md) + - [事件](kernel-small-basic-trans-things.md) + - [信号量](kernel-small-basic-trans-info.md) + - [互斥锁](kernel-small-basic-trans-locks.md) + - [消息队列](kernel-small-basic-trans-lines.md) + - [读写锁](kernel-small-basic-trans-reading.md) + - [用户态快速互斥锁](kernel-small-basic-trans-users.md) + - [信号](kernel-small-basic-trans-sign.md) + - [时间管理](kernel-small-basic-time.md) + - [软件定时器](kernel-small-basic-trans-soft.md) + - [原子操作](kernel-small-basic-atom.md) + - [扩展组件](kernel-small-bundles.md) + - [系统调用](kernel-small-bundles-system.md) + - [动态加载与链接](kernel-small-bundles-init.md) + - [虚拟动态共享库](kernel-small-bundles-share.md) + - [轻量级进程间通信](kernel-small-bundles-lite.md) + - [文件系统](kernel-small-bundles-file.md) + - [虚拟文件系统](kernel-small-bundles-file-virtu.md) + - [支持的文件系统](kernel-small-bundles-file-support.md) + - [FAT](kernel-small-bundles-file-support-fat.md) + - [JFFS2](kernel-small-bundles-file-support-jffs2.md) + - [NFS](kernel-small-bundles-file-support-nfs.md) + - [Ramfs](kernel-small-bundles-file-support-ramfs.md) + - [Procfs](kernel-small-bundles-file-support-procfs.md) + - [适配新的文件系统](kernel-small-bundles-file-newsys.md) + - [调测与工具](kernel-small-debug.md) + - [Shell](kernel-small-debug-shell.md) + - [Shell介绍](kernel-small-debug-shell-overview.md) + - [Shell命令开发指导](kernel-small-debug-shell-guide.md) + - [Shell命令编程实例](kernel-small-debug-shell-build.md) + - [Shell命令使用详解](kernel-small-debug-shell-details.md) + - [系统命令](kernel-small-debug-shell-cmd.md) + - [cpup](kernel-small-debug-shell-cmd-cpup.md) + - [date](kernel-small-debug-shell-cmd-date.md) + - [dmesg](kernel-small-debug-shell-cmd-dmesg.md) + - [exec](kernel-small-debug-shell-cmd-exec.md) + - [free](kernel-small-debug-shell-cmd-free.md) + - [help](kernel-small-debug-shell-cmd-help.md) + - [hwi](kernel-small-debug-shell-cmd-hwi.md) + - [kill](kernel-small-debug-shell-cmd-kill.md) + - [log](kernel-small-debug-shell-cmd-log.md) + - [memcheck](kernel-small-debug-shell-cmd-mem.md) + - [oom](kernel-small-debug-shell-cmd-oom.md) + - [pmm](kernel-small-debug-shell-cmd-pmm.md) + - [reset](kernel-small-debug-shell-cmd-reset.md) + - [sem](kernel-small-debug-shell-cmd-sem.md) + - [stack](kernel-small-debug-shell-cmd-stack.md) + - [su](kernel-small-debug-shell-cmd-su.md) + - [swtmr](kernel-small-debug-shell-cmd-swtmr.md) + - [systeminfo](kernel-small-debug-shell-cmd-sysinfo.md) + - [task](kernel-small-debug-shell-cmd-task.md) + - [uname](kernel-small-debug-shell-cmd-uname.md) + - [vmm](kernel-small-debug-shell-cmd-vmm.md) + - [watch](kernel-small-debug-shell-cmd-watch.md) + - [文件命令](kernel-small-debug-shell-file.md) + - [cat](kernel-small-debug-shell-file-cat.md) + - [cd](kernel-small-debug-shell-file-cd.md) + - [chgrp](kernel-small-debug-shell-file-chgrp.md) + - [chmod](kernel-small-debug-shell-file-chmod.md) + - [chown](kernel-small-debug-shell-file-chown.md) + - [cp](kernel-small-debug-shell-file-cp.md) + - [format](kernel-small-debug-shell-file-format.md) + - [ls](kernel-small-debug-shell-file-ls.md) + - [lsfd](kernel-small-debug-shell-file-lsfd.md) + - [mkdir](kernel-small-debug-shell-file-mkdir.md) + - [mount](kernel-small-debug-shell-file-mount.md) + - [partinfo](kernel-small-debug-shell-file-partinfo.md) + - [partition](kernel-small-debug-shell-file-partition.md) + - [pwd](kernel-small-debug-shell-file-pwd.md) + - [rm](kernel-small-debug-shell-file-rm.md) + - [rmdir](kernel-small-debug-shell-file-rmdir.md) + - [statfs](kernel-small-debug-shell-file-statfs.md) + - [sync](kernel-small-debug-shell-file-sync.md) + - [touch](kernel-small-debug-shell-file-touch.md) + - [writeproc](kernel-small-debug-shell-file-write.md) + - [umount](kernel-small-debug-shell-file-umount.md) + - [网络命令](kernel-small-debug-shell-net.md) + - [arp](kernel-small-debug-shell-net-arp.md) + - [dhclient](kernel-small-debug-shell-net-dhclient.md) + - [dns](kernel-small-debug-shell-net-dns.md) + - [ifconfig](kernel-small-debug-shell-net-ifconfig.md) + - [ipdebug](kernel-small-debug-shell-net-ipdebug.md) + - [netstat](kernel-small-debug-shell-net-netstat.md) + - [ntpdate](kernel-small-debug-shell-net-ntpdate.md) + - [ping](kernel-small-debug-shell-net-ping.md) + - [ping6](kernel-small-debug-shell-net-ping6.md) + - [telnet](kernel-small-debug-shell-net-telnet.md) + - [tftp](kernel-small-debug-shell-net-tftp.md) + - [魔法键使用方法](kernel-small-debug-shell-magickey.md) + - [用户态异常信息说明](kernel-small-debug-shell-abnormal.md) + - [Trace](kernel-small-debug-trace.md) + - [进程调测](kernel-small-debug-pro.md) + - [CPU占用率](kernel-small-debug-pro-cpu.md) + - [内存调测](kernel-small-debug-inner.md) + - [内存信息统计](kernel-small-debug-inner-info.md) + - [内存泄漏检测](kernel-small-debug-inner-leak.md) + - [踩内存检测](kernel-small-debug-inner-step.md) + - [其他内核调测手段](kernel-small-debug-other.md) + - [临终遗言](kernel-small-debug-trace-other-topic.md) + - [常见问题定位方法](kernel-small-debug-trace-other-faqs.md) + - [附录](kernel-small-list.md) + - [基本数据结构](kernel-small-list-basic.md) + - [双向链表](kernel-small-list-basic-link.md) + - [位操作](kernel-small-list-basic-moves.md) + - [标准库](kernel-small-list-standard.md) - [标准系统内核](kernel-standard.md) - - [Linux内核概述](kernel-standard-des.md) - - [OpenHarmony开发板Patch使用指导](kernel-standard-patch.md) - - [Linux内核编译与构建指导](kernel-standard-build.md) - + - [Linux内核概述](kernel-standard-overview.md) + - [OpenHarmony开发板Patch使用指导](kernel-standard-patch.md) + - [Linux内核编译与构建指导](kernel-standard-build.md) \ No newline at end of file diff --git "a/zh-cn/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\346\210\226\345\244\226\350\256\276\347\232\204\347\244\272\346\204\217\345\233\276.png" "b/zh-cn/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\346\210\226\345\244\226\350\256\276\347\232\204\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..14764140174d4aed373e155871e4ee5a4c9d869d Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\346\210\226\345\244\226\350\256\276\347\232\204\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" "b/zh-cn/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..0469f0ca66c61ef1423de3b9dfe6bc8210f51c8d Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/CPU\350\256\277\351\227\256\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/ELF\346\226\207\344\273\266\347\232\204\345\212\240\350\275\275\350\277\207\347\250\213.png" "b/zh-cn/device-dev/kernel/figure/ELF\346\226\207\344\273\266\347\232\204\345\212\240\350\275\275\350\277\207\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..23bc27b7de00aeb9d1ff9fa349c1be4fe4559b18 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/ELF\346\226\207\344\273\266\347\232\204\345\212\240\350\275\275\350\277\207\347\250\213.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/ELF\346\226\207\344\273\266\347\232\204\351\223\276\346\216\245\350\277\207\347\250\213.png" "b/zh-cn/device-dev/kernel/figure/ELF\346\226\207\344\273\266\347\232\204\351\223\276\346\216\245\350\277\207\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..dc43aa951c78b8c9d495ab3aa6d8799309e103c9 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/ELF\346\226\207\344\273\266\347\232\204\351\223\276\346\216\245\350\277\207\347\250\213.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/Futex\350\256\276\350\256\241\345\233\276.jpg" "b/zh-cn/device-dev/kernel/figure/Futex\350\256\276\350\256\241\345\233\276.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..b720a53cda289dfea91a4baba36645640bf0aea0 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/Futex\350\256\276\350\256\241\345\233\276.jpg" differ diff --git "a/zh-cn/device-dev/kernel/figure/LiteOS-M\345\206\205\346\240\270\345\212\250\346\200\201\345\212\240\350\275\275\346\236\266\346\236\204\345\233\276.png" "b/zh-cn/device-dev/kernel/figure/LiteOS-M\345\206\205\346\240\270\345\212\250\346\200\201\345\212\240\350\275\275\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..a460e8dbf1953929bb31be3323fc716f2cdaf9ad Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/LiteOS-M\345\206\205\346\240\270\345\212\250\346\200\201\345\212\240\350\275\275\346\236\266\346\236\204\345\233\276.png" differ diff --git a/zh-cn/device-dev/kernel/figure/Snipaste_2021-01-26_10-38-58-18.png b/zh-cn/device-dev/kernel/figure/Snipaste_2021-01-26_10-38-58-24.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/Snipaste_2021-01-26_10-38-58-18.png rename to zh-cn/device-dev/kernel/figure/Snipaste_2021-01-26_10-38-58-24.png diff --git a/zh-cn/device-dev/kernel/figure/Snipaste_2021-01-26_10-38-58-19.png b/zh-cn/device-dev/kernel/figure/Snipaste_2021-01-26_10-38-58-25.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/Snipaste_2021-01-26_10-38-58-19.png rename to zh-cn/device-dev/kernel/figure/Snipaste_2021-01-26_10-38-58-25.png diff --git "a/zh-cn/device-dev/kernel/figure/VDSO\347\263\273\347\273\237\350\256\276\350\256\241.jpg" "b/zh-cn/device-dev/kernel/figure/VDSO\347\263\273\347\273\237\350\256\276\350\256\241.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..633798d5a587904f92bd28f4fe8a98b08c19162d Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/VDSO\347\263\273\347\273\237\350\256\276\350\256\241.jpg" differ diff --git "a/zh-cn/device-dev/kernel/figure/VFS\345\222\214\345\220\204\344\270\252\346\226\207\344\273\266\347\263\273\347\273\237\347\232\204\345\205\263\347\263\273.png" "b/zh-cn/device-dev/kernel/figure/VFS\345\222\214\345\220\204\344\270\252\346\226\207\344\273\266\347\263\273\347\273\237\347\232\204\345\205\263\347\263\273.png" deleted file mode 100644 index 4d806a4cd3494bcae563973789ad2c37ec521363..0000000000000000000000000000000000000000 Binary files "a/zh-cn/device-dev/kernel/figure/VFS\345\222\214\345\220\204\344\270\252\346\226\207\344\273\266\347\263\273\347\273\237\347\232\204\345\205\263\347\263\273.png" and /dev/null differ diff --git "a/zh-cn/device-dev/kernel/figure/Vnode\345\210\233\345\273\272\346\265\201\347\250\213.png" "b/zh-cn/device-dev/kernel/figure/Vnode\345\210\233\345\273\272\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..8d6b584acacbce69f2dab55a49e22598c22fd368 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/Vnode\345\210\233\345\273\272\346\265\201\347\250\213.png" differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001121429646.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001121429646.png deleted file mode 100644 index 2d4c97342491ef710992d0432756a6cd07fac841..0000000000000000000000000000000000000000 Binary files a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001121429646.png and /dev/null differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124146302.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124146302.png deleted file mode 100644 index 921928e12dac3de724d42418702909bacc6ea64b..0000000000000000000000000000000000000000 Binary files a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124146302.png and /dev/null differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124147160.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124147160.png deleted file mode 100644 index afbb688c2869075f5e674bb3c2169164babf80d6..0000000000000000000000000000000000000000 Binary files a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124147160.png and /dev/null differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124306828.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124306828.png deleted file mode 100644 index fd283f60106ed9e2ab967968388c29c10da9edcc..0000000000000000000000000000000000000000 Binary files a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124306828.png and /dev/null differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124310992.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124310992.png deleted file mode 100644 index c716576c3627cca4d3f9ba0f4e2765a08daa9e60..0000000000000000000000000000000000000000 Binary files a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001124310992.png and /dev/null differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001125101908.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001125101908.png new file mode 100644 index 0000000000000000000000000000000000000000..d24ef3ce327be6ce5f6c685a7f27fb354b732778 Binary files /dev/null and b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001125101908.png differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127390512.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127390512.png new file mode 100644 index 0000000000000000000000000000000000000000..c2d38a9a5f1789f6ce5d2ad32eb19f2b1c847872 Binary files /dev/null and b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127390512.png differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127519136.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127519136.png new file mode 100644 index 0000000000000000000000000000000000000000..ad13c7729857efdad9d53e20a07a1f28e85c2361 Binary files /dev/null and b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127519136.png differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127520662.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127520662.png new file mode 100644 index 0000000000000000000000000000000000000000..94ca9a41688c06a31b44edca5d9d3add3bfdba6f Binary files /dev/null and b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001127520662.png differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001132875772.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001132875772.png new file mode 100644 index 0000000000000000000000000000000000000000..c1107463e058df1402f1b19d02b58f0ccb0898e2 Binary files /dev/null and b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001132875772.png differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052810304.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001133848164.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052810304.png rename to zh-cn/device-dev/kernel/figure/zh-cn_image_0000001133848164.png diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001054624363.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001133848370.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/zh-cn_image_0000001054624363.png rename to zh-cn/device-dev/kernel/figure/zh-cn_image_0000001133848370.png diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052370303.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001133848906.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052370303.png rename to zh-cn/device-dev/kernel/figure/zh-cn_image_0000001133848906.png diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001053710680.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001134008030.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/zh-cn_image_0000001053710680.png rename to zh-cn/device-dev/kernel/figure/zh-cn_image_0000001134008030.png diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052370307.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001134008686.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052370307.png rename to zh-cn/device-dev/kernel/figure/zh-cn_image_0000001134008686.png diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001051690323.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001134008688.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/zh-cn_image_0000001051690323.png rename to zh-cn/device-dev/kernel/figure/zh-cn_image_0000001134008688.png diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001170790681.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001170790681.png deleted file mode 100644 index ad18e1d4a5785546f027c9a6e265d2533a076589..0000000000000000000000000000000000000000 Binary files a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001170790681.png and /dev/null differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001173429547.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001173429547.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8df5ef5d0f321e976008cbf382e228d12677d6 Binary files /dev/null and b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001173429547.png differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001173449871.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001173449871.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5c5f4193cb03892f45906263f600478b65136c Binary files /dev/null and b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001173449871.png differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001176974089.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001176974089.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9a02ed3386934d341befcfbeb1a561a67955ba Binary files /dev/null and b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001176974089.png differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001178856385.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001178856385.png new file mode 100644 index 0000000000000000000000000000000000000000..25da22c730220aec03a08ca5ca5cfda5993b4a7e Binary files /dev/null and b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001178856385.png differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179063579.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179063579.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa3ffa48167681f4b3385278bb8d75fc251a050 Binary files /dev/null and b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179063579.png differ diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052530298.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179847649.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052530298.png rename to zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179847649.png diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052810300.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179848349.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052810300.png rename to zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179848349.png diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001053224218.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179848731.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/zh-cn_image_0000001053224218.png rename to zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179848731.png diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001053826366.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179967527.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/zh-cn_image_0000001053826366.png rename to zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179967527.png diff --git a/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052370305.png b/zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179967909.png similarity index 100% rename from zh-cn/device-dev/kernel/figure/zh-cn_image_0000001052370305.png rename to zh-cn/device-dev/kernel/figure/zh-cn_image_0000001179967909.png diff --git "a/zh-cn/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276-20.png" "b/zh-cn/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276-20.png" new file mode 100644 index 0000000000000000000000000000000000000000..3da92ebe0448375d76e32950f301f72bc7282547 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276-20.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276.png" "b/zh-cn/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276.png" index b88168dddfcdcc01bed2fb895d557f9e8689ff71..3da92ebe0448375d76e32950f301f72bc7282547 100644 Binary files "a/zh-cn/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276.png" and "b/zh-cn/device-dev/kernel/figure/\344\272\213\344\273\266\350\277\220\344\275\234\345\216\237\347\220\206\345\233\276.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\344\272\222\346\226\245\351\224\201\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-22.png" "b/zh-cn/device-dev/kernel/figure/\344\272\222\346\226\245\351\224\201\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-22.png" new file mode 100644 index 0000000000000000000000000000000000000000..b04bf9db5baa85756ba1a12039a160301a4ec1fd Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\344\272\222\346\226\245\351\224\201\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-22.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\344\277\241\345\217\267\351\207\217\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-21.png" "b/zh-cn/device-dev/kernel/figure/\344\277\241\345\217\267\351\207\217\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-21.png" new file mode 100644 index 0000000000000000000000000000000000000000..265c77529e451d8d0c75ef5c653f318687c588cb Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\344\277\241\345\217\267\351\207\217\350\277\220\344\275\234\347\244\272\346\204\217\345\233\276-21.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\345\206\205\345\255\230\346\230\240\345\260\204\347\244\272\346\204\217\345\233\276.png" "b/zh-cn/device-dev/kernel/figure/\345\206\205\345\255\230\346\230\240\345\260\204\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..cbd0d5b871519d388a07f2d20b655c2f42e2e384 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\345\206\205\345\255\230\346\230\240\345\260\204\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\345\206\205\345\255\230\347\224\263\350\257\267\347\244\272\346\204\217\345\233\276.png" "b/zh-cn/device-dev/kernel/figure/\345\206\205\345\255\230\347\224\263\350\257\267\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..38c338c52e40023604e58e5908a78c375038036a Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\345\206\205\345\255\230\347\224\263\350\257\267\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\345\206\205\345\255\230\351\207\212\346\224\276\347\244\272\346\204\217\345\233\276.png" "b/zh-cn/device-dev/kernel/figure/\345\206\205\345\255\230\351\207\212\346\224\276\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..af94ee390dbd056ca7c44f524853bfbf89228f88 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\345\206\205\345\255\230\351\207\212\346\224\276\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225-18.png" "b/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225-18.png" new file mode 100644 index 0000000000000000000000000000000000000000..1614d4992a7179c2606e2dc0324d9dd6a9411e3c Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225-18.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225.png" "b/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225.png" index 955aff65c1c8365cc6c932a5e89ef944384bb489..226466c21b0f7375c9ef70f340ad573f2916a674 100644 Binary files "a/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225.png" and "b/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\346\240\270\345\277\203\347\256\227\346\263\225.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\347\256\241\347\220\206\347\273\223\346\236\204\345\233\276-19.png" "b/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\347\256\241\347\220\206\347\273\223\346\236\204\345\233\276-19.png" new file mode 100644 index 0000000000000000000000000000000000000000..9d98f09b73bd77ef25c732a750611bb3fb3c6b65 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\206\205\345\255\230\347\256\241\347\220\206\347\273\223\346\236\204\345\233\276-19.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\212\240\350\275\275\346\265\201\347\250\213.png" "b/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\212\240\350\275\275\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..66f78d73d491b36b8ca9333919adefa4252b4983 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\345\212\250\346\200\201\345\212\240\350\275\275\346\265\201\347\250\213.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\345\257\274\345\207\272\347\232\204\347\254\246\345\217\267\350\241\250\344\277\241\346\201\257.png" "b/zh-cn/device-dev/kernel/figure/\345\257\274\345\207\272\347\232\204\347\254\246\345\217\267\350\241\250\344\277\241\346\201\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..87d6aaf4a5f1d7f25c2ee2c964931c71388b043d Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\345\257\274\345\207\272\347\232\204\347\254\246\345\217\267\350\241\250\344\277\241\346\201\257.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\346\226\207\344\273\266\346\237\245\346\211\276\346\265\201\347\250\213.png" "b/zh-cn/device-dev/kernel/figure/\346\226\207\344\273\266\346\237\245\346\211\276\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..b06ce7a382707361fadf8f6864e02b973e3af39e Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\346\226\207\344\273\266\346\237\245\346\211\276\346\265\201\347\250\213.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\346\226\207\344\273\266\347\263\273\347\273\237\346\240\221\345\275\242\347\273\223\346\236\204.png" "b/zh-cn/device-dev/kernel/figure/\346\226\207\344\273\266\347\263\273\347\273\237\346\240\221\345\275\242\347\273\223\346\236\204.png" deleted file mode 100644 index 06eab22e518c211b23cc5f410c29643789057cef..0000000000000000000000000000000000000000 Binary files "a/zh-cn/device-dev/kernel/figure/\346\226\207\344\273\266\347\263\273\347\273\237\346\240\221\345\275\242\347\273\223\346\236\204.png" and /dev/null differ diff --git "a/zh-cn/device-dev/kernel/figure/\346\230\276\347\244\272\347\273\223\346\236\234\345\246\202\344\270\213-17.png" "b/zh-cn/device-dev/kernel/figure/\346\230\276\347\244\272\347\273\223\346\236\234\345\246\202\344\270\213-23.png" similarity index 100% rename from "zh-cn/device-dev/kernel/figure/\346\230\276\347\244\272\347\273\223\346\236\234\345\246\202\344\270\213-17.png" rename to "zh-cn/device-dev/kernel/figure/\346\230\276\347\244\272\347\273\223\346\236\234\345\246\202\344\270\213-23.png" diff --git "a/zh-cn/device-dev/kernel/figure/\347\211\251\347\220\206\345\206\205\345\255\230\344\275\277\347\224\250\345\210\206\345\270\203\345\233\276.png" "b/zh-cn/device-dev/kernel/figure/\347\211\251\347\220\206\345\206\205\345\255\230\344\275\277\347\224\250\345\210\206\345\270\203\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..317de70b8fc9a0186e0e1db74baa22b637281e47 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\347\211\251\347\220\206\345\206\205\345\255\230\344\275\277\347\224\250\345\210\206\345\270\203\345\233\276.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\347\250\213\345\272\217\346\211\247\350\241\214\346\265\201\347\250\213.png" "b/zh-cn/device-dev/kernel/figure/\347\250\213\345\272\217\346\211\247\350\241\214\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..ef0759cead5eb6fcd30cefcd6a7145d43578eb1a Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\347\250\213\345\272\217\346\211\247\350\241\214\346\265\201\347\250\213.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\347\263\273\347\273\237\350\260\203\347\224\250\347\244\272\346\204\217\345\233\276.png" "b/zh-cn/device-dev/kernel/figure/\347\263\273\347\273\237\350\260\203\347\224\250\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..3e992223c5cfac9e45331a898cf2e86b755e5bd6 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\347\263\273\347\273\237\350\260\203\347\224\250\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\350\277\233\347\250\213\346\240\221\347\244\272\346\204\217\345\233\276.png" "b/zh-cn/device-dev/kernel/figure/\350\277\233\347\250\213\346\240\221\347\244\272\346\204\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..6888a98f6d3acb00451b16de55c9ce95170948e6 Binary files /dev/null and "b/zh-cn/device-dev/kernel/figure/\350\277\233\347\250\213\346\240\221\347\244\272\346\204\217\345\233\276.png" differ diff --git "a/zh-cn/device-dev/kernel/figure/\351\235\231\346\200\201\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" "b/zh-cn/device-dev/kernel/figure/\351\235\231\346\200\201\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" index f7ffdd153fcfffcc4fdf97a51b66c11c502c6a9c..d3bf07dcb1c4e0e9207eb1cf083cb9aeae945394 100644 Binary files "a/zh-cn/device-dev/kernel/figure/\351\235\231\346\200\201\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" and "b/zh-cn/device-dev/kernel/figure/\351\235\231\346\200\201\345\206\205\345\255\230\347\244\272\346\204\217\345\233\276.png" differ diff --git a/zh-cn/device-dev/kernel/kernel-lite-basic-mini-time.md b/zh-cn/device-dev/kernel/kernel-basic-mini-time.md similarity index 32% rename from zh-cn/device-dev/kernel/kernel-lite-basic-mini-time.md rename to zh-cn/device-dev/kernel/kernel-basic-mini-time.md index 1cded0a67f9982198d4b112d092b821657d51b1b..a3b59d055eb46f50f9f9e87ff614bf6bc438a8d2 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-basic-mini-time.md +++ b/zh-cn/device-dev/kernel/kernel-basic-mini-time.md @@ -1,7 +1,7 @@ # 时间管理 -- **[基本概念](kernel-lite-mini-basic-time-basic.md)** +- **[基本概念](kernel-mini-basic-time-basic.md)** -- **[开发指导](kernel-lite-mini-basic-time-guide.md)** +- **[开发指导](kernel-mini-basic-time-guide.md)** diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-app.md b/zh-cn/device-dev/kernel/kernel-lite-mini-app.md deleted file mode 100644 index 1d46fa1186b838599b3ec26dbc154a99ff20a111..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-app.md +++ /dev/null @@ -1,9 +0,0 @@ -# 附录 - -- **[内核编码规范](kernel-lite-mini-app-code.md)** - -- **[基本数据结构](kernel-lite-mini-app-data.md)** - -- **[标准库支持](kernel-lite-mini-app-lib.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-event.md b/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-event.md deleted file mode 100644 index 4f18b0192293cbdfa74b9107939fbe332b9999ce..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-event.md +++ /dev/null @@ -1,7 +0,0 @@ -# 事件 - -- **[基本概念](kernel-lite-mini-basic-ipc-event-guide.md)** - -- **[开发指导](kernel-lite-mini-basic-ipc-event-basic.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc.md b/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc.md deleted file mode 100644 index 2acba70e2f90c17310c5ce4a77c8d12a9658afc7..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc.md +++ /dev/null @@ -1,11 +0,0 @@ -# 内核通信机制 - -- **[事件](kernel-lite-mini-basic-ipc-event.md)** - -- **[互斥锁](kernel-lite-mini-basic-ipc-mutex.md)** - -- **[消息队列](kernel-lite-mini-basic-ipc-queue.md)** - -- **[信号量](kernel-lite-mini-basic-ipc-sem.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-memory.md b/zh-cn/device-dev/kernel/kernel-lite-mini-basic-memory.md deleted file mode 100644 index e0f1da7e35707537406eccc8b425c8697e5e06e0..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-memory.md +++ /dev/null @@ -1,9 +0,0 @@ -# 内存管理 - -- **[基本概念](kernel-lite-mini-basic-memory-basic.md)** - -- **[静态内存](kernel-lite-mini-basic-memory-static.md)** - -- **[动态内存](kernel-lite-mini-basic-memory-dynamic.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic.md b/zh-cn/device-dev/kernel/kernel-lite-mini-basic.md deleted file mode 100644 index fd6774bee47339f547587c7461b536ac5b8373e1..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic.md +++ /dev/null @@ -1,15 +0,0 @@ -# 基础内核 - -- **[中断管理](kernel-lite-mini-basic-interrupt.md)** - -- **[任务管理](kernel-lite-mini-basic-task.md)** - -- **[内存管理](kernel-lite-mini-basic-memory.md)** - -- **[内核通信机制](kernel-lite-mini-basic-ipc.md)** - -- **[时间管理](kernel-lite-basic-mini-time.md)** - -- **[软件定时器](kernel-lite-mini-basic-soft.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-extend.md b/zh-cn/device-dev/kernel/kernel-lite-mini-extend.md deleted file mode 100644 index 1d413abe902d5f6d590db74545381a6349dc1c23..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-extend.md +++ /dev/null @@ -1,9 +0,0 @@ -# 扩展组件 - -- **[C++支持](kernel-lite-mini-extend-support.md)** - -- **[CPU占用率](kernel-lite-mini-extend-cpup.md)** - -- **[文件系统](kernel-lite-mini-extend-file.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-inner.md b/zh-cn/device-dev/kernel/kernel-lite-mini-inner.md deleted file mode 100644 index 63cd8f58de79e139b236f5ce8c56b2ca5df8c260..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-inner.md +++ /dev/null @@ -1,9 +0,0 @@ -# 内核调测 - -- **[内存调测](kernel-lite-mini-inner-debug.md)** - -- **[异常调测](kernel-lite-mini-inner-exception.md)** - -- **[Trace调测](kernel-lite-mini-inner-trace.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-start.md b/zh-cn/device-dev/kernel/kernel-lite-mini-start.md deleted file mode 100644 index 13cd49841e858d07c4d6d15e197d2902b9183b51..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-start.md +++ /dev/null @@ -1,47 +0,0 @@ -# 快速入门 - -- [搭建开发环境](#section157851447151716) -- [获取OpenHarmony源码](#section381985201816) -- [获取示例工程源码](#section204717216181) -- [编译运行](#section9772514181917) - -OpenHarmony LiteOS-M内核的编译构建系统是一个基于gn和ninja的组件化构建系统,支持按组件配置、裁剪和拼装,按需构建出定制化的产品。编译构建系统的详细信息可以参考[考编译构建概](../subsystems/subsys-build-mini-lite.md#section10958256161119)。本文主要介绍如何基于gn和ninja编译LiteOS-M工程。 - -## 搭建开发环境 - -在搭建各个开发板环境前,需要完成OpenHarmony系统基础环境搭建。系统基础环境主要是指OpenHarmony的编译环境和开发环境,详细介绍请参考官方站点[搭建系统基础环境](../quick-start/quickstart-lite-env-setup-des.md)。开发者需要根据环境搭建文档,完成下述软件的安装:Python3.7+、gn、ninja、hb。对于LiteOS-M内核,还需要安装ARM GCC编译工具链。 - -## 获取OpenHarmony源码 - -开发者需要在Linux服务器上通过Git克隆获取OpenHarmony最新源码,详细的源码获取方式,请见[源码获取](../get-code/sourcecode-acquire.md)。获取OpenHarmony完整仓代码后,假设克隆目录为\~/openHarmony。 - -## 获取示例工程源码 - -以开发板Nucleo-F767Zi为例,演示如何编译运行OpenHarmony LiteOS-M内核工程。在本地目录,执行下述命令克隆示例代码。 - -``` -git clone https://gitee.com/harylee/nucleo_f767zi.git -``` - -假设克隆到的代码目录为\~/nucleo\_f767zi。 执行如下命令把代码目录的device、vendor目录复制到openHarmony工程的相应目录。 - -``` -cp -r ~/nucleo_f767zi/device/st ~/openHarmony/device/st -cp -r ~/nucleo_f767zi/vendor/st ~/openHarmony/vendor/st -``` - -关于示例代码目录的说明,可以参考资料站点[板级目录规范](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/porting/%E7%A7%BB%E6%A4%8D%E6%A6%82%E8%BF%B0-0.md#section6204129143013)。如果需要自行移植开发板,请参考[板级系统移植](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/porting/%E6%9D%BF%E7%BA%A7%E7%B3%BB%E7%BB%9F%E7%A7%BB%E6%A4%8D.md)。 - -## 编译运行 - -编译运行前,把交叉编译工具链bin目录配置到PATH环境变量中或者在device/st/nucleo\_f767zi/liteos\_m/config.gni文件中把board\_toolchain\_path配置项设置为交叉编译工具链bin目录。 在OpenHarmony根目录,执行hb set设置产品路径,选择nucleo\_f767zi产品,然后执行hb build开启编译。如下: - -``` -user@dev:~/OpenHarmony$ hb set -[OHOS INFO] Input code path: # 直接按回车,然后选择nucleo_f767zi产品即可 -OHOS Which product do you need? nucleo_f767zi@st -user@dev:~/OpenHarmony$ hb build -``` - -最终的镜像生成在\~/openHarmony/out/nucleo\_f767zi/目录中,通过STM32 ST-LINK Utility软件将镜像文件下载至单板查看运行效果。 - diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini.md b/zh-cn/device-dev/kernel/kernel-lite-mini.md deleted file mode 100644 index f531579ddb9a8bb0962474d074255d56cd3f9958..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-mini.md +++ /dev/null @@ -1,13 +0,0 @@ -# 轻量系统内核 - -- **[内核概述](kernel-lite-mini-m.md)** - -- **[基础内核](kernel-lite-mini-basic.md)** - -- **[扩展组件](kernel-lite-mini-extend.md)** - -- **[内核调测](kernel-lite-mini-inner.md)** - -- **[附录](kernel-lite-mini-app.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-basic.md b/zh-cn/device-dev/kernel/kernel-lite-small-basic.md deleted file mode 100644 index d9cac957f9948081206b93faba73c481d99474e9..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-basic.md +++ /dev/null @@ -1,11 +0,0 @@ -# 基础内核 - -- **[进程](kernel-lite-small-process.md)** - -- **[线程](kernel-lite-small-thread.md)** - -- **[内存](kernel-lite-small-memory.md)** - -- **[网络](kernel-lite-small-net.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-file-fat.md b/zh-cn/device-dev/kernel/kernel-lite-small-file-fat.md deleted file mode 100644 index 7b671c1eb2460bc0a8a35080a74dbfa6ee249eb8..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-file-fat.md +++ /dev/null @@ -1,108 +0,0 @@ -# FAT - -- [概述](#section17906101815113) -- [注意事项](#section781233610116) -- [开发指导](#section26081559713) - -## 概述 - -FAT文件系统是File Allocation Table(文件配置表)的简称,FAT文件系统有FAT12、FAT16、FAT32。FAT文件系统将硬盘分为MBR区、DBR区、FAT区、DIR区、DATA区等5个区域。 - -FAT文件系统支持多种介质,特别在可移动存储介质(U盘、SD卡、移动硬盘等)上广泛使用。可以使嵌入式设备和Windows、Linux等桌面系统保持很好的兼容性,方便用户管理操作文件。 - -OpenHarmony内核的FAT文件系统具有代码量和资源占用小、可裁切、支持多种物理介质等特性,并且与Windows、Linux等系统保持兼容,支持多设备、多分区识别等功能。 - -OpenHarmony内核支持硬盘多分区,可以在主分区以及逻辑分区上创建FAT文件系统。同时OpenHarmony内核也可以识别出硬盘上其他类型的文件系统。 - -## 注意事项 - -- 最多支持同时打开的fatfs文件(文件夹)数为512。 - -- 以可写方式打开一个文件后,未close前再次打开会失败。多次打开同一文件,必须全部使用只读方式。长时间打开一个文件,没有close时数据会丢失,必须close才能保存。 - -- FAT文件系统中,单个文件不能大于4G。 - -- 当有两个SD卡插槽时,卡0和卡1不固定,先插上的为卡0,后插上的为卡1。 - -- 当多分区功能打开,存在多分区的情况下,卡0注册的设备节点/dev/mmcblk0\(主设备\)和/dev/mmcblk0p0\(次设备\)是同一个设备,禁止对主设备进行操作。 - -- FAT文件系统的读写指针没有分离,所以以O\_APPEND(追加写)方式打开文件后,读指针也在文件尾,读文件前需要用户手动置位。 - -- FAT文件系统的stat及lstat函数获取出来的文件时间只是文件的修改时间。暂不支持创建时间和最后访问时间。微软FAT协议不支持1980年以前的时间。 - -- open打开一个文件,参数有O\_TRUNC时,会将文件中的内容清空。 - -- FAT文件系统支持的操作有:open, close, read, write, seek, sync, opendir, closedir, readdir, rewinddir, readdir\_r, statfs, remove, unlink, mkdir, rmdir, rename, stat, stat64, seek64, fallocate, fallocate64, truncate, truncate64,mount, umount。 - -- 为避免SD卡使用异常和内存泄漏,SD卡使用过程中拔卡,用户必须先关闭正处于打开状态的文件和目录,之后umount挂载节点。 - -- 在format操作之前,若fat文件系统已挂载,需确保所有目录及文件全部关闭,否则format会失败。 - -- FAT支持只读属性挂载: - - - 当mount函数的入参为MS\_RDONLY时,FAT将开启只读属性,所有的带有写入的接口,如write、mkdir、unlink,以及通过非O\_RDONLY属性打开的文件,将均被拒绝,并传出EACCESS错误码(format接口除外)。 - - - 当mount函数的入参为MS\_NOSYNC时,FAT不会主动将cache的内容写回存储器件。FAT的如下接口(open、close、 unlink、rename、mkdir、rmdir、truncate)不会自动进行sync操作,速度可以提升,但是需要上层主动调用sync来进行数据同步,否则下电可能会数据丢失。 - - -- FAT文件系统有定时刷cache功能。在menuconfig中开启LOSCFG\_FS\_FAT\_CACHE\_SYNC\_THREAD选项,打开后系统会创建一个任务刷cache,默认每隔5秒检查cache中脏数据块比例,超过80%时进行sync操作,将cache中的脏数据全部写回磁盘。任务优先级、刷新时间间隔以及脏数据块比例的阈值可分别通过接口LOS\_SetSyncThreadPrio、 LOS\_SetSyncThreadInterval和LOS\_SetDirtyRatioThreshold设置。 - -- 当前cache的默认大小为16个块,每个块256个扇区。 - - -## 开发指导 - -**设备识别** - -- 在ffconf.h文件中配置FF\_MULTI\_PARTITION为1,可使用多分区功能。 - -- 在ffconf.h文件中配置FF\_VOLUMES大于2时,可使用多设备功能。 - - -多设备、多分区功能开启后,系统对于插上的sd卡自动识别,自动注册设备节点如上图所示。mmcblk0和mmcblk1为卡0和卡1,是独立的主设备,mmcblk0p0、mmcblk0p1为卡0的两个分区,可作为分区设备使用。在有分区设备存在的情况下,禁止使用主设备。 - -可以使用 partinfo命令查看所识别的分区信息。 - -``` -OHOS # partinfo /dev/mmcblk0p0 -part info : -disk id : 0 -part_id in system: 0 -part no in disk : 0 -part no in mbr : 1 -part filesystem : 0C -part dev name : mmcblk0p0 -part sec start : 8192 -part sec count : 31108096 -``` - -**FAT文件系统的挂载** - -运行命令: - -``` -OHOS # mount /dev/mmcblk0p0 /vs/sd vfat -``` - -将从串口得到如下回应信息,表明挂载成功。 - -``` -OHOS # mount /dev/mmcblk0p0 /vs/sd vfat -mount ok -``` - -**FAT文件系统的卸载** - -运行命令: - -``` -OHOS # umount /vs/sd -``` - -将从串口得到如下回应信息,表明卸载成功。 - -``` -OHOS # umount /vs/sd -umount ok -``` - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-file-nfs.md b/zh-cn/device-dev/kernel/kernel-lite-small-file-nfs.md deleted file mode 100644 index dec5a7023b1d9dcb34d1367fa7446129bfd76ee9..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-file-nfs.md +++ /dev/null @@ -1,163 +0,0 @@ -# NFS - -- [概述](#section18322139164413) -- [注意事项](#section532912331467) -- [开发指导](#section166873374711) - -## 概述 - -NFS是Network File System(网络文件系统)的缩写。它最大的功能是可以通过网络,让不同的机器、不同的操作系统彼此分享其他用户的文件。因此,用户可以简单地将它看做是一个文件系统服务,在一定程度上相当于Windows环境下的共享文件夹。 - -NFS客户端用户,能够将网络远程的NFS服务端分享的目录挂载到本地端的机器中,运行程序和共享文件,但不占用当前的系统资源,所以,在本地端的机器看起来,远程服务端的目录就好像是自己的一个磁盘一样。 - -## 注意事项 - -- 当前NFS文件不支持权限控制,请在创建NFS目录和文件时使用777权限。 - -- 当前NFS文件不支读阻塞和写阻塞。 - -- 当前NFS文件不支持信号功能。 - -- 当前NFS文件系统mount路径长度(不包含IP的长度)不超过255个字符,超过时返回ENAMETOOLONG错误。 - -- 当前NFS文件支持的操作有:open, close, read, write, seek, dup, dup2, sync, opendir, closedir, readdir, readdir\_r, rewinddir, scandir, statfs, remove, unlink, mkdir, rmdir, rename, stat, stat64, seek64, mmap, mount, umount。 - -- 当前NFS支持TCP和UDP两种传输层协议,默认使用TCP。 - -- open打开一个文件,参数有O\_TRUNC时,必须同时拥有写的权限,才会将文件中的内容清空。 - -- 在文件未关闭的情况下,rename\(\)函数重命名A为B之后,不会改变文件fd。 - -- NFS功能目前处于beta测试阶段,可能存在功能不稳定的情况,建议您不要用于正式商用产品当中。 - - -## 开发指导 - -1. **搭建NFS服务器**。 - - 这里以Ubuntu操作系统为例,说明服务器端设置步骤。 - - 1. 安装NFS服务器软件。 - - 设置好Ubuntu系统的下载源,保证网络连接好的情况下执行: - - ``` - sudo apt-get install nfs-kernel-server - ``` - - 2. 创建用于挂载的目录并设置完全权限 - - ``` - mkdir /home/sqbin/nfs - sudo chmod 777 /home/sqbin/nfs - ``` - - 3. 设置和启动NFS server。 - - 修改NFS配置文件/etc/exports,添加如下一行: - - ``` - /home/sqbin/nfs *(rw,no_root_squash,async) - ``` - - 其中/home/sqbin/nfs是NFS共享的根目录。 - - 执行以下命令启动NFS server: - - ``` - sudo /etc/init.d/nfs-kernel-server start - ``` - - 执行以下命令重启NFS server: - - ``` - sudo /etc/init.d/nfs-kernel-server restart - ``` - - -2. **设置单板为NFS客户端**。 - - 本指导中的NFS客户端指运行OpenHarmony内核的设备。 - - 1. 硬件连接设置。 - - OpenHarmony内核设备连接到NFS服务器的网络。设置两者IP,使其处于同一网段。比如,设置NFS服务器的IP为10.67.212.178/24,设置OpenHarmony内核设备IP为10.67.212.3/24,注意:此IP为内网私有IP地址,用户使用时有差异,以用户实际IP为准。 - - OpenHarmony内核设备上的IP信息可通过ifconfig命令查看。 - - 2. 启动网络,确保单板到NFS服务器之间的网络通畅。 - - 启动以太网或者其他类型网络,使用ping命令检查到服务器的网络是否通畅。 - - ``` - OHOS # ping 10.67.212.178 - [0]Reply from 10.67.212.178: time=1ms TTL=63 - [1]Reply from 10.67.212.178: time=0ms TTL=63 - [2]Reply from 10.67.212.178: time=1ms TTL=63 - [3]Reply from 10.67.212.178: time=1ms TTL=63 - --- 10.67.212.178 ping statistics --- - 4 packets transmitted, 4 received, 0 loss - ``` - - 客户端NFS初始化,运行命令: - - ``` - OHOS # mkdir /nfs - OHOS # mount 10.67.212.178:/home/sqbin/nfs /nfs nfs 1011 1000 - ``` - - 将从串口得到如下回应信息,表明初始化NFS客户端成功。 - - ``` - OHOS # mount 10.67.212.178:/home/sqbin/nfs /nfs nfs 1011 1000 - Mount nfs on 10.67.212.178:/home/sqbin/nfs, uid:1011, gid:1000 - Mount nfs finished. - ``` - - 该命令将服务器10.67.212.178上的/home/sqbin/nfs目录mount在OpenHarmony内核设备上的/nfs上。 - - >![](../public_sys-resources/icon-note.gif) **说明:** - >本例默认nfs server已经配置可用,即示例中服务器10.67.212.178上的/home/sqbin/nfs已配置可访问。 - - mount命令的格式为: - - ``` - mount nfs - ``` - - 其中“SERVER\_IP“表示服务器的IP地址;“SERVER\_PATH“表示服务器端NFS共享目录路径;“CLIENT\_PATH“表示设备上的NFS路径。 - - 如果不想有NFS访问权限限制,请在Linux命令行将NFS根目录权限设置成777: - - ``` - chmod -R 777 /home/sqbin/nfs - ``` - - 至此,NFS客户端设置完毕。NFS文件系统已成功挂载。 - - -3. **利用NFS共享文件**。 - - 在NFS服务器下新建目录dir,并保存。在OpenHarmony内核下运行ls命令: - - ``` - OHOS # ls /nfs - ``` - - 则可从串口得到如下回应: - - ``` - OHOS # ls /nfs - Directory /nfs: - drwxr-xr-x 0 u:0 g:0 dir - ``` - - 可见,刚刚在NFS服务器上新建的dir目录已同步到客户端\(OpenHarmony内核系统\)的/nfs目录,两者保持同步。 - - 同样地,在客户端\(OpenHarmony内核系统\)上创建文件和目录,在NFS服务器上也可以访问,读者可自行体验。 - - **平台差异性:** - - 目前,NFS客户端仅支持NFS v3部分规范要求,因此对于规范支持不全的服务器,无法完全兼容。在开发测试过程中,建议使用Linux的NFS server,因为其对NFS支持很完善。 - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-file-ramfs.md b/zh-cn/device-dev/kernel/kernel-lite-small-file-ramfs.md deleted file mode 100644 index edd80618cbc318b0aa74a9a28b6fcdde8d2031fe..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-file-ramfs.md +++ /dev/null @@ -1,90 +0,0 @@ -# RAMFS - -- [概述](#section7216205735619) -- [注意事项](#section970375615711) -- [开发指导](#section18433111125812) - -## 概述 - -RAMFS是一个可动态调整大小的基于RAM的文件系统。RAMFS没有后备存储源。向RAMFS中进行的文件写操作也会分配目录项和页缓存,但是数据并不写回到任何其他存储介质上,掉电后数据丢失。 - -RAMFS文件系统把所有的文件都放在 RAM 中,所以读/写操作发生在RAM中,可以用RAMFS来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对存储器的读写损耗,也提高了数据读写速度。 - -OpenHarmony内核的RAMFS是一个简单的文件系统,它是基于RAM的动态文件系统的一种缓冲机制。 - -OpenHarmony内核的RAMFS基于虚拟文件系统层(VFS\),不能格式化。 - -## 注意事项 - -- RAMFS文件系统的读写指针没有分离,所以以O\_APPEND(追加写)方式打开文件后,读指针也在文件尾,读文件前需要用户手动置位。 - -- RAMFS只能挂载一次,一次挂载成功后,后面不能继续挂载到其他目录。 - -- RAMFS文件数量受信号量资源限制,不能超过LOSCFG\_BASE\_IPC\_SEM\_LIMIT。 - -- open打开一个文件,参数有O\_TRUNC时,会将文件中的内容清空。 - - -- RAMFS文件系统支持的操作有:open, close, read, write, seek, opendir, closedir, readdir, readdir\_r, rewinddir, sync, statfs, remove, unlink, mkdir, rmdir, rename, stat, stat64, seek64, mmap, mount, umount。 - - -- RAMFS属于调测功能,默认配置为关闭,正式产品中禁止使用该功能。 - - -## 开发指导 - -RAMFS的挂载和卸载可以在如下两种方式中任选其一: - -- 使用代码挂载和卸载完成RAMFS文件系统的初始化和去初始化。 - 1. 调用mount函数完成RAMFS文件系统的初始化。 - - ``` - void ram_fs_init(void) { - int swRet; - swRet = mount(NULL, RAMFS_DIR, "ramfs", 0, NULL); - if (swRet != 0) { - dprintf("mount ramfs err %d\n", swRet); - return; - } - dprintf("Mount ramfs finished.\n"); - } - ``` - - 调用初始化函数,随后在OpenHarmony内核系统启动时可以看到如下显示,表示RAMFS文件系统已初始化成功: - - ``` - Mount ramfs finished - ``` - - 2. 卸载。调用去初始化函数,随后在OpenHarmony内核系统可以看到如下显示,表示RAMFS文件系统已卸载: - - ``` - void ram_fs_uninit(void) { - int swRet; - swRet = umount(RAMFS_DIR); - if (swRet != 0) { - dprintf("Umount ramfs err %d\n", swRet); - return; - } - dprintf("Umount ramfs finished.\n"); - } - ``` - - -- 使用命令行的方式完成RAMFS文件系统的挂载和卸载 。 - 1. 使用mount命令完成RAMFS文件系统的挂载,将从串口得到如下回应信息,表明挂载成功。 - - ``` - OHOS # mount 0 /ramfs ramfs - mount ok - ``` - - 2. 使用umount命令完成卸载,将从串口得到如下回应信息,表明卸载成功。 - - ``` - OHOS # umount /ramfs - umount ok - ``` - - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-file-vfs.md b/zh-cn/device-dev/kernel/kernel-lite-small-file-vfs.md deleted file mode 100644 index c7d197be36132aa914eaa399d9e16945e6f11ccd..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-file-vfs.md +++ /dev/null @@ -1,171 +0,0 @@ -# VFS - -- [概述](#section132540468341) -- [基本概念](#section229417111227) -- [运作机制](#section18114182834215) -- [注意事项](#section18311145173712) -- [开发指导](#section422619258380) -- [编程实例](#section180311121420) -- [结果验证](#section16772334714) - -## 概述 - -## 基本概念 - -VFS是Virtual File System(虚拟文件系统)的缩写,它不是一个实际的文件系统,而是一个异构文件系统之上的软件粘合层,为用户提供统一的类Unix文件操作接口。 - -由于不同类型的文件系统接口不统一,若系统中有多个文件系统类型,访问不同的文件系统就需要使用不同的非标准接口。而通过在系统中添加VFS层,提供统一的抽象接口,屏蔽了底层异构类型的文件系统的差异,使得访问文件系统的系统调用不用关心底层的存储介质和文件系统类型,提高开发效率。VFS和各个具体文件系统的关系如下: - -**图 1** VFS和各个文件系统的关系 -![](figure/VFS和各个文件系统的关系.png "VFS和各个文件系统的关系") - -OpenHarmony内核中,VFS框架是通过在内存中的树结构来实现的,树的每个结点都是一个inode结构体。设备注册和文件系统挂载后会根据路径在树中生成相应的结点。VFS最主要是两个功能: - -- 查找节点。 -- 统一调用(标准)。 - -## 运作机制 - -通过VFS层,可以使用标准的Unix文件操作函数(如open、read、write等)来实现对不同介质上不同文件系统的访问。 - -VFS框架内存中的inode树结点有三种类型: - -- 虚拟结点:作为VFS框架的虚拟文件,保持树的连续性,如/usr、/usr/bin。 -- 设备结点:/dev目录下,对应一个设备,如/dev/mmcblk0。 -- 挂载点:挂载具体文件系统,如/vs/sd、/mnt。 - -**图 2** 文件系统树形结构 -![](figure/文件系统树形结构.png "文件系统树形结构") - -## 注意事项 - -- VFS下的所有文件系统,创建的目录名和文件名最多只可以有255个字节,能支持的全路径长度最长为259字节,超过这个路径长度的文件和目录无法创建。 - -- 目前仅有jffs2文件系统支持完整的权限控制。 - -- inode\_find\(\)函数调用后会使查找到的inode节点连接数+1,调用完成后需要调用inode\_release\(\)使连接数-1,所以一般inode\_find\(\)要和inode\_release\(\)配套使用。 - -- 设备分为字符设备和块设备,为了块设备上的文件系统系统数据安全,需挂载相应文件系统后通过文件系统接口操作数据。 - -- los\_vfs\_init\(\)只能调用一次,多次调用将会造成文件系统异常。 - -- 目前OpenHarmony内核所有的文件系统中的文件名和目录名中只可以出现“-” 与“\_”两种特殊字符,使用其他特殊字符可能造成的后果不可预知,请谨慎为之。 - -- OpenHarmony内核支持open\(\)+O\_DIRECTORY的方法获取目录数据信息。 - -- 挂载点必须为空目录,不能重复挂载至同一挂载点或挂载至其他挂载点下的目录或文件,错误挂载可能损坏设备及系统。 - -- open打开一个文件时,参数O\_RDWR、O\_WRONLY、O\_RDONLY互斥,只能出现一个,若出现2个或以上作为open的参数,文件读写操作会被拒绝,并返回EACCESS错误码,禁止使用。 - -- OpenHarmony内核文件系统在umount操作之前,需确保所有目录及文件全部关闭,否则umount会失败。如果强制umount,可能导致包括但不限于文件系统损坏、设备损坏等问题。 - -- SD卡移除前,需确保所有目录及文件全部关闭,并进行umount操作。如果强制拔卡,可能导致包括但不限于SD数据丢失、SD卡损坏等问题。 - - -## 开发指导 - -**开发流程** - -推荐驱动开发人员使用VFS框架来注册/卸载设备,即调用register\_driver\(\)、register\_blockdriver\(\)接口生成设备结点,应用层使用open\(\)、read\(\)操作设备(字符设备)文件来调用驱动。 - -**文件描述符** - -本系统中,进程的文件描述符最多有256个(File和Socket描述符合并统计),系统文件描述符共640个,系统文件描述符规格: - -- File描述符,普通文件描述符,系统总规格为512。 - -- Socket描述符,系统总规格为128。 - - -**VFS支持的操作** - -open, close, read, write, seek, ioctl, fcntl, mmap, sync, dup, dup2, truncate, opendir, closedir, readdir, rewinddir, mount, umount, statfs, unlink, remove, mkdir, rmdir, rename, stat, utime, seek64, fallocate, fallocate64, truncate64, chmod, chown。 - ->![](../public_sys-resources/icon-note.gif) **说明:** ->- 当前只提供修改jffs2文件以及vfs设备节点属性的接口,各个系统对只读等属性有各自的处理方式。 ->- 在OpenHarmony内核中属性并不冲突(可以任意修改)。 ->- 在OpenHarmony内核中只读属性文件/目录不允许被删除。 ->- 在OpenHarmony内核中只读属性文件/目录允许rename。 ->- 只读文件不允许以O\_CREAT、O\_TRUNC,以及有含有写的权限的方式打开。 ->- 在OpenHarmony内核中设置的系统文件加上隐藏属性,在Windows中只能通过命令行找到(在显示,不显示隐藏文件的属性情况下都不能看到)。 - -## 编程实例 - -``` -/* 说明:展示创建目录,和遍历目录的操作 */ -#include -#include -#include -#include -#include -#include - -int main() -{ - int ret; - char *dirname = "/test"; - char *pathname0 = "/test/test0"; - char *pathname1 = "/test/test1"; - char *pathname2 = "/test/test2"; - struct dirent **namelist; - int num; - - ret = mkdir(dirname, 0777); - if ((ret < 0) && (errno != EEXIST)) { - printf("mkdir failed. path=%s, errno=%d\n", dirname, errno); - goto EXIT; - } - - ret = mkdir(pathname0, 0777); - if ((ret < 0) && (errno != EEXIST)) { - printf("mkdir failed. path=%s, errno=%d\n", pathname0, errno); - goto EXIT0; - } - - ret = mkdir(pathname1, 0777); - if ((ret < 0) && (errno != EEXIST)) { - printf("mkdir failed. path=%s, errno=%d\n", pathname1, errno); - goto EXIT1; - } - - ret = mkdir(pathname2, 0777); - if ((ret < 0) && (errno != EEXIST)) { - printf("mkdir failed. path=%s, errno=%d\n", pathname2, errno); - goto EXIT2; - } - - num = scandir(dirname, &namelist, NULL, alphasort); - if (num < 0) { - perror("scandir"); - } else { - while (num--) { - printf("%s\n", namelist[num]->d_name); - free(namelist[num]); - } - free(namelist); - } - - printf("fs_demo exit.\n"); - return 0; - -EXIT2: - remove(pathname2); -EXIT1: - remove(pathname1); -EXIT0: - remove(pathname0); -EXIT: - remove(dirname); - return 0; -} -``` - -## 结果验证 - -``` -OHOS # test2 -test1 -test0 -fs_demo exit. -``` - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-file.md b/zh-cn/device-dev/kernel/kernel-lite-small-file.md deleted file mode 100644 index e88e5dd77b3a3a41c0d9fc63e0c52cf09d75205b..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-file.md +++ /dev/null @@ -1,54 +0,0 @@ -# 文件系统 - -OpenHarmony轻内核支持的文件系统有:VFS(虚拟文件系统)、NFS、RAMFS、FAT、JFFS2。 - -**各个文件系统功能概述:** - -**表 1** 文件系统功能概述 - - - - - - - - - - - - - - - - - - - - - - -

文件系统

-

功能特点概述

-

VFS

-

VFS是Virtual File System(虚拟文件系统)的缩写,它不是一个实际的文件系统,而是一个异构文件系统之上的软件粘合层,为用户提供统一的类Unix文件操作接口。

-

NFS

-

NFS是Network File System(网络文件系统)的缩写。它最大的功能是可以通过网络,让不同的机器、不同的操作系统彼此分享其他用户的文件。

-

RAMFS

-

RAMFS是一种基于RAM的文件系统。RAMFS文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,避免了对存储器的读写损耗,也提高了数据读写速度。RAMFS是基于RAM的动态文件系统的一种存储缓冲机制。

-

FAT

-

FAT文件系统是File Allocation Table(文件配置表)的简称,有FAT12、FAT16、FAT32。在可移动存储介质(U盘、SD卡、移动硬盘等)上多使用FAT文件系统,使设备与Windows、Linux等桌面系统之间保持很好的兼容性。

-

JFFS2

-

JFFS2是Journalling Flash File System Version 2(日志文件系统)的缩写,是MTD设备上的日志型文件系统。主要应用于对NOR_FLASH闪存的文件管理。OpenHarmony内核的JFFS2支持多分区。

-
- -- **[VFS](kernel-lite-small-file-vfs.md)** - -- **[NFS](kernel-lite-small-file-nfs.md)** - -- **[RAMFS](kernel-lite-small-file-ramfs.md)** - -- **[FAT](kernel-lite-small-file-fat.md)** - -- **[JFFS2](kernel-lite-small-file-jffs.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-lib-differ.md b/zh-cn/device-dev/kernel/kernel-lite-small-lib-differ.md deleted file mode 100644 index 9604c1956df344b8cd486199f36a00ff217005ee..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-lib-differ.md +++ /dev/null @@ -1,96 +0,0 @@ -# 与Linux标准库的差异 - -- [进程](#section249218475301) -- [内存](#section55731513163117) -- [与Linux mmap的差异](#section1943551142314) -- [代码举例](#section16947155092514) -- [文件系统](#section1746965493115) -- [信号](#section1198254310333) -- [Time](#section0833419133414) - -本章节描述了OpenHarmony内核承载的标准库与Linux标准库之间存在的关键差异。更多差异详见C库API文档说明。 - -## 进程 - -1. OpenHarmony用户态**进程**优先级只支持静态优先级且用户态可配置的优先级范围为10\(最高优先级\)-31\(最低优先级)。 -2. OpenHarmony用户态**线程**优先级只支持静态优先级且用户态可配置的优先级范围为0\(最高优先级\)-31\(最低优先级)。 -3. OpenHarmony进程调度策略只支持SCHED\_RR, 线程调度策略支持SCHED\_RR和SCHED\_FIFO。 - -## 内存 - -## 与Linux mmap的差异 - -mmap接口原型为:void \*mmap \(void \*addr, size\_t length, int prot, int flags, int fd, off\_t offset\)。 - -其中,参数fd的生命周期实现与Linux glibc存在差异。具体体现在,glibc在成功调用mmap进行映射后,可以立即释放fd句柄。在OpenHarmony内核中,不允许用户在映射成功后立即关闭相关fd,只允许在取消映射munmap后再进行fd的close操作。如果用户不进行fd的close操作,操作系统将在进程退出时对该fd进行回收。 - -## 代码举例 - -Linux目前支持的情况如下: - -``` -int main(int argc, char *argv[]) -{ - int fd; - void *addr = NULL; - ... - fd = open(argv[1], O_RDONLY); - if (fd == -1){ - perror("open"); - exit(EXIT_FAILURE); - } - addr = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, offset); - if (addr == MAP_FAILED) { - perror("mmap"); - exit(EXIT_FAILURE); - } - close(fd); /* OpenHarmony does not support closing fd immediately after the mapping is successful. */ - ... - exit(EXIT_SUCCESS); -} -``` - -OpenHarmony支持的情况如下: - -``` -int main(int argc, char *argv[]) -{ - int fd; - void *addr = NULL; - ... - fd = open(argv[1], O_RDONLY); - if (fd == -1) { - perror("open"); - exit(EXIT_FAILURE); - } - addr = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, offset); - if (addr == MAP_FAILED) { - perror("mmap"); - exit(EXIT_FAILURE); - } - ... - munmap(addr, length); - close(fd); /* Close fd after the munmap is canceled. */ - exit(EXIT_SUCCESS); -} -``` - -## 文件系统 - -**系统目录**:用户无权限修改系统目录和设备挂载目录。包含/dev,/proc,/app,/bin,/data,/etc,/lib,/system,/usr目录。 - -**用户目录**:用户可以在该目录下进行文件创建、读写,但**不能进行设备挂载**。用户目录指/storage目录。 - -除**系统目录**与**用户目录**之外,用户可以自行创建文件夹进行设备的挂载。但是要注意,已挂载的文件夹及其子文件夹不允许重复或者嵌套挂载,非空文件夹不允许挂载。 - -## 信号 - -- 信号默认行为不支持STOP、CONTINUE、COREDUMP功能。 -- 无法通过信号唤醒正在睡眠状态(举例:进程调用sleep函数进入睡眠)的进程。原因:信号机制无唤醒功能,当且仅当进程被CPU调度运行时才能处理信号内容。 -- 进程退出后会发送SIGCHLD给父进程,发送动作无法取消。 -- 信号仅支持1-30号信号,接收方收到多次同一信号,仅执行一次回调函数。 - -## Time - -OpenHarmony当前时间精度以tick计算,系统默认10ms/tick。sleep、timeout系列函数时间误差<=20ms。 - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-lib.md b/zh-cn/device-dev/kernel/kernel-lite-small-lib.md deleted file mode 100644 index 849c9823bb4d63fab462824146e779ab635cbd4e..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-lib.md +++ /dev/null @@ -1,7 +0,0 @@ -# 标准库 - -- **[标准库](kernel-lite-small-lib-standard.md)** - -- **[与Linux标准库的差异](kernel-lite-small-lib-differ.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-memory.md b/zh-cn/device-dev/kernel/kernel-lite-small-memory.md deleted file mode 100644 index 5f97c5705ac4715be205c81f29469ebf13d750c8..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-memory.md +++ /dev/null @@ -1,353 +0,0 @@ -# 内存 - -- [基本概念](#section1392116583424) -- [使用场景](#section159581619194319) -- [接口说明](#section114001032104317) - -## 基本概念 - -内存管理是开发过程中必须要关注的重要过程,它包括内存的分配、使用和回收。 - -良好的内存管理对于提高软件性能和可靠性有着十分重要的意义。 - -## 使用场景 - -针对用户态开发,OpenHarmony内核提供了一套内存系统调用接口,支持内存的申请释放、重映射、内存属性的设置等,还有C库的标准内存操作函数。 - -## 接口说明 - -**表 1** 标准C库相关接口 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

头文件

-

接口

-

功能

-

strings.h

-

int bcmp(const void *s1, const void *s2, size_t n)

-

比较字节序列。

-

strings.h

-

void bcopy(const void *src, void *dest, size_t n)

-

拷贝字节序列。

-

strings.h

-

void bzero(void *s, size_t n)

-

写入零值字节。

-

string.h

-

void *memccpy(void *dest, const void *src, int c, size_t n)

-

拷贝src 所指的内存内容前n 个字节到dest 所指的地址上。复制时检查参数c 是否出现,若是则返回dest 中值为c 的下一个字节地址。

-

string.h

-

void *memchr(const void *s, int c, size_t n)

-

在s所指内存的前n个字节中查找c。

-

string.h

-

int memcmp(const void *s1, const void *s2, size_t n)

-

内存比较。

-

string.h

-

void *memcpy(void *dest, const void *src, size_t n)

-

内存拷贝。

-

string.h

-

void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen)

-

找到一个子串。

-

string.h

-

void *memmove(void *dest, const void *src, size_t n)

-

内存移动。

-

string.h

-

void *mempcpy(void *dest, const void *src, size_t n)

-

拷贝内存区域。

-

string.h

-

void *memset(void *s, int c, size_t n)

-

内存初始化。

-

stdlib.h

-

void *malloc(size_t size)

-

申请内存。

-

stdlib.h

-

void *calloc(size_t nmemb, size_t size)

-

申请内存并清零。

-

stdlib.h

-

void *realloc(void *ptr, size_t size)

-

重分配内存。

-

stdlib.h/malloc.h

-

void *valloc(size_t size)

-

分配以页对齐的内存。

-

stdlib.h

-

void free(void *ptr)

-

释放内存。

-

malloc.h

-

size_t malloc_usable_size(void *ptr)

-

获取从堆分配的内存块的大小。

-

unistd.h

-

int getpagesize(void)

-

获取页面大小。

-

unistd.h

-

void *sbrk(intptr_t increment)

-

更改数据段大小。

-
- -差异接口详细说明: - -- **mmap** - - **函数原型:** - - void \*mmap\(void \*addr, size\_t length, int prot, int flags, int fd, off\_t offset\); - - **函数功能:**申请虚拟内存。 - - **参数说明:** - - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

描述

-

addr

-

用来请求使用某个特定的虚拟内存地址。如果取NULL,结果地址就将自动分配(这是推荐的做法),否则会降低程序的可移植性,因为不同系统的可用地址范围不一样。

-

length

-

内存段的大小。

-

prot

-

用于设置内存段的访问权限,有如下权限:

-
  • PROT_READ:允许读该内存段。
  • PROT_WRITE:允许写该内存段。
  • PROT_EXEC:允许执行该内存段。
  • PROT_NONE:不能访问。
-

flags

-

控制程序对内存段的改变所造成的影响,有如下属性:

-
  • MAP_PRIVATE:内存段私有,对它的修改值仅对本进程有效。
  • MAP_SHARED:把对该内存段的修改保存到磁盘文件中。
-

fd

-

打开的文件描述符。

-

offset

-

用以改变经共享内存段访问的文件中数据的起始偏移值。

-
- - >![](../public_sys-resources/icon-note.gif) **说明:** - >mmap与Linux实现差异详见[与Linux标准库的差异](kernel-lite-small-lib-differ.md)章节。 - - **返回值:** - - - 成功返回:虚拟内存地址,这地址是页对齐。 - - 失败返回:\(void \*\)-1。 - - -- **munmap接口** - - **函数原型:** - - int munmap\(void \*addr, size\_t length\); - - **函数功能:**释放虚拟内存。 - - **参数说明:** - - - - - - - - - - - - - -

参数

-

描述

-

addr

-

虚拟内存起始位置。

-

length

-

内存段的大小。

-
- - **返回值:** - - - 成功返回0。 - - 失败返回-1。 - - -- **mprotect接口** - - **函数原型:** - - int mprotect\(void \*addr, size\_t length, int prot\); - - **函数功能:**修改内存段的访问权限。 - - **参数说明:** - - - - - - - - - - - - - - - - -

参数

-

描述

-

addr

-

内存段起始地址,必须页对齐;访问权限异常,内核将直接抛异常并且kill该进程,而不会产生SIGSEGV信号给当前进程。

-

length

-

内存段的大小。

-

prot

-

内存段的访问权限,有如下定义:

-
  • PROT_READ:允许读该内存段。
  • PROT_WRITE:允许写该内存段。
  • PROT_EXEC:允许执行该内存段。
  • PROT_NONE:不能访问。
-
- - **返回值:** - - - 成功返回0。 - - 失败返回-1。 - - -- **mremap接口** - - **函数原型:** - - void \*mremap\(void \*old\_address, size\_t old\_size, size\_t new\_size, int flags, void new\_address\); - - **函数功能:**重新映射虚拟内存地址。 - - **参数说明:** - - - - - - - - - - - - - - - - - - - -

参数

-

描述

-

old_address

-

需要扩大(或缩小)的内存段的原始地址。注意old_address必须是页对齐。

-

old_size

-

内存段的原始大小。

-

new_size

-

新内存段的大小。

-

flags

-

如果没有足够的空间在当前位置展开映射,则返回失败

-
  • MREMAP_MAYMOVE:允许内核将映射重定位到新的虚拟地址。
  • MREMAP_FIXED:mremap()接受第五个参数,void *new_address,该参数指定映射地址必须页对齐;在new_address和new_size指定的地址范围内的所有先前映射都被解除映射。如果指定了MREMAP_FIXED,还必须指定MREMAP_MAYMOVE。
-
- - **返回值:** - - - 成功返回:重新映射后的虚拟内存地址。 - - 失败返回:\(\(void \*\)-1\)。 - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-net.md b/zh-cn/device-dev/kernel/kernel-lite-small-net.md deleted file mode 100644 index 8aa33611c312c90c33556691ff5460883c51f3d8..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-net.md +++ /dev/null @@ -1,303 +0,0 @@ -# 网络 - -- [基本概念](#section9840143083510) -- [使用场景](#section1575885183516) -- [接口说明](#section16351198193614) - -## 基本概念 - -网络模块实现了TCP/IP协议栈基本功能,提供标准的POSIX socket接口。 - ->![](../public_sys-resources/icon-note.gif) **说明:** ->当前系统使用**lwIP**提供网络能力。 - -## 使用场景 - -针对用户态开发,OpenHarmony内核提供了一套网络功能系统调用接口,支持socket的创建关闭、数据收发、网络属性的设置等,通过C库提供标准的POSIX socket函数供开发者使用。 - -## 接口说明 - -**表 1** 标准C库相关接口 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

头文件

-

接口

-

功能

-

sys/socket.h

-

int accept(int socket, struct sockaddr *address, socklen_t *address_len)

-

接受连接。

-

sys/socket.h

-

int bind(int s, const struct sockaddr *name, socklen_t namelen)

-

socket与IP地址绑定。

-

sys/socket.h

-

int shutdown(int socket, int how)

-

关闭连接。

-

sys/socket.h

-

int getpeername(int s, struct sockaddr *name, socklen_t *namelen)

-

获取对端地址。

-

sys/socket.h

-

int getsockname(int s, struct sockaddr *name, socklen_t *namelen)

-

获取本地地址。

-

sys/socket.h

-

int getsockopt(int s, struct sockaddr *name, socklen_t *namelen)

-

获取socket属性信息。

-

sys/socket.h

-

int setsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen)

-

配置socket属性。

-

unistd.h

-

int close(int s)

-

关闭socket。

-

sys/socket.h

-

int connect(int s, const struct sockaddr *name, socklen_t namelen)

-

连接到指定的目的IP。

-

sys/socket.h

-

int listen(int sockfd, int backlog)

-

聆听连接本socket的请求。

-

sys/socket.h

-

ssize_t recv(int socket, void *buffer, size_t length, int flags)

-

接收socket上收到的数据。

-

sys/socket.h

-

ssize_t recvmsg(int s, struct msghdr *message, int flags)

-

接收socket上收到的数据,可使用更丰富的参数。

-

sys/socket.h

-

ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *address_len)

-

接收socket上收到的数据,可同时获得数据来源IP地址。

-

sys/socket.h

-

ssize_t send(int s, const void *dataptr, size_t size, int flags)

-

通过socket发送数据。

-

sys/socket.h

-

ssize_t sendmsg(int s, const struct msghdr *message, int flags)

-

通过socket发送数据,可使用更丰富的参数。

-

sys/socket.h

-

ssize_t sendto(int s, const void *dataptr, size_t size, int flags, const struct sockaddr *to, socklen_t tolen)

-

通过socket发送数据,可指定发送的目的IP地址。

-

sys/socket.h

-

int socket(int domain, int type, int protocol)

-

创建socket。

-

sys/select.h

-

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)

-

多路复用。

-

sys/ioctl.h

-

int ioctl(int s, int request, ...)

-

socket属性获取、设置。

-

arpa/inet.h

-

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size)

-

网络地址格式转换:将二进制格式IP地址转换为字符串格式。

-

arpa/inet.h

-

int inet_pton(int af, const char *src, void *dst)

-

网络地址格式转换:将字符串格式IP地址转换为二进制格式。

-
- -与标准接口差异详细说明: - -- **sendmsg** - - **函数原型:** - - ssize\_t sendmsg\(int s, const struct msghdr \*message, int flags\) - - **函数功能:**发送消息。 - - **参数说明:** - - - - - - - - - - - - - - - - -

参数

-

描述

-

s

-

套接字描述符。

-

message

-

待发送的消息,不支持发送ancillary消息。

-

flags

-

用于指定发送消息时行为特性,有如下行为特性:

-
  • MSG_MORE:允许将多次发送的消息进行拼包发送。
  • MSG_DONTWAIT:非阻塞操作。
-
- - **返回值:** - - - 成功返回:已发送的消息长度(字节数)。 - - 失败返回:-1,并设置errno。 - - -- **recvmsg** - - **函数原型:** - - ssize\_t recvmsg\(int s, struct msghdr \*message, int flags\) - - **函数功能:**接收消息。 - - **参数说明:** - - - - - - - - - - - - - - - - -

参数

-

描述

-

s

-

套接字描述符。

-

message

-

存放接收的消息,不支持接收ancillary消息。

-

flags

-

用于指定接收消息时行为特性,有如下行为特性:

-
  • MSG_PEEK:允许预读消息而不取走。
  • MSG_DONTWAIT:非阻塞操作。
-
- - **返回值:** - - - 成功返回:已接收的消息长度(字节数)。 - - 失败返回:-1,并设置errno。 - - -- **ioctl** - - **函数原型:** - - int ioctl\(int s, int request, ...\) - - **函数功能:**获取或设置socket属性。 - - **参数说明:** - - - - - - - - - - - - - -

参数

-

描述

-

s

-

套接字描述符。

-

request

-

对socket属性要进行的操作,当前支持如下操作:

-
  • FIONREAD:获取socket当前可读取的数据大小(字节数)。
  • FIONBIO:设置socket是否非阻塞。
-
- - **返回值:** - - - 成功返回:0。 - - 失败返回:-1,并设置errno。 - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-process.md b/zh-cn/device-dev/kernel/kernel-lite-small-process.md deleted file mode 100644 index d6b9ca0377b4a57c3e6663468ddfba4f7a6d930c..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-process.md +++ /dev/null @@ -1,301 +0,0 @@ -# 进程 - -- [基本概念](#section29197338383) -- [使用场景](#section85513272398) -- [接口说明](#section4517119124015) - -## 基本概念 - -从系统的角度看,进程是资源管理单元。进程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它进程运行。 - -OpenHarmony内核的进程模块可以给用户提供多个进程,实现了进程之间的切换和通信,帮助用户管理业务程序流程。这样用户可以将更多的精力投入到业务功能的实现中。 - -OpenHarmony内核中的进程采用抢占式调度机制,支持时间片轮转调度方式。 - -OpenHarmony内核的进程一共有32个优先级\(0-31\),用户进程可配置的优先级有22个\(10-31\),最高优先级为10,最低优先级为31。 - -高优先级的进程可抢占低优先级进程,低优先级进程必须在高优先级进程阻塞或结束后才能得到调度。 - -每一个用户态进程均拥有自己独立的进程空间,相互之间不可见,实现进程间隔离。 - -用户态根进程init由内核态创建,其它用户态进程均由init进程fork而来。 - -**进程状态说明:** - -- 初始化(Init):该进程正在被创建。 - -- 就绪(Ready):该进程在就绪列表中,等待CPU调度。 - -- 运行(Running):该进程正在运行。 - -- 阻塞(Pending):该进程被阻塞挂起。本进程内所有的线程均被阻塞时,进程被阻塞挂起。 - -- 僵尸态(Zombies):该进程运行结束,等待父进程回收其控制块资源。 - - -**图 1** 进程状态迁移示意图 -![](figure/进程状态迁移示意图.png "进程状态迁移示意图") - -**进程状态迁移说明:** - -- Init→Ready: - - 进程创建或fork时,拿到该进程控制块后进入Init状态,处于进程初始化阶段,当进程初始化完成将进程插入调度队列,此时进程进入就绪状态。 - -- Ready→Running: - - 进程创建后进入就绪态,发生进程切换时,就绪列表中最高优先级的进程被执行,从而进入运行态。若此时该进程中已无其它线程处于就绪态,则该进程从就绪列表删除,只处于运行态;若此时该进程中还有其它线程处于就绪态,则该进程依旧在就绪队列,此时进程的就绪态和运行态共存。 - -- Running→Pending: - - 进程内所有的线程均处于阻塞态时,进程在最后一个线程转为阻塞态时,同步进入阻塞态,然后发生进程切换。 - -- Pending→Ready: - - 阻塞进程内的任意线程恢复就绪态时,进程被加入到就绪队列,同步转为就绪态。 - -- Ready→Pending: - - 进程内的最后一个就绪态线程处于阻塞态时,进程从就绪列表中删除,进程由就绪态转为阻塞态。 - -- Running→Ready: - - 进程由运行态转为就绪态的情况有以下两种: - - 1. 有更高优先级的进程创建或者恢复后,会发生进程调度,此刻就绪列表中最高优先级进程变为运行态,那么原先运行的进程由运行态变为就绪态。 - 2. 若进程的调度策略为SCHED\_RR,且存在同一优先级的另一个进程处于就绪态,则该进程的时间片消耗光之后,该进程由运行态转为就绪态,另一个同优先级的进程由就绪态转为运行态。 - -- Running→Zombies: - - 当进程的主线程或所有线程运行结束后,进程由运行态转为僵尸态,等待父进程回收资源。 - - -## 使用场景 - -进程创建后,用户只能操作自己进程空间的资源,无法操作其它进程的资源(共享资源除外)。 用户态允许进程挂起,恢复,延时等操作,同时也可以设置用户态进程调度优先级和调度策略,获取进程调度优先级和调度策略。进程结束的时候,进程会主动释放持有的进程资源,但持有的进程pid资源需要父进程通过wait/waitpid或父进程退出时回收。 - -## 接口说明 - -OpenHarmony内核系统中的进程管理模块为用户提供下面几种功能: - -**表 1** 进程管理模块功能 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

备注

-

进程

-

fork

-

创建一个新进程。

-

-

-

exit

-

终止进程。

-

-

-

atexit

-

注册正常进程终止的回调函数。

-

-

-

abort

-

中止进程执行。

-

-

-

getpid

-

获取进程ID。

-

-

-

getppid

-

获取父进程ID。

-

-

-

getpgrp

-

获取调用进程的进程组ID。

-

-

-

getpgid

-

获取进程的进程组ID。

-

-

-

setpgrp

-

设置调用进程的进程组ID。

-

-

-

setpgid

-

设置进程的进程组ID。

-

-

-

kill

-

给进程发送信号。

-
  • 仅支持1-30号信号的发送。
  • 信号的默认行为不支持STOP及CONTINUE,无COREDUMP功能。
  • 不能屏蔽SIGSTOP、SIGKILL、SIGCONT。
  • 异步信号,发送信号给某进程后,直到该进程被调度后才会执行信号回调(为安全起见,杀死进程的动作是进程自己执行的,内核不能通过信号强制杀死对方)。
  • 进程消亡会发送SIGCHLD给父进程,发送动作无法取消。
  • 无法通过信号唤醒正在睡眠的进程。
-

wait

-

等待任意子进程结束并回收子进程资源。

-

status的值可以由以下宏定义解析:

-
  • WIFEXITED(status):如果子进程正常结束,它就返回真;否则返回假。
  • WEXITSTATUS(status):如果WIFEXITED(status)为真,则可以用该宏取得子进程exit()返回的退出码。
  • WTERMSIG(status) 仅支持以下情况:子进程触发异常结束后通过WTERMSIG获取的进程退出编号始终为SIGUSR2。
  • 不支持的操作: WIFSTOPPED、WSTOPSIG、WCOREDUMP 、WIFCONTINUED。
-

waitpid

-

等待子进程结束并回收子进程资源。

-

options:不支持WUNTRACED,WCONTINUED;

-

status的值可以由以下宏定义解析:

-
  • WIFEXITED(status):如果子进程正常结束,它就返回真;否则返回假。
  • WEXITSTATUS(status):如果WIFEXITED(status)为真,则可以用该宏取得子进程exit()返回的退出码。
  • WTERMSIG(status)仅支持以下情况:子进程触发异常结束后通过WTERMSIG获取的进程退出编号始终为SIGUSR2。
  • 不支持:WIFSTOPPED 、WSTOPSIG、WCOREDUMP 、WIFCONTINUED。
-

调度

-

getpriority

-

获取指定ID的静态优先级。

-
  • 不支持:PRIO_PGRP、PRIO_USER。
-
  • 无动态优先级概念,用于设置静态优先级。
-

setpriority

-

设置指定ID的静态优先级。

-

sched_rr_get_interval

-

获取执行时间限制。

-

-

-

sched_yield

-

系统调用运行进程主动让出执行权。

-

-

-

sched_get_priority_max

-

获取进程静态优先级取值范围的最大值。

-

调度策略只支持:SCHED_RR。

-

sched_get_priority_min

-

获取进程静态优先级取值范围的最小值。

-

sched_getscheduler

-

获取调度策略。

-

sched_setscheduler

-

设置调度策略。

-

sched_getparam

-

获取调度参数。

-

-

-

sched_setparam

-

设置调度参数。

-

-

-

exec

-

execl

-

执行指定的elf格式的用户程序文件。

-

-

-

execle

-

执行指定的elf格式的用户程序文件。

-

-

-

execlp

-

执行指定的elf格式的用户程序文件。

-

-

-

execv

-

执行指定的elf格式的用户程序文件。

-

-

-

execve

-

执行指定的elf格式的用户程序文件。

-

-

-

execvp

-

执行指定的elf格式的用户程序文件。

-

-

-
- diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file.md b/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file.md deleted file mode 100644 index f2d8302ca40447c34683eec77ec1d78c9275fcc6..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-file.md +++ /dev/null @@ -1,45 +0,0 @@ -# 文件命令 - -- **[cat](kernel-lite-small-shell-cmd-file-cat.md)** - -- **[cd](kernel-lite-small-shell-cmd-file-cd.md)** - -- **[chgrp](kernel-lite-small-shell-cmd-file-chgrp.md)** - -- **[chmod](kernel-lite-small-shell-cmd-file-chmod.md)** - -- **[chown](kernel-lite-small-shell-cmd-file-chown.md)** - -- **[cp](kernel-lite-small-shell-cmd-file-cp.md)** - -- **[format](kernel-lite-small-shell-cmd-file-format.md)** - -- **[ls](kernel-lite-small-shell-cmd-file-is.md)** - -- **[lsfd](kernel-lite-small-shell-cmd-file-isfd.md)** - -- **[mkdir](kernel-lite-small-shell-cmd-file-mkdir.md)** - -- **[mount](kernel-lite-small-shell-cmd-file-mount.md)** - -- **[partinfo](kernel-lite-small-shell-cmd-file-part.md)** - -- **[partition](kernel-lite-small-shell-cmd-file-partion.md)** - -- **[pwd](kernel-lite-small-shell-cmd-file-pwd.md)** - -- **[rm](kernel-lite-small-shell-cmd-file-rm.md)** - -- **[rmdir](kernel-lite-small-shell-cmd-file-rmdir.md)** - -- **[statfs](kernel-lite-small-shell-cmd-file-sta.md)** - -- **[sync](kernel-lite-small-shell-cmd-file-sync.md)** - -- **[touch](kernel-lite-small-shell-cmd-file-touch.md)** - -- **[writeproc](kernel-lite-small-shell-cmd-file-write.md)** - -- **[umount](kernel-lite-small-shell-cmd-file-umount.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net.md b/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net.md deleted file mode 100644 index 6695d35058d5c51b722eeb73330d33d312861002..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-net.md +++ /dev/null @@ -1,25 +0,0 @@ -# 网络命令 - -- **[arp](kernel-lite-small-shell-cmd-net-arp.md)** - -- **[dhclient](kernel-lite-small-shell-cmd-net-dh.md)** - -- **[dns](kernel-lite-small-shell-cmd-net-dns.md)** - -- **[ifconfig](kernel-lite-small-shell-cmd-net-ipc.md)** - -- **[ipdebug](kernel-lite-small-shell-cmd-net-ipd.md)** - -- **[netstat](kernel-lite-small-shell-cmd-net-net.md)** - -- **[ntpdate](kernel-lite-small-shell-cmd-net-ntp.md)** - -- **[ping](kernel-lite-small-shell-cmd-net-ping.md)** - -- **[ping6](kernel-lite-small-shell-cmd-net-ping6.md)** - -- **[telnet](kernel-lite-small-shell-cmd-net-tel.md)** - -- **[tftp](kernel-lite-small-shell-cmd-net-tftp.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys.md b/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys.md deleted file mode 100644 index 8bccc06e167edac3be5d99cf37d1aeb81427c730..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys.md +++ /dev/null @@ -1,47 +0,0 @@ -# 系统命令 - -- **[cpup](kernel-lite-small-shell-cmd-sys-cpup.md)** - -- **[date](kernel-lite-small-shell-cmd-sys-date.md)** - -- **[dmesg](kernel-lite-small-shell-cmd-sys-demsg.md)** - -- **[exec](kernel-lite-small-shell-cmd-sys-exec.md)** - -- **[free](kernel-lite-small-shell-cmd-sys-free.md)** - -- **[help](kernel-lite-small-shell-cmd-sys-help.md)** - -- **[hwi](kernel-lite-small-shell-cmd-sys-hwi.md)** - -- **[kill](kernel-lite-small-shell-cmd-sys-kill.md)** - -- **[log](kernel-lite-small-shell-cmd-sys-log.md)** - -- **[memcheck](kernel-lite-small-shell-cmd-sys-mem.md)** - -- **[oom](kernel-lite-small-shell-cmd-sys-oom.md)** - -- **[pmm](kernel-lite-small-shell-cmd-sys-pmm.md)** - -- **[reset](kernel-lite-small-shell-cmd-sys-reset.md)** - -- **[sem](kernel-lite-small-shell-cmd-sys-sem.md)** - -- **[stack](kernel-lite-small-shell-cmd-sys-stack.md)** - -- **[su](kernel-lite-small-shell-cmd-sys-su.md)** - -- **[swtmr](kernel-lite-small-shell-cmd-sys-swymr.md)** - -- **[systeminfo](kernel-lite-small-shell-cmd-sys-sys.md)** - -- **[task](kernel-lite-small-shell-cmd-sys-task.md)** - -- **[uname](kernel-lite-small-shell-cmd-sys-uname.md)** - -- **[vmm](kernel-lite-small-shell-cmd-sys-vmm.md)** - -- **[watch](kernel-lite-small-shell-cmd-sys-watch.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd.md b/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd.md deleted file mode 100644 index 95d4b92cffc8d087d40831a981d3f3f7828399a9..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd.md +++ /dev/null @@ -1,13 +0,0 @@ -# Shell命令使用详解 - -本章节介绍了系统关键命令的功能、格式、参数范围、使用指南和使用实例。 - -不在本文档范围内的命令,详见[help](kernel-lite-small-shell-cmd-sys-help.md)命令的输出内容,也可以通过命令的“-h | --help”选项,查看该命令的使用帮助。 - -- **[系统命令](kernel-lite-small-shell-cmd-sys.md)** - -- **[文件命令](kernel-lite-small-shell-cmd-file.md)** - -- **[网络命令](kernel-lite-small-shell-cmd-net.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell.md b/zh-cn/device-dev/kernel/kernel-lite-small-shell.md deleted file mode 100644 index edc56c8c73e6e879e3dac5813fc5e4d502b940e6..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell.md +++ /dev/null @@ -1,15 +0,0 @@ -# 调测 - -- **[Shell介绍](kernel-lite-small-shell-des.md)** - -- **[Shell命令开发指导](kernel-lite-small-shell-guide.md)** - -- **[Shell命令编程实例](kernel-lite-small-shell-sample.md)** - -- **[Shell命令使用详解](kernel-lite-small-shell-cmd.md)** - -- **[魔法键使用方法](kernel-lite-small-shell-cmd-mag.md)** - -- **[用户态异常信息说明](kernel-lite-small-shell-cmd-abn.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-thread.md b/zh-cn/device-dev/kernel/kernel-lite-small-thread.md deleted file mode 100644 index b758c77877f7f426c10d031f9c68d6b3c310cb8f..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small-thread.md +++ /dev/null @@ -1,702 +0,0 @@ -# 线程 - -- [基本概念](#section1179311337405) -- [使用场景](#section44877547404) -- [接口说明](#section2069477134115) - -## 基本概念 - -从系统的角度看,线程是竞争系统资源的最小运行单元。线程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它线程运行。 - -OpenHarmony内核每个进程内的线程独立运行、独立调度,当前进程内线程的调度不受其它进程内线程的影响。 - -OpenHarmony内核中的线程采用抢占式调度机制,同时支持时间片轮转调度和FIFO调度方式。 - -OpenHarmony内核的线程一共有32个优先级\(0-31\),最高优先级为0,最低优先级为31。 - -当前进程内高优先级的线程可抢占当前进程内低优先级线程,当前进程内低优先级线程必须在当前进程内高优先级线程阻塞或结束后才能得到调度。 - -**线程状态说明:** - -- 初始化(Init):该线程正在被创建。 - -- 就绪(Ready):该线程在就绪列表中,等待CPU调度。 - -- 运行(Running):该线程正在运行。 - -- 阻塞(Blocked):该线程被阻塞挂起。Blocked状态包括:pending\(因为锁、事件、信号量等阻塞\)、suspended(主动pend)、delay\(延时阻塞\)、pendtime\(因为锁、事件、信号量时间等超时等待\)。 - -- 退出(Exit):该线程运行结束,等待父线程回收其控制块资源。 - - -**图 1** 线程状态迁移示意图 -![](figure/线程状态迁移示意图.png "线程状态迁移示意图") - -**线程状态迁移说明:** - -- Init→Ready: - - 线程创建拿到控制块后为Init状态,处于线程初始化阶段,当线程初始化完成将线程插入调度队列,此时线程进入就绪状态。 - -- Ready→Running: - - 线程创建后进入就绪态,发生线程切换时,就绪列表中最高优先级的线程被执行,从而进入运行态,但此刻该线程会从就绪列表中删除。 - -- Running→Blocked: - - 正在运行的线程发生阻塞(挂起、延时、读信号量等)时,线程状态由运行态变成阻塞态,然后发生线程切换,运行就绪列表中剩余最高优先级线程。 - -- Blocked→Ready : - - 阻塞的线程被恢复后(线程恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的线程会被加入就绪列表,从而由阻塞态变成就绪态。 - -- Ready→Blocked: - - 线程也有可能在就绪态时被阻塞(挂起),此时线程状态会由就绪态转变为阻塞态,该线程从就绪列表中删除,不会参与线程调度,直到该线程被恢复。 - -- Running→Ready: - - 有更高优先级线程创建或者恢复后,会发生线程调度,此刻就绪列表中最高优先级线程变为运行态,那么原先运行的线程由运行态变为就绪态,并加入就绪列表中。 - -- Running→Exit: - - 运行中的线程运行结束,线程状态由运行态变为退出态。若未设置分离属性(PTHREAD\_CREATE\_DETACHED)的线程,运行结束后对外呈现的是Exit状态,即退出态。 - - -## 使用场景 - -线程创建后,用户态可以执行线程调度、挂起、恢复、延时等操作,同时也可以设置线程优先级和调度策略,获取线程优先级和调度策略。 - -## 接口说明 - -OpenHarmony内核系统中的线程管理模块,线程间通信为用户提供下面几种功能: - -**表 1** 线程管理模块功能 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

头文件

-

名称

-

说明

-

备注

-

pthread.h

-

pthread_attr_destroy

-

销毁线程属性对象。

-

-

-

pthread.h

-

pthread_attr_getinheritsched

-

获取线程属性对象的调度属性。

-

-

-

pthread.h

-

pthread_attr_getschedparam

-

获取线程属性对象的调度参数属性。

-

-

-

pthread.h

-

pthread_attr_getschedpolicy

-

获取线程属性对象的调度策略属性。

-

OpenHarmony:支持SCHED_FIFO 、SCHED_RR调度策略。

-

pthread.h

-

pthread_attr_getstacksize

-

获取线程属性对象的堆栈大小。

-

-

-

pthread.h

-

pthread_attr_init

-

初始化线程属性对象。

-

-

-

pthread.h

-

pthread_attr_setdetachstate

-

设置线程属性对象的分离状态。

-

-

-

pthread.h

-

pthread_attr_setinheritsched

-

设置线程属性对象的继承调度属性。

-

-

-

pthread.h

-

pthread_attr_setschedparam

-

设置线程属性对象的调度参数属性。

-

OpenHarmony:设置线程优先级的参数值越小,线程在系统中的优先级越高;设置参数值越大,优先级越低。

-

注意:需要将pthread_attr_t线程属性的inheritsched字段设置为PTHREAD_EXPLICIT_SCHED,否则设置的线程调度优先级将不会生效,系统默认设置为PTHREAD_INHERIT_SCHED。

-

pthread.h

-

pthread_attr_setschedpolicy

-

设置线程属性对象的调度策略属性。

-

OpenHarmony:支持SCHED_FIFO 、SCHED_RR调度策略。

-

pthread.h

-

pthread_attr_setstacksize

-

设置线程属性对象的堆栈大小。

-

-

-

pthread.h

-

pthread_getattr_np

-

获取已创建线程的属性。

-

-

-

pthread.h

-

pthread_cancel

-

向线程发送取消请求。

-

-

-

pthread.h

-

pthread_testcancel

-

请求交付任何未决的取请求。

-

-

-

pthread.h

-

pthread_setcanceltype

-

设置线程可取消类型。

-

-

-

pthread.h

-

pthread_setcancelstate

-

设置线程可取消状态。

-

-

-

pthread.h

-

pthread_create

-

创建一个新的线程。

-

-

-

pthread.h

-

pthread_detach

-

分离一个线程。

-

-

-

pthread.h

-

pthread_equal

-

比较两个线程ID是否相等。

-

-

-

pthread.h

-

pthread_exit

-

终止正在调用的线程。

-

-

-

pthread.h

-

pthread_getschedparam

-

获取线程的调度策略和参数。

-

OpenHarmony:支持SCHED_FIFO 、SCHED_RR调度策略。

-

pthread.h

-

pthread_join

-

等待指定的线程结束。

-

-

-

pthread.h

-

pthread_self

-

获取当前线程的ID。

-

-

-

pthread.h

-

pthread_setschedprio

-

设置线程的调度静态优先级。

-

-

-

pthread.h

-

pthread_kill

-

向线程发送信号。

-

-

-

pthread.h

-

pthread_once

-

使函数调用只能执行一次。

-

-

-

pthread.h

-

pthread_atfork

-

注册fork的处理程序。

-

-

-

pthread.h

-

pthread_cleanup_pop

-

删除位于清理处理程序堆栈顶部的例程。

-

-

-

pthread.h

-

pthread_cleanup_push

-

将例程推送到清理处理程序堆栈的顶部。

-

-

-

pthread.h

-

pthread_barrier_destroy

-

销毁屏障对象(高级实时线程)

-

-

-

pthread.h

-

pthread_barrier_init

-

初始化屏障对象(高级实时线程)

-

-

-

pthread.h

-

pthread_barrier_wait

-

屏障同步(高级实时线程)

-

-

-

pthread.h

-

pthread_barrierattr_destroy

-

销毁屏障属性对象。

-

-

-

pthread.h

-

pthread_barrierattr_init

-

初始化屏障属性对象。

-

-

-

pthread.h

-

pthread_mutex_destroy

-

销毁互斥锁。

-

-

-

pthread.h

-

pthread_mutex_init

-

初始化互斥锁。

-

-

-

pthread.h

-

pthread_mutex_lock

-

互斥锁加锁操作。

-

-

-

pthread.h

-

pthread_mutex_trylock

-

互斥锁尝试加锁操作。

-

-

-

pthread.h

-

pthread_mutex_unlock

-

互斥锁解锁操作。

-

-

-

pthread.h

-

pthread_mutexattr_destroy

-

销毁互斥锁属性对象。

-

-

-

pthread.h

-

pthread_mutexattr_gettype

-

获取互斥锁类型属性。

-

-

-

pthread.h

-

pthread_mutexattr_init

-

初始化互斥锁属性对象。

-

-

-

pthread.h

-

pthread_mutexattr_settype

-

设置互斥锁类型属性。

-

-

-

pthread.h

-

pthread_mutex_timedlock

-

使用超时锁定互斥锁。

-

-

-

pthread.h

-

pthread_rwlock_destroy

-

销毁读写锁。

-

-

-

pthread.h

-

pthread_rwlock_init

-

初始化读写锁。

-

-

-

pthread.h

-

pthread_rwlock_rdlock

-

获取读写锁读锁操作。

-

-

-

pthread.h

-

pthread_rwlock_timedrdlock

-

使用超时锁定读写锁读锁。

-

-

-

pthread.h

-

pthread_rwlock_timedwrlock

-

使用超时锁定读写锁写锁。

-

-

-

pthread.h

-

pthread_rwlock_tryrdlock

-

尝试获取读写锁读锁操作。

-

-

-

pthread.h

-

pthread_rwlock_trywrlock

-

尝试获取读写锁写锁操作。

-

-

-

pthread.h

-

pthread_rwlock_unlock

-

读写锁解锁操作。

-

-

-

pthread.h

-

pthread_rwlock_wrlock

-

获取读写锁写锁操作。

-

-

-

pthread.h

-

pthread_rwlockattr_destroy

-

销毁读写锁属性对象。

-

-

-

pthread.h

-

pthread_rwlockattr_init

-

初始化读写锁属性对象。

-

-

-

pthread.h

-

pthread_cond_broadcast

-

解除若干已被等待条件阻塞的线程。

-

-

-

pthread.h

-

pthread_cond_destroy

-

销毁条件变量。

-

-

-

pthread.h

-

pthread_cond_init

-

初始化条件变量。

-

-

-

pthread.h

-

pthread_cond_signal

-

解除被阻塞的线程。

-

-

-

pthread.h

-

pthread_cond_timedwait

-

定时等待条件。

-

-

-

pthread.h

-

pthread_cond_wait

-

等待条件。

-

-

-

semaphore.h

-

sem_destroy

-

销毁指定的无名信号量。

-

-

-

semaphore.h

-

sem_getvalue

-

获得指定信号量计数值。

-

-

-

semaphore.h

-

sem_init

-

创建并初始化一个无名信号量。

-

-

-

semaphore.h

-

sem_post

-

增加信号量计数。

-

-

-

semaphore.h

-

sem_timedwait

-

获取信号量,且有超时返回功能。

-

-

-

semaphore.h

-

sem_trywait

-

尝试获取信号量。

-

-

-

semaphore.h

-

sem_wait

-

获取信号量。

-

-

-
- diff --git a/zh-cn/device-dev/kernel/kernel-lite-small.md b/zh-cn/device-dev/kernel/kernel-lite-small.md deleted file mode 100644 index a435da97d4b79e35ab0c7e8526a5df706569f215..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite-small.md +++ /dev/null @@ -1,11 +0,0 @@ -# 小型系统内核 - -- **[基础内核](kernel-lite-small-basic.md)** - -- **[文件系统](kernel-lite-small-file.md)** - -- **[标准库](kernel-lite-small-lib.md)** - -- **[调测](kernel-lite-small-shell.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-lite.md b/zh-cn/device-dev/kernel/kernel-lite.md deleted file mode 100644 index f6fcf22c8ec9b834dde5bf84d5b6a13b26c477be..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/kernel/kernel-lite.md +++ /dev/null @@ -1,7 +0,0 @@ -# 轻量和小型系统内核 - -- **[轻量系统内核](kernel-lite-mini.md)** - -- **[小型系统内核](kernel-lite-small.md)** - - diff --git a/zh-cn/device-dev/kernel/kernel-mini-app.md b/zh-cn/device-dev/kernel/kernel-mini-app.md new file mode 100644 index 0000000000000000000000000000000000000000..26cb84385671b403861c95c04e95eeaad6917a18 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-mini-app.md @@ -0,0 +1,9 @@ +# 附录 + +- **[内核编码规范](kernel-mini-appx-code.md)** + +- **[基本数据结构](kernel-mini-appx-data.md)** + +- **[标准库支持](kernel-mini-appx-lib.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-app-code.md b/zh-cn/device-dev/kernel/kernel-mini-appx-code.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-app-code.md rename to zh-cn/device-dev/kernel/kernel-mini-appx-code.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-app-data-list.md b/zh-cn/device-dev/kernel/kernel-mini-appx-data-list.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-app-data-list.md rename to zh-cn/device-dev/kernel/kernel-mini-appx-data-list.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-app-data.md b/zh-cn/device-dev/kernel/kernel-mini-appx-data.md similarity index 52% rename from zh-cn/device-dev/kernel/kernel-lite-mini-app-data.md rename to zh-cn/device-dev/kernel/kernel-mini-appx-data.md index 78fda11861f02826b54e3ba8f97ef0f9308d413f..cfb577f51651a14f26b52e7f83b1d640bea28705 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-app-data.md +++ b/zh-cn/device-dev/kernel/kernel-mini-appx-data.md @@ -1,5 +1,5 @@ # 基本数据结构 -- **[双向链表](kernel-lite-mini-app-data-list.md)** +- **[双向链表](kernel-mini-appx-data-list.md)** diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-app-lib-cmsis.md b/zh-cn/device-dev/kernel/kernel-mini-appx-lib-cmsis.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-app-lib-cmsis.md rename to zh-cn/device-dev/kernel/kernel-mini-appx-lib-cmsis.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-app-lib-posix.md b/zh-cn/device-dev/kernel/kernel-mini-appx-lib-posix.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-app-lib-posix.md rename to zh-cn/device-dev/kernel/kernel-mini-appx-lib-posix.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-app-lib.md b/zh-cn/device-dev/kernel/kernel-mini-appx-lib.md similarity index 35% rename from zh-cn/device-dev/kernel/kernel-lite-mini-app-lib.md rename to zh-cn/device-dev/kernel/kernel-mini-appx-lib.md index b2f157ae194d8a266d79477623dd40191882f753..260d8ef24f328af32160016c954336ebb8e82370 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-app-lib.md +++ b/zh-cn/device-dev/kernel/kernel-mini-appx-lib.md @@ -1,7 +1,7 @@ # 标准库支持 -- **[CMSIS支持](kernel-lite-mini-app-lib-cmsis.md)** +- **[CMSIS支持](kernel-mini-appx-lib-cmsis.md)** -- **[POSIX支持](kernel-lite-mini-app-lib-posix.md)** +- **[POSIX支持](kernel-mini-appx-lib-posix.md)** diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-interrupt-concept.md b/zh-cn/device-dev/kernel/kernel-mini-basic-interrupt-concept.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-interrupt-concept.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-interrupt-concept.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-interrupt-guide.md b/zh-cn/device-dev/kernel/kernel-mini-basic-interrupt-guide.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-interrupt-guide.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-interrupt-guide.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-interrupt.md b/zh-cn/device-dev/kernel/kernel-mini-basic-interrupt.md similarity index 31% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-interrupt.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-interrupt.md index 3b10c0482f68e943142f978ef11aac6d5c536b4e..71593c41c48c9a2171566fb98a07bbac29780505 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-interrupt.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-interrupt.md @@ -1,7 +1,7 @@ # 中断管理 -- **[基本概念](kernel-lite-mini-basic-interrupt-concept.md)** +- **[基本概念](kernel-mini-basic-interrupt-concept.md)** -- **[开发指导](kernel-lite-mini-basic-interrupt-guide.md)** +- **[开发指导](kernel-mini-basic-interrupt-guide.md)** diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-event-basic.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-event-basic.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-event-basic.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-ipc-event-basic.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-event-guide.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-event-guide.md similarity index 72% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-event-guide.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-ipc-event-guide.md index 47befc62231ddb127477e813a4d104f0b9d2f1be..8793f8e9660e8d1f503290f1616aa3d5058a8579 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-event-guide.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-event-guide.md @@ -35,13 +35,11 @@ typedef struct tagEvent { **读事件:**如果读取的事件已存在时,会直接同步返回。其他情况会根据超时时间以及事件触发情况,来决定返回时机:等待的事件条件在超时时间耗尽之前到达,阻塞任务会被直接唤醒,否则超时时间耗尽该任务才会被唤醒。 -读事件条件满足与否取决于入参eventMask和mode,eventMask即需要关注的事件。mode是具体处理方式,分以下三种情况: +读事件条件满足与否取决于入参eventMask和mode,eventMask即需要关注的事件类型掩码。mode是具体处理方式,分以下三种情况: -LOS\_WAITMODE\_AND:表示eventMask中所有事件都发生时,才返回。 - -LOS\_WAITMODE\_OR:表示eventMask中任何事件发生时,就返回。 - -LOS\_WAITMODE\_CLR:事件读取成功后,对应读取到的事件会被清零。需要配合LOS\_WAITMODE\_AND或者LOS\_WAITMODE\_OR来使用。 +- LOS\_WAITMODE\_AND:逻辑与,基于接口传入的事件类型掩码eventMask,只有这些事件都已经发生才能读取成功,否则该任务将阻塞等待或者返回错误码。。 +- LOS\_WAITMODE\_OR:逻辑或,基于接口传入的事件类型掩码eventMask,只要这些事件中有任一种事件发生就可以读取成功,否则该任务将阻塞等待或者返回错误码。 +- LOS\_WAITMODE\_CLR:这是一种附加读取模式,需要与所有事件模式或任一事件模式结合使用(LOS\_WAITMODE\_AND | LOS\_WAITMODE\_CLR或 LOS\_WAITMODE\_OR | LOS\_WAITMODE\_CLR)。在这种模式下,当设置的所有事件模式或任一事件模式读取成功后,会自动清除事件控制块中对应的事件类型位。 **事件清零:**根据指定掩码,去对事件控制块的事件集合进行清零操作。当掩码为0时,表示将事件集合全部清零。当掩码为0xffff时,表示不清除任何事件,保持事件集合原状。 diff --git a/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-event.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-event.md new file mode 100644 index 0000000000000000000000000000000000000000..883c553ac60819ef0d534afb5dc725b657b40b8a --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-event.md @@ -0,0 +1,7 @@ +# 事件 + +- **[基本概念](kernel-mini-basic-ipc-event-guide.md)** + +- **[开发指导](kernel-mini-basic-ipc-event-basic.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-mutex-basic.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-mutex-basic.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-mutex-basic.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-ipc-mutex-basic.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-mutex-guide.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-mutex-guide.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-mutex-guide.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-ipc-mutex-guide.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-mutex.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-mutex.md similarity index 30% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-mutex.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-ipc-mutex.md index e081c4154426c896c2f722f49d9e62e7a526dcdf..e76ed0a7919c15c7628d073288ef6c9f31e61981 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-mutex.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-mutex.md @@ -1,7 +1,7 @@ # 互斥锁 -- **[基本概念](kernel-lite-mini-basic-ipc-mutex-basic.md)** +- **[基本概念](kernel-mini-basic-ipc-mutex-basic.md)** -- **[开发指导](kernel-lite-mini-basic-ipc-mutex-guide.md)** +- **[开发指导](kernel-mini-basic-ipc-mutex-guide.md)** diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-queue-basic.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-queue-basic.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-queue-basic.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-ipc-queue-basic.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-queue-guide.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-queue-guide.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-queue-guide.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-ipc-queue-guide.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-queue.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-queue.md similarity index 31% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-queue.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-ipc-queue.md index a278033961591f72c9adc5629729eb06f922b266..fa56e6878aae7a7496fc0ab7f4557256df07cf2e 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-queue.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-queue.md @@ -1,7 +1,7 @@ # 消息队列 -- **[基本概念](kernel-lite-mini-basic-ipc-queue-basic.md)** +- **[基本概念](kernel-mini-basic-ipc-queue-basic.md)** -- **[开发指导](kernel-lite-mini-basic-ipc-queue-guide.md)** +- **[开发指导](kernel-mini-basic-ipc-queue-guide.md)** diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-sem-basic.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-sem-basic.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-sem-basic.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-ipc-sem-basic.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-sem-guide.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-sem-guide.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-sem-guide.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-ipc-sem-guide.md index 81715063b36a075044c4b1e2b98c14b7a2c67c15..cb3d295cc3d57bca9097f07ec20111a3be4b7e49 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-sem-guide.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-sem-guide.md @@ -71,7 +71,7 @@ 2. ExampleSemTask2得到信号量,被调度,然后任务休眠20Tick,ExampleSemTask2延迟,ExampleSemTask1被唤醒。 3. ExampleSemTask1定时阻塞模式申请信号量,等待时间为10Tick,因信号量仍被ExampleSemTask2持有,ExampleSemTask1挂起,10Tick后仍未得到信号量,ExampleSemTask1被唤醒,试图以永久阻塞模式申请信号量,ExampleSemTask1挂起。 4. 20Tick后ExampleSemTask2唤醒, 释放信号量后,ExampleSemTask1得到信号量被调度运行,最后释放信号量。 -5. ExampleSemTask1执行完,40Tick后任务ExampleSem被唤醒,执行删除信号量。 +5. ExampleSemTask1执行完,400Tick后任务ExampleSem被唤醒,执行删除信号量。 ### 示例代码 @@ -160,7 +160,7 @@ UINT32 ExampleSem(VOID) task1.usTaskPrio = TASK_PRIO_TEST; ret = LOS_TaskCreate(&g_testTaskId01, &task1); if (ret != LOS_OK) { - printf("task1 create failed .\n"); + printf("task1 create failed.\n"); return LOS_NOK; } diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-sem.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-sem.md similarity index 30% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-sem.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-ipc-sem.md index 1b1afc6945e99589fb8185863fe4ce76b968a38d..cc9f53c413a204fc83cc570e38359b4d4ecde2b0 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-ipc-sem.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc-sem.md @@ -1,7 +1,7 @@ # 信号量 -- **[基本概念](kernel-lite-mini-basic-ipc-sem-basic.md)** +- **[基本概念](kernel-mini-basic-ipc-sem-basic.md)** -- **[开发指导](kernel-lite-mini-basic-ipc-sem-guide.md)** +- **[开发指导](kernel-mini-basic-ipc-sem-guide.md)** diff --git a/zh-cn/device-dev/kernel/kernel-mini-basic-ipc.md b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc.md new file mode 100644 index 0000000000000000000000000000000000000000..9caa565d34538fc41511aa2b1d9c111e82a6eae0 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-ipc.md @@ -0,0 +1,11 @@ +# 内核通信机制 + +- **[事件](kernel-mini-basic-ipc-event.md)** + +- **[互斥锁](kernel-mini-basic-ipc-mutex.md)** + +- **[消息队列](kernel-mini-basic-ipc-queue.md)** + +- **[信号量](kernel-mini-basic-ipc-sem.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-memory-basic.md b/zh-cn/device-dev/kernel/kernel-mini-basic-memory-basic.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-memory-basic.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-memory-basic.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-memory-dynamic.md b/zh-cn/device-dev/kernel/kernel-mini-basic-memory-dynamic.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-memory-dynamic.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-memory-dynamic.md index c9f32f97ad19a097af45e8d43620c068241e3991..44df8da3ead651e7da349eecff76942c6cb8a957 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-memory-dynamic.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-memory-dynamic.md @@ -20,8 +20,8 @@ OpenHarmony LiteOS-M动态内存在TLSF算法的基础上,对区间的划分 根据空闲内存块的大小,使用多个空闲链表来管理。根据内存空闲块大小分为两个部分:\[4, 127\]和\[27, 231\],如上图size class所示: -1. 对\[4,127\]区间的内存进行等分,如上图绿色部分所示,分为31个小区间,每个小区间对应内存块大小为4字节的倍数。每个小区间对应一个空闲内存链表和用于标记对应空闲内存链表是否为空的一个比特位,值为1时,空闲链表非空。\[4,127\]区间的31个小区间内存对应31个比特位进行标记链表是否为空。 -2. 大于127字节的空闲内存块,按照2的次幂区间大小进行空闲链表管理。总共分为24个小区间,每个小区间又等分为8个二级小区间,见上图蓝色的Size Class和Size SubClass部分。每个二级小区间对应一个空闲链表和用于标记对应空闲内存链表是否为空的一个比特位。总共24\*8=192个二级小区间,对应192个空闲链表和192个比特位进行标记链表是否为空。 +1. 对\[4,127\]区间的内存进行等分,如上图下半部分所示,分为31个小区间,每个小区间对应内存块大小为4字节的倍数。每个小区间对应一个空闲内存链表和用于标记对应空闲内存链表是否为空的一个比特位,值为1时,空闲链表非空。\[4,127\]区间的31个小区间内存对应31个比特位进行标记链表是否为空。 +2. 大于127字节的空闲内存块,按照2的次幂区间大小进行空闲链表管理。总共分为24个小区间,每个小区间又等分为8个二级小区间,见上图上半部分的Size Class和Size SubClass部分。每个二级小区间对应一个空闲链表和用于标记对应空闲内存链表是否为空的一个比特位。总共24\*8=192个二级小区间,对应192个空闲链表和192个比特位进行标记链表是否为空。 例如,当有40字节的空闲内存需要插入空闲链表时,对应小区间\[40,43\],第10个空闲链表,位图标记的第10比特位。把40字节的空闲内存挂载第10个空闲链表上,并判断是否需要更新位图标记。当需要申请40字节的内存时,根据位图标记获取存在满足申请大小的内存块的空闲链表,从空闲链表上获取空闲内存节点。如果分配的节点大于需要申请的内存大小,进行分割节点操作,剩余的节点重新挂载到相应的空闲链表上。当有580字节的空闲内存需要插入空闲链表时,对应二级小区间\[2^9,2^9+2^6\],第31+2\*8=47个空闲链表,并使用位图的第47个比特位来标记链表是否为空。把580字节的空闲内存挂载第47个空闲链表上,并判断是否需要更新位图标记。当需要申请580字节的内存时,根据位图标记获取存在满足申请大小的内存块的空闲链表,从空闲链表上获取空闲内存节点。如果分配的节点大于需要申请的内存大小,进行分割节点操作,剩余的节点重新挂载到相应的空闲链表上。如果对应的空闲链表为空,则向更大的内存区间去查询是否有满足条件的空闲链表,实际计算时,会一次性查找到满足申请大小的空闲链表。 diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-memory-static.md b/zh-cn/device-dev/kernel/kernel-mini-basic-memory-static.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-memory-static.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-memory-static.md diff --git a/zh-cn/device-dev/kernel/kernel-mini-basic-memory.md b/zh-cn/device-dev/kernel/kernel-mini-basic-memory.md new file mode 100644 index 0000000000000000000000000000000000000000..1aa6736664119db012bcd03942446f75928ca8f1 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-memory.md @@ -0,0 +1,9 @@ +# 内存管理 + +- **[基本概念](kernel-mini-basic-memory-basic.md)** + +- **[静态内存](kernel-mini-basic-memory-static.md)** + +- **[动态内存](kernel-mini-basic-memory-dynamic.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-soft-basic.md b/zh-cn/device-dev/kernel/kernel-mini-basic-soft-basic.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-soft-basic.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-soft-basic.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-soft-guide.md b/zh-cn/device-dev/kernel/kernel-mini-basic-soft-guide.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-soft-guide.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-soft-guide.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-soft.md b/zh-cn/device-dev/kernel/kernel-mini-basic-soft.md similarity index 34% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-soft.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-soft.md index 0aef7971458b34cc5b9b903ca9317026ee5c7a62..a557f1b06108a74fb093ee3fb3d6028ceff193f1 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-soft.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-soft.md @@ -1,7 +1,7 @@ # 软件定时器 -- **[基本概念](kernel-lite-mini-basic-soft-basic.md)** +- **[基本概念](kernel-mini-basic-soft-basic.md)** -- **[开发指导](kernel-lite-mini-basic-soft-guide.md)** +- **[开发指导](kernel-mini-basic-soft-guide.md)** diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-task-basic.md b/zh-cn/device-dev/kernel/kernel-mini-basic-task-basic.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-task-basic.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-task-basic.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-task-guide.md b/zh-cn/device-dev/kernel/kernel-mini-basic-task-guide.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-task-guide.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-task-guide.md index 6b42cf5b4a99c1316d0388e23795ba3794b73d86..a4b3148e293e2e38f723f983b845a6fed19dcaad 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-task-guide.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-task-guide.md @@ -155,7 +155,7 @@ OpenHarmony LiteOS-M内核的任务管理模块提供下面几种功能,接口 ## 开发流程 -以创建任务为例,讲解开发流程。 +本节介绍任务模块的典型场景开发流程: 1. 锁任务调度LOS\_TaskLock,防止高优先级任务调度。 2. 创建任务LOS\_TaskCreate。 diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-task.md b/zh-cn/device-dev/kernel/kernel-mini-basic-task.md similarity index 32% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-task.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-task.md index 8ca91b1f10c4e6e638621cde1fc9338c0667bdb5..89a03fb58f15bb726bb3d2392e9fe391bcc6ad04 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-task.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-task.md @@ -1,7 +1,7 @@ # 任务管理 -- **[基本概念](kernel-lite-mini-basic-task-basic.md)** +- **[基本概念](kernel-mini-basic-task-basic.md)** -- **[开发指导](kernel-lite-mini-basic-task-guide.md)** +- **[开发指导](kernel-mini-basic-task-guide.md)** diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-time-basic.md b/zh-cn/device-dev/kernel/kernel-mini-basic-time-basic.md similarity index 90% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-time-basic.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-time-basic.md index 73b3fd7ad4bd7ba5a22b4cd47bbbf10fab0805ce..afdc202defa37229a0317bffbebc447a80ed5019 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-time-basic.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-time-basic.md @@ -1,5 +1,7 @@ # 基本概念 +- [时间单位:](#section97172532397) + 时间管理以系统时钟为基础,给应用程序提供所有和时间有关的服务。 系统时钟是由定时器/计数器产生的输出脉冲触发中断产生的,一般定义为整数或长整数。输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为时标或者Tick。 @@ -8,7 +10,7 @@ OpenHarmony LiteOS-M内核时间管理模块提供时间转换、统计功能。 -### 时间单位: +## 时间单位: - Cycle diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-time-guide.md b/zh-cn/device-dev/kernel/kernel-mini-basic-time-guide.md similarity index 93% rename from zh-cn/device-dev/kernel/kernel-lite-mini-basic-time-guide.md rename to zh-cn/device-dev/kernel/kernel-mini-basic-time-guide.md index a0328b1c7ddea9644fa8c861fa9ac72453b72ae8..f987de078076bc128f776038d0cc6fa96c09e96f 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-basic-time-guide.md +++ b/zh-cn/device-dev/kernel/kernel-mini-basic-time-guide.md @@ -39,14 +39,12 @@ OpenHarmony LiteOS-M内核的时间管理提供下面几种功能,接口详细

OsCpuTick2MS

Cycle数目转化为毫秒,使用2个

-

UINT32类型的数值分别表示结果数值的高、低32位。

+

Cycle数目转化为毫秒,使用2个UINT32类型的数值分别表示结果数值的高、低32位。

OsCpuTick2US

Cycle数目转化为微秒,使用2个

-

UINT32类型的数值分别表示结果数值的高、低32位。

+

Cycle数目转化为微秒,使用2个UINT32类型的数值分别表示结果数值的高、低32位。

时间统计

@@ -63,7 +61,7 @@ OpenHarmony LiteOS-M内核的时间管理提供下面几种功能,接口详细

LOS_CyclePerTickGet

每个Tick多少Cycle数

+

获取每个Tick多少Cycle数

+ + + + + + + + + + + + + + + + + + +

功能分类

+

接口名

+

描述

+

动态加载功能接口

+

LOS_DynlinkInit

+

初始化动态链接器链表以及互斥锁

+

LOS_SoLoad

+

加载指定路径的共享库

+

LOS_FindSym

+

根据共享库句柄查找指定符号

+

LOS_SoUnload

+

卸载共享库句柄

+
+ +## 开发流程 + +1. 利用arm-none-eabi-gcc交叉编译器编译共享库并制作FAT或LittleFS文件系统格式镜像烧写至flash中; +2. 在target\_config.h文件中定义宏LOSCFG\_DYNLINK为1使能动态加载模块; +3. 调用LOS\_SoLoad接口加载指定路径下的共享库; +4. 调用LOS\_FindSym接口查找指定符号,获取符号地址; +5. 调用LOS\_SoUnload卸载指定共享库句柄。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>1. 利用交叉编译器编译共享库所需要的编译选项参考ELF支持规格一节。 +>2. 制作文件系统镜像之前需要对特定单板适配FAT或LittleFS文件系统。 +>3. 共享库不依赖编译器中的libc库,不支持c++。 +>4. 共享库只能依赖内核提供的接口,不能依赖其他共享库。 + +## 编程实例 + +实例以cortex-m4单板为例。 + +1. 共享库示例代码及编译 + + 示例代码主要测试全局符号间的调用功能以及对内核接口maloc、free、memset接口的调用功能。 + + ``` + #include + #include + + int g_param = 10; + + int callee(int a, int b) + { + char *addr = malloc(g_param); + if (addr == NULL) { + return 0; + } + + memset(addr, '1', g_param); + + free(addr); + return a + b + g_param; + } + + int caller(int a, int b) + { + return callee(a, b); + } + ``` + + ``` + $ arm-none-eabi-gcc -fPIC -shared -mcpu=cortex-m4 -nostdlib -nostartfiles -z max-page-size=4 -o test.so test.c + ``` + +2. 导出共享库中使用到的malloc、free、memset符号,下述代码单独编写成一个.c文件,参与OS编译即可。 + + ``` + #include "stdlib.h" + #include "string.h" + + SYM_EXPORT(malloc); + SYM_EXPORT(free); + SYM_EXPORT(memset); + ``` + +3. 确定内核的编译环境,在对应编译器的编译链接脚本中添加如下语句,保证符号表信息在编译链接的时候输出到指定的段。 + + 在IAR编译器.icf链接脚本中添加如下语句: + + ``` + keep {section .TABLE.START}; + keep {section .sym.*}; + keep {section .table.end}; + define block SYMBOL_TABLE with fixed order + { + section .TABLE.START, + section .sym.*, + section .table.end + }; + place in ROM_region {readonly, block SYMBOL_TABLE}; + ``` + + 在gcc编译器的.ld链接脚本中添加如下语句: + + ``` + __sym_table_start = .; + KEEP(*( SORT (.sym.*))); + __sym_table_end = .; + ``` + +4. 共享库加载链接、执行与卸载 + + 示例代码主要测试LOS\_SoLoad、LOS\_FindSym、LOS\_SoUnload接口的功能是否正常以及通过LOS\_FindSym查找到的符号的调用是否正常。 + + ``` + #include "los_dynlink.h" + + VOID DynlinkTest(VOID) + { + VOID *handle = NULL; + INT32 (*func)(INT32, INT32) = NULL; + CHAR *symbolName = "caller"; + CHAR *dsoName = "/lib/test.so"; + INT32 ret; + + handle = (VOID *)LOS_SoLoad(dsoName, NULL); + if (handle == NULL) { + printf("Failed to load so\n"); + return; + } + + func = (INT32 (*)(INT32, INT32))LOS_FindSym(handle, symbolName); + if (func == NULL) { + printf("Failed to find symbol\n"); + LOS_SoUnload(handle); + return; + } + + ret = func(1, 1); + if (ret != 12) { + printf("Failed to execute function\n"); + LOS_SoUnload(handle); + return; + } + + ret = LOS_SoUnload(handle); + if (ret != 0) { + printf("Failed to unload so\n"); + } + + + printf("Success!\n"); + } + ``` + +5. 结果验证 + + ``` + Success! + ``` + + +>![](../public_sys-resources/icon-note.gif) **说明:** +>用例中文件系统路径为/lib/test.so; +>可以创建一个任务,在任务中调用DynlinkTest接口进行测试; + diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-m.md b/zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading.md similarity index 95% rename from zh-cn/device-dev/kernel/kernel-lite-mini-m.md rename to zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading.md index 3548ae04b61c2ea2c20c5f024694568f9099ea74..8454dad63d713a591a9fdc2e72c6f4c2d3cf3321 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-m.md +++ b/zh-cn/device-dev/kernel/kernel-mini-extend-dynamic-loading.md @@ -51,7 +51,7 @@ CPU体系架构分为通用架构定义和特定架构定义两层,通用架
-LiteOS-M已经支持ARM Cortex-M3、ARM Cortex-M4、ARM Cortex-M7、ARM Cortex-M33、RISC-V等主流架构,如果需要扩展CPU体系架构,请参考[芯片架构适配点](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/porting/%E7%A7%BB%E6%A4%8D%E6%A6%82%E8%BF%B0.md#%E8%8A%AF%E7%89%87%E6%9E%B6%E6%9E%84%E9%80%82%E9%85%8D%E7%82%B9)。 +LiteOS-M已经支持ARM Cortex-M3、ARM Cortex-M4、ARM Cortex-M7、ARM Cortex-M33、RISC-V等主流架构,如果需要扩展CPU体系架构,请参考[芯片架构适配点](../porting/porting-chip-kernel-overview.md#section137431650339)。 ### 运行机制 diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-fat.md b/zh-cn/device-dev/kernel/kernel-mini-extend-file-fat.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-fat.md rename to zh-cn/device-dev/kernel/kernel-mini-extend-file-fat.md index d96f14f3435c61968447f9b3cbfb62ccd0fce5c7..620dbcf9e1d0ffc711355ea3af50d7bbd04ad206 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-fat.md +++ b/zh-cn/device-dev/kernel/kernel-mini-extend-file-fat.md @@ -4,7 +4,8 @@ - [开发指导](#section1149072811148) - [驱动适配](#section19174939191414) - [开发流程](#section131211626151513) - - [编程实例](#section206071303163) + +- [编程实例](#section1133718619459) - [实例描述](#section45337345313) - [示例代码](#section119813171539) - [结果验证](#section7987101232311) @@ -53,7 +54,7 @@ FAT文件系统的使用需要底层MMC相关驱动的支持。在一个带MMC > - 在fatfs\_fdisk操作前,需要该设备中的所有分区均已umount。 > - fatfs\_fdisk与fatfs\_format会造成设备数据丢失,请谨慎使用。 -### 编程实例 +## 编程实例 ### 实例描述 diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-lit.md b/zh-cn/device-dev/kernel/kernel-mini-extend-file-lit.md similarity index 34% rename from zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-lit.md rename to zh-cn/device-dev/kernel/kernel-mini-extend-file-lit.md index b0ffac3d6795718298342eb939196b45636ad6d0..b11f2782f7bb2f8abd0927d0cbb6839dda59c07d 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-lit.md +++ b/zh-cn/device-dev/kernel/kernel-mini-extend-file-lit.md @@ -1,7 +1,7 @@ # LittleFS -- **[基本概念](kernel-lite-mini-extend-file-lit-basic.md)** +- **[基本概念](kernel-mini-extend-file-littlefs-basic.md)** -- **[开发指导](kernel-lite-mini-extend-file-lit-guide.md)** +- **[开发指导](kernel-mini-extend-file-littlefs-guide.md)** diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-lit-basic.md b/zh-cn/device-dev/kernel/kernel-mini-extend-file-littlefs-basic.md similarity index 52% rename from zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-lit-basic.md rename to zh-cn/device-dev/kernel/kernel-mini-extend-file-littlefs-basic.md index 9924c312fa2e9d460b9a776db2fe86843a8eba68..49a6f6cb8d5e6b80f1677fb1e808c2dad3f18ed9 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-lit-basic.md +++ b/zh-cn/device-dev/kernel/kernel-mini-extend-file-littlefs-basic.md @@ -1,4 +1,6 @@ # 基本概念 -LittleFS是一个小型的的Flash文件系统,它结合日志结构(log-structured)文件系统和COW(copy-on-write)文件系统的思想,以日志结构存储元数据,以COW结构存储数据。这种特殊的存储方式,使LittleFS具有强大的掉电恢复能力(power-loss resilience)。分配COW数据块时LittleFS采用了名为统计损耗均衡的动态损耗均衡算法,使Flash设备的寿命得到有效保障。同时LittleFS针对资源紧缺的小型设备进行设计,具有极其有限的ROM和RAM占用,并且所有RAM的使用都通过一个可配置的固定大小缓冲区进行分配,不会随文件系统的扩大占据更多的系统资源。 + +LittleFS是一个小型的的Flash文件系统,它结合日志结构(log-structured)文件系统和COW(copy-on-write)文件系统的思想,以日志结构存储元数据,以COW结构存储数据。这种特殊的存储方式,使LittleFS具有强大的掉电恢复能力(power-loss resilience\)。分配COW数据块时LittleFS采用了名为统计损耗均衡的动态损耗均衡算法,使Flash设备的寿命得到有效保障。同时LittleFS针对资源紧缺的小型设备进行设计,具有极其有限的ROM和RAM占用,并且所有RAM的使用都通过一个可配置的固定大小缓冲区进行分配,不会随文件系统的扩大占据更多的系统资源。 当在一个资源非常紧缺的小型设备上,寻找一个具有掉电恢复能力并支持损耗均衡的Flash文件系统时,LittleFS是一个比较好的选择。 + diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-lit-guide.md b/zh-cn/device-dev/kernel/kernel-mini-extend-file-littlefs-guide.md similarity index 95% rename from zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-lit-guide.md rename to zh-cn/device-dev/kernel/kernel-mini-extend-file-littlefs-guide.md index 093017bd9f2a62d710a94ffd76afe964b448762b..b9c74551fc4fe48082f856b1b6119ccc41ce8050 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-file-lit-guide.md +++ b/zh-cn/device-dev/kernel/kernel-mini-extend-file-littlefs-guide.md @@ -1,5 +1,7 @@ # 开发指导 +- [示例代码](#section1034515054620) + 移植LittleFS到新硬件设备上,需要申明lfs\_config: ``` @@ -31,7 +33,7 @@ block\_size 每个擦除块的字节数,可以比物理擦除单元大,但 block\_count 可以被擦除的块数量,这取决于块设备的容量及擦除块的大小。 -### 示例代码 +## 示例代码 代码实现如下: diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-file.md b/zh-cn/device-dev/kernel/kernel-mini-extend-file.md similarity index 99% rename from zh-cn/device-dev/kernel/kernel-lite-mini-extend-file.md rename to zh-cn/device-dev/kernel/kernel-mini-extend-file.md index c7ee5fabfdca2b92b4cba55758bf298edb554a72..8b0d2d84c77d065c1491d91eaebd66685cc5085f 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-file.md +++ b/zh-cn/device-dev/kernel/kernel-mini-extend-file.md @@ -197,8 +197,8 @@
-- **[FAT](kernel-lite-mini-extend-file-fat.md)** +- **[FAT](kernel-mini-extend-file-fat.md)** -- **[LittleFS](kernel-lite-mini-extend-file-lit.md)** +- **[LittleFS](kernel-mini-extend-file-lit.md)** diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-support.md b/zh-cn/device-dev/kernel/kernel-mini-extend-support.md similarity index 97% rename from zh-cn/device-dev/kernel/kernel-lite-mini-extend-support.md rename to zh-cn/device-dev/kernel/kernel-mini-extend-support.md index c0b1ed529142bba08729d4cc769f47554b4136ec..c20fed127b546877dad46fd081c80ad3f0503772 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-extend-support.md +++ b/zh-cn/device-dev/kernel/kernel-mini-extend-support.md @@ -1,8 +1,7 @@ # C++支持 - [基本概念](#section11374125415814) - - [运行机制](#section125251720195) - +- [运行机制](#section189351319134418) - [开发指导](#section166302407911) - [接口说明](#section1881825119919) - [开发流程](#section76371145108) @@ -13,7 +12,7 @@ C++作为目前使用最广泛的编程语言之一,支持类、封装、重载等特性,是在C语言基础上开发的一种面向对象的编程语言。 -### 运行机制 +## 运行机制 C++代码的识别主要由编译器支持,系统主要对全局对象进行构造函数调用,进行初始化操作。 diff --git a/zh-cn/device-dev/kernel/kernel-mini-extend.md b/zh-cn/device-dev/kernel/kernel-mini-extend.md new file mode 100644 index 0000000000000000000000000000000000000000..6a22158c70247458dd7bc90592af4691562cdaa7 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-mini-extend.md @@ -0,0 +1,11 @@ +# 扩展组件 + +- **[C++支持](kernel-mini-extend-support.md)** + +- **[CPU占用率](kernel-mini-extend-cpup.md)** + +- **[动态加载](kernel-mini-extend-dynamic-loading-0.md)** + +- **[文件系统](kernel-mini-extend-file.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-inner-debug-cet.md b/zh-cn/device-dev/kernel/kernel-mini-inner-debug-cet.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-inner-debug-cet.md rename to zh-cn/device-dev/kernel/kernel-mini-inner-debug-cet.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-inner-debug-det.md b/zh-cn/device-dev/kernel/kernel-mini-inner-debug-det.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-inner-debug-det.md rename to zh-cn/device-dev/kernel/kernel-mini-inner-debug-det.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-inner-debug-mes.md b/zh-cn/device-dev/kernel/kernel-mini-inner-debug-mes.md similarity index 88% rename from zh-cn/device-dev/kernel/kernel-lite-mini-inner-debug-mes.md rename to zh-cn/device-dev/kernel/kernel-mini-inner-debug-mes.md index 0dd4f930425a171933e8dafe2f690804111ff257..4115b8c99d9a3399ffd1cc0b508d7a394c1cffd3 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-inner-debug-mes.md +++ b/zh-cn/device-dev/kernel/kernel-mini-inner-debug-mes.md @@ -15,9 +15,9 @@ - 内存水线:即内存池的最大使用量,每次申请和释放时,都会更新水线值,实际业务可根据该值,优化内存池大小; -- 碎片率:衡量内存池的碎片化程度,碎片率高表现为内存池剩余内存很多,但是最大空闲内存块很小,可以用公式(fragment=100-最大空闲内存块大小/剩余内存大小)来度量; +- 碎片率:衡量内存池的碎片化程度,碎片率高表现为内存池剩余内存很多,但是最大空闲内存块很小,可以用公式(fragment=100-100\*最大空闲内存块大小/剩余内存大小)来度量; -- 其他参数:通过调用接口(详见[内存管理](kernel-lite-mini-basic-memory.md)章节接口说明),扫描内存池的节点信息,统计出相关信息。 +- 其他参数:通过调用接口(详见[内存管理](kernel-mini-basic-memory-basic.md)章节接口说明),扫描内存池的节点信息,统计出相关信息。 ## 功能配置 @@ -44,7 +44,7 @@ typedef struct { - 内存水线获取:调用LOS\_MemInfoGet接口,第1个参数是内存池首地址,第2个参数是LOS\_MEM\_POOL\_STATUS类型的句柄,其中字段usageWaterLine即水线值。 -- 内存碎片率计算:同样调用LOS\_MemInfoGet接口,可以获取内存池的剩余内存大小和最大空闲内存块大小,然后根据公式(fragment=100-最大空闲内存块大小/剩余内存大小)得出此时的动态内存池碎片率。 +- 内存碎片率计算:同样调用LOS\_MemInfoGet接口,可以获取内存池的剩余内存大小和最大空闲内存块大小,然后根据公式(fragment=100-100\*最大空闲内存块大小/剩余内存大小)得出此时的动态内存池碎片率。 ### 编程实例 @@ -70,6 +70,9 @@ typedef struct { void MemInfoTaskFunc(void) { LOS_MEM_POOL_STATUS poolStatus = {0}; + + /* pool为要统计信息的内存地址,此处以OS_SYS_MEM_ADDR为例 */ + void *pool = OS_SYS_MEM_ADDR; LOS_MemInfoGet(pool, &poolStatus); /* 算出内存池当前的碎片率百分比 */ unsigned char fragment = 100 - poolStatus.maxFreeNodeSize * 100 / poolStatus.totalFreeSize; diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-inner-debug.md b/zh-cn/device-dev/kernel/kernel-mini-inner-debug.md similarity index 70% rename from zh-cn/device-dev/kernel/kernel-lite-mini-inner-debug.md rename to zh-cn/device-dev/kernel/kernel-mini-inner-debug.md index 0c4474cd15eb7b42235cdcc139be9a8f6dccb6b7..28be53ac467ce72697f19f53d80b047c93f71b6f 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-mini-inner-debug.md +++ b/zh-cn/device-dev/kernel/kernel-mini-inner-debug.md @@ -2,10 +2,10 @@ 内存调测方法旨在辅助定位动态内存相关问题,提供了基础的动态内存池信息统计手段,向用户呈现内存池水线、碎片率等信息;提供了内存泄漏检测手段,方便用户准确定位存在内存泄漏的代码行,也可以辅助分析系统各个模块内存的使用情况;提供了踩内存检测手段,可以辅助定位越界踩内存的场景。 -- **[内存信息统计](kernel-lite-mini-inner-debug-mes.md)** +- **[内存信息统计](kernel-mini-inner-debug-mes.md)** -- **[内存泄漏检测](kernel-lite-mini-inner-debug-det.md)** +- **[内存泄漏检测](kernel-mini-inner-debug-det.md)** -- **[踩内存检测](kernel-lite-mini-inner-debug-cet.md)** +- **[踩内存检测](kernel-mini-inner-debug-cet.md)** diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-inner-exception.md b/zh-cn/device-dev/kernel/kernel-mini-inner-exception.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-inner-exception.md rename to zh-cn/device-dev/kernel/kernel-mini-inner-exception.md diff --git a/zh-cn/device-dev/kernel/kernel-lite-mini-inner-trace.md b/zh-cn/device-dev/kernel/kernel-mini-inner-trace.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-lite-mini-inner-trace.md rename to zh-cn/device-dev/kernel/kernel-mini-inner-trace.md diff --git a/zh-cn/device-dev/kernel/kernel-mini-inner.md b/zh-cn/device-dev/kernel/kernel-mini-inner.md new file mode 100644 index 0000000000000000000000000000000000000000..35d40c10507e42d16056992049733dc82c7ad342 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-mini-inner.md @@ -0,0 +1,9 @@ +# 内核调测 + +- **[内存调测](kernel-mini-inner-debug.md)** + +- **[异常调测](kernel-mini-inner-exception.md)** + +- **[Trace调测](kernel-mini-inner-trace.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-mini.md b/zh-cn/device-dev/kernel/kernel-mini.md new file mode 100644 index 0000000000000000000000000000000000000000..a3bed6acc9d2a0efa35a5c07098eda5c49fc98cd --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-mini.md @@ -0,0 +1,13 @@ +# 轻量系统内核 + +- **[内核概述](kernel-mini-extend-dynamic-loading.md)** + +- **[基础内核](kernel-mini-basic.md)** + +- **[扩展组件](kernel-mini-extend.md)** + +- **[内核调测](kernel-mini-inner.md)** + +- **[附录](kernel-mini-app.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-atom.md b/zh-cn/device-dev/kernel/kernel-small-basic-atom.md new file mode 100644 index 0000000000000000000000000000000000000000..720d3668b34f75f38460e23479ddcc6d3b687f33 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-atom.md @@ -0,0 +1,288 @@ +# 原子操作 + +- [基本概念](#section1792118384594) +- [运行机制](#section1786635117596) +- [开发指导](#section2911115308) + - [接口说明](#section335914201010) + - [开发流程](#section12207371304) + - [编程实例](#section8538651511) + + +## 基本概念 + +在支持多任务的操作系统中,修改一块内存区域的数据需要“读取-修改-写入”三个步骤。然而同一内存区域的数据可能同时被多个任务访问,如果在修改数据的过程中被其他任务打断,就会造成该操作的执行结果无法预知。 + +使用开关中断的方法固然可以保证多任务执行结果符合预期,但是显然这种方法会影响系统性能。 + +ARMv6架构引入了LDREX和STREX指令,以支持对共享存储器更缜密的非阻塞同步。由此实现的原子操作能确保对同一数据的“读取-修改-写入”操作在它的执行期间不会被打断,即操作的原子性。 + +## 运行机制 + +OpenHarmony系统通过对ARMv6架构中的LDREX和STREX进行封装,向用户提供了一套原子性的操作接口。 + +- LDREX Rx, \[Ry\] + + 读取内存中的值,并标记对该段内存的独占访问: + + - 读取寄存器Ry指向的4字节内存数据,保存到Rx寄存器中。 + - 对Ry指向的内存区域添加独占访问标记。 + +- STREX Rf, Rx, \[Ry\] + + 检查内存是否有独占访问标记,如果有则更新内存值并清空标记,否则不更新内存: + + - 有独占访问标记 + - 将寄存器Rx中的值更新到寄存器Ry指向的内存。 + - 标志寄存器Rf置为0。 + + - 没有独占访问标记 + - 不更新内存。 + - 标志寄存器Rf置为1。 + + +- 判断标志寄存器 + - 标志寄存器为0时,退出循环,原子操作结束。 + - 标志寄存器为1时,继续循环,重新进行原子操作。 + + +## 开发指导 + +### 接口说明 + +OpenHarmony LiteOS-A内核的原子操作模块提供下面几种功能,接口详细信息可以查看API参考。 + +**表 1** 原子操作接口说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

+

LOS_AtomicRead

+

读取32bit原子数据

+

LOS_Atomic64Read

+

读取64bit原子数据

+

+

LOS_AtomicSet

+

设置32bit原子数据

+

LOS_Atomic64Set

+

设置64bit原子数据

+

+

LOS_AtomicAdd

+

对32bit原子数据做加法

+

LOS_Atomic64Add

+

对64bit原子数据做加法

+

LOS_AtomicInc

+

对32bit原子数据做加1

+

LOS_Atomic64Inc

+

对64bit原子数据做加1

+

LOS_AtomicIncRet

+

对32bit原子数据做加1并返回

+

LOS_Atomic64IncRet

+

对64bit原子数据做加1并返回

+

+

LOS_AtomicSub

+

对32bit原子数据做减法

+

LOS_Atomic64Sub

+

对64bit原子数据做减法

+

LOS_AtomicDec

+

对32bit原子数据做减1

+

LOS_Atomic64Dec

+

对64bit原子数据做减1

+

LOS_AtomicDecRet

+

对32bit原子数据做减1并返回

+

LOS_Atomic64DecRet

+

对64bit原子数据做减1并返回

+

交换

+

LOS_AtomicXchgByte

+

交换8bit内存数据

+

LOS_AtomicXchg16bits

+

交换16bit内存数据

+

LOS_AtomicXchg32bits

+

交换32bit内存数据

+

LOS_AtomicXchg64bits

+

交换64bit内存数据

+

先比较后交换

+

LOS_AtomicCmpXchgByte

+

比较相同后交换8bit内存数据

+

LOS_AtomicCmpXchg16bits

+

比较相同后交换16bit内存数据

+

LOS_AtomicCmpXchg32bits

+

比较相同后交换32bit内存数据

+

LOS_AtomicCmpXchg64bits

+

比较相同后交换64bit内存数据

+
+ +### 开发流程 + +有多个任务对同一个内存数据进行加减或交换等操作时,使用原子操作保证结果的可预知性。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>原子操作接口仅支持整型数据。 + +### 编程实例 + +**实例描述** + +调用原子操作相关接口,观察结果: + +1. 创建两个任务 + - 任务一用LOS\_AtomicInc对全局变量加100次。 + - 任务二用LOS\_AtomicDec对全局变量减100次。 + +2. 子任务结束后在主任务中打印全局变量的值。 + +**示例代码** + +示例代码如下: + +``` +#include "los_hwi.h" +#include "los_atomic.h" +#include "los_task.h" + +UINT32 g_testTaskId01; +UINT32 g_testTaskId02; +Atomic g_sum; +Atomic g_count; + +UINT32 Example_Atomic01(VOID) +{ + int i = 0; + for(i = 0; i < 100; ++i) { + LOS_AtomicInc(&g_sum); + } + + LOS_AtomicInc(&g_count); + return LOS_OK; +} + +UINT32 Example_Atomic02(VOID) +{ + int i = 0; + for(i = 0; i < 100; ++i) { + LOS_AtomicDec(&g_sum); + } + + LOS_AtomicInc(&g_count); + return LOS_OK; +} + +UINT32 Example_AtomicTaskEntry(VOID) +{ + TSK_INIT_PARAM_S stTask1={0}; + stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_Atomic01; + stTask1.pcName = "TestAtomicTsk1"; + stTask1.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; + stTask1.usTaskPrio = 4; + stTask1.uwResved = LOS_TASK_STATUS_DETACHED; + + TSK_INIT_PARAM_S stTask2={0}; + stTask2.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_Atomic02; + stTask2.pcName = "TestAtomicTsk2"; + stTask2.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; + stTask2.usTaskPrio = 4; + stTask2.uwResved = LOS_TASK_STATUS_DETACHED; + + LOS_TaskLock(); + LOS_TaskCreate(&g_testTaskId01, &stTask1); + LOS_TaskCreate(&g_testTaskId02, &stTask2); + LOS_TaskUnlock(); + + while(LOS_AtomicRead(&g_count) != 2); + PRINTK("g_sum = %d\n", g_sum); + + return LOS_OK; +} +``` + +**结果验证** + +``` +g_sum = 0 +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-breakdeal.md b/zh-cn/device-dev/kernel/kernel-small-basic-breakdeal.md new file mode 100644 index 0000000000000000000000000000000000000000..e74f7d866ea9a1c49981ecb2f0e35ec24914f8da --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-breakdeal.md @@ -0,0 +1,147 @@ +# 中断及异常处理 + +- [基本概念](#section439816296117) +- [运行机制](#section2792838318) +- [开发指导](#section15415165510110) + - [接口说明](#section57441612024) + - [开发流程](#section64332181221) + - [编程实例](#section204698276478) + - [结果验证](#section1466144215476) + + +## 基本概念 + +中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。即在程序运行过程中,出现了一个必须由CPU立即处理的事务。此时,CPU暂时中止当前程序的执行转而处理这个事务,这个过程就叫做中断。通过中断机制,可以使CPU避免把大量时间耗费在等待、查询外设状态的操作上,大大提高系统实时性以及执行效率。 + +异常处理是操作系统对运行期间发生的异常情况(芯片硬件异常)进行处理的一系列动作,例如虚拟内存缺页异常、打印异常发生时函数的调用栈信息、CPU现场信息、任务的堆栈情况等。 + +## 运行机制 + +外设可以在没有CPU介入的情况下完成一定的工作,但某些情况下也需要CPU为其执行一定的工作。通过中断机制,在外设不需要CPU介入时,CPU可以执行其它任务,而当外设需要CPU时,产生一个中断信号,该信号连接至中断控制器。中断控制器是一方面接收其它外设中断引脚的输入,另一方面它会发出中断信号给CPU。可以通过对中断控制器编程来打开和关闭中断源、设置中断源的优先级和触发方式。常用的中断控制器有VIC(Vector Interrupt Controller)和GIC(General Interrupt Controller)。在ARM Cortex-A7中使用的中断控制器是GIC。CPU收到中断控制器发送的中断信号后,中断当前任务来响应中断请求。 + +异常处理就是可以打断CPU正常运行流程的一些事情,如未定义指令异常、试图修改只读的数据异常、不对齐的地址访问异常等。当异常发生时,CPU暂停当前的程序,先处理异常事件,然后再继续执行被异常打断的程序。 + +以ARMv7-a架构为例,中断和异常处理的入口为中断向量表,中断向量表包含各个中断和异常处理的入口函数。 + +**图 1** 中断向量表 + + +![](figure/zh-cn_image_0000001173449871.png) + +## 开发指导 + +### 接口说明 + +异常处理为内部机制,不对外提供接口,中断模块提供对外接口如下: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

创建和删除中断

+

LOS_HwiCreate

+

中断创建,注册中断号、中断触发模式、中断优先级、中断处理程序。中断被触发时,会调用该中断处理程序

+

LOS_HwiDelete

+

删除中断

+

打开和关闭所有中断

+

LOS_IntUnLock

+

打开当前处理器所有中断响应

+

LOS_IntLock

+

关闭当前处理器所有中断响应

+

LOS_IntRestore

+

恢复到使用LOS_IntLock关闭所有中断之前的状态

+

获取系统支持的最大中断数

+

LOS_GetSystemHwiMaximum

+

获取系统支持的最大中断数

+
+ +### 开发流程 + +1. 调用中断创建接口LOS\_HwiCreate创建中断。 +2. 调用LOS\_HwiDelete接口删除指定中断,此接口根据实际情况使用,判断是否需要删除中断。 + +### 编程实例 + +本实例实现如下功能: + +1. 创建中断。 +2. 删除中断。 + +代码实现如下,演示如何创建中断和删除中断,当指定的中断号HWI\_NUM\_TEST产生中断时,会调用中断处理函数: + +``` +#include "los_hwi.h" +/*中断处理函数*/ +STATIC VOID HwiUsrIrq(VOID) +{ + printf("in the func HwiUsrIrq \n"); +} + +static UINT32 Example_Interrupt(VOID) +{ + UINT32 ret; + HWI_HANDLE_T hwiNum = 7; + HWI_PRIOR_T hwiPrio = 3; + HWI_MODE_T mode = 0; + HWI_ARG_T arg = 0; + + /*创建中断*/ + ret = LOS_HwiCreate(hwiNum, hwiPrio, mode, (HWI_PROC_FUNC)HwiUsrIrq, (HwiIrqParam *)arg); + if(ret == LOS_OK){ + printf("Hwi create success!\n"); + } else { + printf("Hwi create failed!\n"); + return LOS_NOK; + } + + /* 延时50个Ticks, 当有硬件中断发生时,会调用函数HwiUsrIrq*/ + LOS_TaskDelay(50); + + /*删除中断*/ + ret = LOS_HwiDelete(hwiNum, (HwiIrqParam *)arg); + if(ret == LOS_OK){ + printf("Hwi delete success!\n"); + } else { + printf("Hwi delete failed!\n"); + return LOS_NOK; + } + return LOS_OK; +} +``` + +### 结果验证 + +编译运行得到的结果为: + +``` +Hwi create success! +Hwi delete success! +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-inner-head.md b/zh-cn/device-dev/kernel/kernel-small-basic-inner-head.md new file mode 100644 index 0000000000000000000000000000000000000000..77d20e49bdfebdc993899369a87a20b78010ed41 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-inner-head.md @@ -0,0 +1,249 @@ +# 堆内存管理 + +- [基本概念](#section449414395916) +- [运行机制](#section465085575911) +- [开发指导](#section577019272015) + - [使用场景](#section326917198583) + - [接口说明](#section1032331584) + - [开发流程](#section07271773592) + - [编程实例](#section84931234145913) + - [结果验证](#section165233233917) + + +## 基本概念 + +内存管理模块管理系统的内存资源,它是操作系统的核心模块之一,主要包括内存的初始化、分配以及释放。OpenHarmony LiteOS-A的堆内存管理提供内存初始化、分配、释放等功能。在系统运行过程中,堆内存管理模块通过对内存的申请/释放来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。 + +## 运行机制 + +堆内存管理,即在内存资源充足的情况下,根据用户需求,从系统配置的一块比较大的连续内存(内存池,也是堆内存)中分配任意大小的内存块。当用户不需要该内存块时,又可以释放回系统供下一次使用。与静态内存相比,动态内存管理的优点是按需分配,缺点是内存池中容易出现碎片。OpenHarmony LiteOS-A堆内存在TLSF算法的基础上,对区间的划分进行了优化,获得更优的性能,降低了碎片率。动态内存核心算法框图如下: + +**图 1** 动态内存核心算法 +![](figure/动态内存核心算法-18.png "动态内存核心算法-18") + +根据空闲内存块的大小,使用多个空闲链表来管理。根据内存空闲块大小分为两个部分:\[4, 127\]和\[27, 231\],如上图size class所示: + +1. 对\[4,127\]区间的内存进行等分,如上图下半部分所示,分为31个小区间,每个小区间对应内存块大小为4字节的倍数。每个小区间对应一个空闲内存链表和用于标记对应空闲内存链表是否为空的一个比特位,值为1时,空闲链表非空。\[4,127\]区间的31个小区间内存对应31个比特位进行标记链表是否为空。 +2. 大于127字节的空闲内存块,按照2的次幂区间大小进行空闲链表管理。总共分为24个小区间,每个小区间又等分为8个二级小区间,见上图上半部分的Size Class和Size SubClass部分。每个二级小区间对应一个空闲链表和用于标记对应空闲内存链表是否为空的一个比特位。总共24\*8=192个二级小区间,对应192个空闲链表和192个比特位进行标记链表是否为空。 + +例如,当有40字节的空闲内存需要插入空闲链表时,对应小区间\[40,43\],第10个空闲链表,位图标记的第10比特位。把40字节的空闲内存挂载第10个空闲链表上,并判断是否需要更新位图标记。当需要申请40字节的内存时,根据位图标记获取存在满足申请大小的内存块的空闲链表,从空闲链表上获取空闲内存节点。如果分配的节点大于需要申请的内存大小,进行分割节点操作,剩余的节点重新挂载到相应的空闲链表上。当有580字节的空闲内存需要插入空闲链表时,对应二级小区间\[2^9,2^9+2^6\],第31+2\*8=47个空闲链表,并使用位图的第47个比特位来标记链表是否为空。把580字节的空闲内存挂载第47个空闲链表上,并判断是否需要更新位图标记。当需要申请580字节的内存时,根据位图标记获取存在满足申请大小的内存块的空闲链表,从空闲链表上获取空闲内存节点。如果分配的节点大于需要申请的内存大小,进行分割节点操作,剩余的节点重新挂载到相应的空闲链表上。如果对应的空闲链表为空,则向更大的内存区间去查询是否有满足条件的空闲链表,实际计算时,会一次性查找到满足申请大小的空闲链表。 + +内存管理结构如下图所示: + +**图 2** 动态内存管理结构图 +![](figure/动态内存管理结构图-19.png "动态内存管理结构图-19") + +- 内存池池头部分 + + 内存池池头部分包含内存池信息、位图标记数组和空闲链表数组。内存池信息包含内存池起始地址及堆区域总大小,内存池属性。位图标记数组有7个32位无符号整数组成,每个比特位标记对应的空闲链表是否挂载空闲内存块节点。空闲内存链表包含223个空闲内存头节点信息,每个空闲内存头节点信息维护内存节点头和空闲链表中的前驱、后继空闲内存节点。 + +- 内存池节点部分 + + 包含3种类型节点:未使用空闲内存节点,已使用内存节点和尾节点。每个内存节点维护一个前序指针,指向内存池中上一个内存节点,还维护内存节点的大小和使用标记。空闲内存节点和已使用内存节点后面的内存区域是数据域,尾节点没有数据域。 + + +## 开发指导 + +### 使用场景 + +堆内存管理的主要工作是动态分配并管理用户申请到的内存区间,主要用于用户需要使用大小不等的内存块的场景,当用户需要使用内存时,可以通过操作系统的动态内存申请函数索取指定大小的内存块。一旦使用完毕,通过内存释放函数释放所占用内存,使之可以重复使用。 + +### 接口说明 + +OpenHarmony LiteOS-A的堆内存管理主要为用户提供以下功能,接口详细信息可以查看API参考。 + +**表 1** 堆内存管理接口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

初始化和删除内存池

+

LOS_MemInit

+

初始化一块指定的动态内存池,大小为size

+

LOS_MemDeInit

+

删除指定内存池,仅打开LOSCFG_MEM_MUL_POOL时有效

+

申请、释放动态内存

+

LOS_MemAlloc

+

从指定动态内存池中申请size长度的内存

+

LOS_MemFree

+

释放从指定动态内存中申请的内存

+

LOS_MemRealloc

+

按size大小重新分配内存块,并将原内存块内容拷贝到新内存块。如果新内存块申请成功,则释放原内存块

+

LOS_MemAllocAlign

+

从指定动态内存池中申请长度为size且地址按boundary字节对齐的内存

+

获取内存池信息

+

LOS_MemPoolSizeGet

+

获取指定动态内存池的总大小

+

LOS_MemTotalUsedGet

+

获取指定动态内存池的总使用量大小

+

LOS_MemInfoGet

+

获取指定内存池的内存结构信息,包括空闲内存大小、已使用内存大小、空闲内存块数量、已使用的内存块数量、最大的空闲内存块大小

+

LOS_MemPoolList

+

打印系统中已初始化的所有内存池,包括内存池的起始地址、内存池大小、空闲内存总大小、已使用内存总大小、最大的空闲内存块大小、空闲内存块数量、已使用的内存块数量。仅打开LOSCFG_MEM_MUL_POOL时有效

+

获取内存块信息

+

LOS_MemFreeNodeShow

+

打印指定内存池的空闲内存块的大小及数量

+

检查指定内存池的完整性

+

LOS_MemIntegrityCheck

+

对指定内存池做完整性检查,仅打开LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK时有效

+
+ +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 由于动态内存管理需要管理控制块数据结构来管理内存,这些数据结构会额外消耗内存,故实际用户可使用内存总量小于配置项OS\_SYS\_MEM\_SIZE的大小。 +>- 对齐分配内存接口LOS\_MemAllocAlign/LOS\_MemMallocAlign因为要进行地址对齐,可能会额外消耗部分内存,故存在一些遗失内存,当系统释放该对齐内存时,同时回收由于对齐导致的遗失内存。 + +### 开发流程 + +本节介绍使用动态内存的典型场景开发流程。 + +1. 初始化LOS\_MemInit。 + + 初始一个内存池后生成一个内存池控制头、尾节点EndNode,剩余的内存被标记为FreeNode内存节点。注:EndNode作为内存池末尾的节点,size为0。 + + +1. 申请任意大小的动态内存LOS\_MemAlloc。 + + 判断动态内存池中是否存在大于申请量大小的空闲内存块空间,若存在,则划出一块内存块,以指针形式返回,若不存在,返回NULL。如果空闲内存块大于申请量,需要对内存块进行分割,剩余的部分作为空闲内存块挂载到空闲内存链表上。 + + +1. 释放动态内存LOS\_MemFree。 + + 回收内存块,供下一次使用。调用LOS\_MemFree释放内存块,则会回收内存块,并且将其标记为FreeNode。在回收内存块时,相邻的FreeNode会自动合并。 + + +### 编程实例 + +本实例执行以下步骤: + +1. 初始化一个动态内存池。 +2. 从动态内存池中申请一个内存块。 +3. 在内存块中存放一个数据。 +4. 打印出内存块中的数据。 +5. 释放该内存块。 + +示例代码如下: + +``` +#include "los_memory.h" + +#define TEST_POOL_SIZE (2*1024*1024) +__attribute__((aligned(4))) UINT8 g_testPool[TEST_POOL_SIZE]; + +VOID Example_DynMem(VOID) +{ + UINT32 *mem = NULL; + UINT32 ret; + + /*初始化内存池*/ + ret = LOS_MemInit(g_testPool, TEST_POOL_SIZE); + if (LOS_OK == ret) { + printf("Mem init success!\n"); + } else { + printf("Mem init failed!\n"); + return; + } + + /*分配内存*/ + mem = (UINT32 *)LOS_MemAlloc(g_testPool, 4); + if (NULL == mem) { + printf("Mem alloc failed!\n"); + return; + } + printf("Mem alloc success!\n"); + + /*赋值*/ + *mem = 828; + printf("*mem = %d\n", *mem); + + /*释放内存*/ + ret = LOS_MemFree(g_testPool, mem); + if (LOS_OK == ret) { + printf("Mem free success!\n"); + } else { + printf("Mem free failed!\n"); + } + + return; +} +UINT32 ExampleDynMemEntry(VOID) +{ + UINT32 ret; + TSK_INIT_PARAM_S initParam = {0}; + initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_DynMem; + initParam.usTaskPrio = 10; + initParam.pcName = "Example_DynMem"; + initParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; + initParam.uwResved = LOS_TASK_STATUS_DETACHED; + + /* 创建高优先级任务,由于锁任务调度,任务创建成功后不会马上执行 */ + ret = LOS_TaskCreate(&g_taskHiID, &initParam); + if (ret != LOS_OK) { + LOS_TaskUnlock(); + PRINTK("Example_DynMem create Failed! ret=%d\n", ret); + return LOS_NOK; + } + PRINTK("Example_DynMem create Success!\n"); + while(1){}; + return LOS_OK; +} +``` + +### 结果验证 + +输出结果如下: + +``` +Mem init success! +Mem alloc success! +*mem = 828 +Mem free success! +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-inner-physical.md b/zh-cn/device-dev/kernel/kernel-small-basic-inner-physical.md new file mode 100644 index 0000000000000000000000000000000000000000..382bddc08c60020e1550985236ab841edd46a12c --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-inner-physical.md @@ -0,0 +1,228 @@ +# 物理内存管理 + +- [基本概念](#section210891719217) +- [运行机制](#section111355315213) +- [开发指导](#section393116496217) + - [接口说明](#section13210155619214) + - [开发流程](#section178441091231) + - [编程实例](#section1258174015319) + - [结果验证](#section515091342819) + + +## 基本概念 + +物理内存是计算机上最重要的资源之一,指的是实际的内存设备提供的、可以通过CPU总线直接进行寻址的内存空间,其主要作用是为操作系统及程序提供临时存储空间。LiteOS-A内核管理物理内存是通过分页实现的,除了内核堆占用的一部分内存外,其余可用内存均以4k为单位划分成页帧,内存分配和内存回收便是以页帧为单位进行操作。内核采用伙伴算法管理空闲页面,可以降低一定的内存碎片率,提高内存分配和释放的效率,但是一个很小的块往往也会阻塞一个大块的合并,导致不能分配较大的内存块。 + +## 运行机制 + +如下图所示,LiteOS-A内核的物理内存使用分布视图,主要由内核镜像、内核堆及物理页组成。内核堆部分见堆内存管理一节。 + +**图 1** 物理内存使用分布图 +![](figure/物理内存使用分布图.png "物理内存使用分布图") + +伙伴算法把所有空闲页帧分成9个内存块组,每组中内存块包含2的幂次方个页帧,例如:第0组的内存块包含2的0次方个页帧,即1个页帧;第8组的内存块包含2的8次方个页帧,即256个页帧。相同大小的内存块挂在同一个链表上进行管理。 + +- 申请内存 + + 系统申请12k内存,即3个页帧时,9个内存块组中索引为3的链表挂着一块大小为8个页帧的内存块满足要求,分配出12k内存后还剩余20k内存,即5个页帧,将5个页帧分成2的幂次方之和,即4跟1,尝试查找伙伴进行合并。4个页帧的内存块没有伙伴则直接插到索引为2的链表上,继续查找1个页帧的内存块是否有伙伴,索引为0的链表上此时有1个,如果两个内存块地址连续则进行合并,并将内存块挂到索引为1的链表上,否则不做处理。 + + **图 2** 内存申请示意图 + ![](figure/内存申请示意图.png "内存申请示意图") + + +- 释放内存 + + 系统释放12k内存,即3个页帧,将3个页帧分成2的幂次方之和,即2跟1,尝试查找伙伴进行合并,索引为1的链表上有1个内存块,若地址连续则合并,并将合并后的内存块挂到索引为2的链表上,索引为0的链表上此时也有1个,如果地址连续则进行合并,并将合并后的内存块挂到索引为1的链表上,此时继续判断是否有伙伴,重复上述操作。 + + **图 3** 内存释放示意图 + ![](figure/内存释放示意图.png "内存释放示意图") + + +## 开发指导 + +### 接口说明 + +**表 1** 物理内存管理模块接口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

申请物理内存

+

LOS_PhysPageAlloc

+

申请一个物理页

+

LOS_PhysPagesAlloc

+

申请物理页并挂在对应的链表上

+

LOS_PhysPagesAllocContiguous

+

申请多页地址连续的物理内存

+

释放物理内存

+

LOS_PhysPageFree

+

释放一个物理页

+

LOS_PhysPagesFree

+

释放挂在链表上的物理页

+

LOS_PhysPagesFreeContiguous

+

释放多页地址连续的物理内存

+

查询地址

+

LOS_VmPageGet

+

根据物理地址获取其对应的物理页结构体指针

+

LOS_PaddrToKVaddr

+

根据物理地址获取其对应的内核虚拟地址

+
+ +### 开发流程 + +内存申请时根据需要调用相关接口,小内存申请建议使用堆内存申请相关接口,4k及以上内存申请可以使用上述物理内存相关接口。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 物理内存申请相关接口需要在OsSysMemInit接口完成初始化之后再使用; +>- 内存申请的基本单位是页帧,即4k; +>- 物理内存申请时,有地址连续要求的使用LOS\_PhysPagesAllocContiguous接口,无地址连续的要求尽量使用LOS\_PhysPagesAlloc接口,将连续的大块内存留给有需要的模块使用。 + +### 编程实例 + +编程示例主要是调用申请、释放接口对内存进行操作,包括申请一个页以及多个页的示例。 + +``` +#include "los_vm_phys.h" + +#define PHYS_PAGE_SIZE 0x4000 + +// 申请一个页 +VOID OsPhysPagesAllocTest3(VOID) +{ + PADDR_T newPaddr; + VOID *kvaddr = NULL; + LosVmPage *newPage = NULL; + + newPage = LOS_PhysPageAlloc(); + if (newPage == NULL) { + printf("LOS_PhysPageAlloc fail\n"); + return; + } + printf("LOS_PhysPageAlloc success\n"); + + newPaddr = VM_PAGE_TO_PHYS(newPage); + kvaddr = OsVmPageToVaddr(newPage); + + // Handle the physical memory + + // Free the physical memory + LOS_PhysPageFree(newPage); +} + +// 申请多个页,不要求连续 +VOID OsPhysPagesAllocTest2(VOID) +{ + UINT32 sizeCount; + UINT32 count; + UINT32 size = PHYS_PAGE_SIZE; + LosVmPage *vmPageArray[PHYS_PAGE_SIZE >> PAGE_SHIFT] = { NULL }; + UINT32 i = 0; + LosVmPage *vmPage = NULL; + PADDR_T pa; + + size = LOS_Align(size, PAGE_SIZE); + if (size == 0) { + return; + } + sizeCount = size >> PAGE_SHIFT; + + LOS_DL_LIST_HEAD(pageList); + + count = LOS_PhysPagesAlloc(sizeCount, &pageList); + if (count < sizeCount) { + printf("failed to allocate enough pages (ask %zu, got %zu)\n", sizeCount, count); + goto ERROR; + } + printf("LOS_PhysPagesAlloc success\n"); + while ((vmPage = LOS_ListRemoveHeadType(&pageList, LosVmPage, node))) { + pa = vmPage->physAddr; + vmPageArray[i++] = vmPage; + // Handle the physical memory + } + + // Free the physical memory + for (i = 0; i < sizeCount; ++i) { + LOS_PhysPageFree(vmPageArray[i]); + } + + return; + +ERROR: + (VOID)LOS_PhysPagesFree(&pageList); +} + +// 申请多个连续页 +VOID OsPhysPagesAllocTest1(VOID) +{ + VOID *ptr = NULL; + LosVmPage *page = NULL; + UINT32 size = PHYS_PAGE_SIZE; + + ptr = LOS_PhysPagesAllocContiguous(ROUNDUP(size, PAGE_SIZE) >> PAGE_SHIFT); + if (ptr == NULL) { + printf("LOS_PhysPagesAllocContiguous fail\n"); + return; + } + + printf("LOS_PhysPagesAllocContiguous success\n"); + + // Handle the physical memory + + // Free the physical memory + page = OsVmVaddrToPage((VOID *)ptr); + LOS_PhysPagesFreeContiguous((VOID *)ptr, size >> PAGE_SHIFT); +} + +UINT32 ExamplePhyMemCaseEntry(VOID) +{ + OsPhysPagesAllocTest1(); + OsPhysPagesAllocTest2(); + OsPhysPagesAllocTest3(); + return LOS_OK; +} +``` + +### 结果验证 + +编译运行得到的结果为: + +``` +LOS_PhysPagesAllocContiguous success +LOS_PhysPagesAlloc success +LOS_PhysPageAlloc success +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-inner-reflect.md b/zh-cn/device-dev/kernel/kernel-small-basic-inner-reflect.md new file mode 100644 index 0000000000000000000000000000000000000000..25229b427b8590d66a4dafd4321935607019c441 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-inner-reflect.md @@ -0,0 +1,88 @@ +# 虚实映射 + +- [基本概念](#section9108144913615) +- [运行机制](#section12392621871) +- [开发指导](#section10264102013713) + - [接口说明](#section195320251578) + - [开发流程](#section152774210712) + + +## 基本概念 + +虚实映射是指系统通过内存管理单元(MMU,Memory Management Unit)将进程空间的虚拟地址与实际的物理地址做映射,并指定相应的访问权限、缓存属性等。程序执行时,CPU访问的是虚拟内存,通过MMU页表条目找到对应的物理内存,并做相应的代码执行或数据读写操作。MMU的映射由页表(Page Table)来描述,其中保存虚拟地址和物理地址的映射关系以及访问权限等。每个进程在创建的时候都会创建一个页表,页表由一个个页表条目(Page Table Entry, PTE)构成,每个页表条目描述虚拟地址区间与物理地址区间的映射关系。MMU中有一块页表缓存,称为快表(TLB, Translation Lookaside Buffers),做地址转换时,MMU首先在TLB中查找,如果找到对应的页表条目可直接进行转换,提高了查询效率。CPU访问内存或外设的示意图如下: + +**图 1** CPU访问内存或外设的示意图 +![](figure/CPU访问内存或外设的示意图.png "CPU访问内存或外设的示意图") + +## 运行机制 + +虚实映射其实就是一个建立页表的过程。MMU有多级页表,LiteOS-A内核采用二级页表描述进程空间。每个一级页表条目描述符占用4个字节,可表示1MiB的内存空间的映射关系,即1GiB用户空间(LiteOS-A内核中用户空间占用1GiB)的虚拟内存空间需要1024个。系统创建用户进程时,在内存中申请一块4KiB大小的内存块作为一级页表的存储区域,二级页表根据当前进程的需要做动态的内存申请。 + +- 用户程序加载启动时,会将代码段、数据段映射进虚拟内存空间(详细可参考动态加载与链接一节),此时并没有物理页做实际的映射; +- 程序执行时,如下图粗箭头所示,CPU访问虚拟地址,通过MMU查找是否有对应的物理内存,若该虚拟地址无对应的物理地址则触发缺页异常,内核申请物理内存并将虚实映射关系及对应的属性配置信息写进页表,并把页表条目缓存至TLB,接着CPU可直接通过转换关系访问实际的物理内存; +- 若CPU访问已缓存至TLB的页表条目,无需再访问保存在内存中的页表,可加快查找速度。 + +**图 2** CPU访问内存示意图 +![](figure/CPU访问内存示意图.png "CPU访问内存示意图") + +## 开发指导 + +### 接口说明 + +**表 1** 虚实映射模块接口 + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

MMU相关操作

+

LOS_ArchMmuQuery

+

获取进程空间虚拟地址对应的物理地址以及映射属性。

+

LOS_ArchMmuMap

+

映射进程空间虚拟地址区间与物理地址区间。

+

LOS_ArchMmuUnmap

+

解除进程空间虚拟地址区间与物理地址区间的映射关系。

+

LOS_ArchMmuChangeProt

+

修改进程空间虚拟地址区间的映射属性。

+

LOS_ArchMmuMove

+

将进程空间一个虚拟地址区间的映射关系转移至另一块未使用的虚拟地址区间重新做映射。

+
+ +### 开发流程 + +虚实映射相关接口的使用: + +1. 通过LOS\_ArchMmuMap映射一块物理内存。 +2. 对映射的地址区间做相关操作: + - 通过LOS\_ArchMmuQuery可以查询相应虚拟地址区间映射的物理地址区间及映射属性; + + - 通过LOS\_ArchMmuChangeProt修改映射属性; + - 通过LOS\_ArchMmuMove做虚拟地址区间的重映射。 + +3. 通过LOS\_ArchMmuUnmap解除映射关系。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>上述接口的使用都是基于MMU初始化完成以及相关进程页表的建立,MMU在系统启动阶段已完成初始化,进程创建的时候会建立页表,开发者无需介入操作。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-inner-virtual.md b/zh-cn/device-dev/kernel/kernel-small-basic-inner-virtual.md new file mode 100644 index 0000000000000000000000000000000000000000..8d2281f3972b2aec9b266f3ba94fff3f62a89c83 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-inner-virtual.md @@ -0,0 +1,369 @@ +# 虚拟内存管理 + +- [基本概念](#section650193717411) +- [运行机制](#section072885512412) +- [开发指导](#section20956116050) + - [接口说明](#section166137221657) + - [开发流程](#section8752103914513) + + +## 基本概念 + +虚拟内存管理是计算机系统管理内存的一种技术。每个进程都有连续的虚拟地址空间,虚拟地址空间的大小由CPU的位数决定,32位的硬件平台可以提供的最大的寻址空间为0-4G。整个4G空间分成两部分,LiteOS-A内核占据3G的高地址空间,1G的低地址空间留给进程使用。各个进程空间的虚拟地址空间是独立的,代码、数据互不影响。 + +系统将虚拟内存分割为称为虚拟页的内存块,大小一般为4k或64k,LiteOS-A内核默认的页的大小是4k,根据需要可以对MMU(Memory Management Units)进行配置。虚拟内存管理操作的最小单位就是一个页,LiteOS-A内核中一个虚拟地址区间region包含地址连续的多个虚拟页,也可只有一个页。同样,物理内存也会按照页大小进行分割,分割后的每个内存块称为页帧。虚拟地址空间划分:内核态占高地址3G\(0x40000000 \~ 0xFFFFFFFF\),用户态占低地址1G\(0x01000000 \~ 0x3F000000\),具体见下表,详细可以查看或配置los\_vm\_zone.h。 + +**表 1** 内核态地址规划: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Zone名称

+

起始地址

+

结束地址

+

用途

+

属性

+

DMA zone

+

0x40000000

+

0x43FFFFFF

+

USB、网络等dma内存访问

+

Uncache

+

Normal zone

+

0x80000000

+

0x83FFFFFF

+

内核代码、数据段和堆内存和栈

+

Cache

+

high mem zone

+

0x84000000

+

0x8BFFFFFF

+

连续虚拟内存分配,物理内存不连续

+

Cache

+
+ +**表 2** 用户态虚地址规划: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Zone名称

+

起始地址

+

结束地址

+

用途

+

属性

+

代码段

+

0x0200000

+

0x09FFFFFF

+

用户态代码段地址空间

+

Cache

+

+

0x0FC00000(起始地址随机)

+

0x17BFFFFF

+

用户态堆地址空间

+

Cache

+

+

0x37000000

+

0x3EFFFFFF(起始地址随机)

+

用户态栈空间地址

+

Cache

+

共享库

+

0x1F800000(起始地址随机)

+

0x277FFFFF

+

用户态共享库加载地址空间,包括mmap

+

Cache

+
+ +## 运行机制 + +虚拟内存管理中,虚拟地址空间是连续的,但是其映射的物理内存并不一定是连续的,如下图所示。可执行程序加载运行,CPU访问虚拟地址空间的代码或数据时存在两种情况: + +- CPU访问的虚拟地址所在的页,如V0,已经与具体的物理页P0做映射,CPU通过找到进程对应的页表条目(详见虚实映射一节),根据页表条目中的物理地址信息访问物理内存中的内容并返回。 +- CPU访问的虚拟地址所在的页,如V2,没有与具体的物理页做映射,系统会触发缺页异常,系统申请一个物理页,并把相应的信息拷贝到物理页中,并且把物理页的起始地址更新到页表条目中。此时CPU重新执行访问虚拟内存的指令便能够访问到具体的代码或数据。 + +**图 1** 内存映射示意图 +![](figure/内存映射示意图.png "内存映射示意图") + +## 开发指导 + +### 接口说明 + +**表 3** 虚拟内存管理模块接口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

获取进程空间系列接口

+

LOS_CurrSpaceGet

+

获取当前进程空间结构体指针

+

LOS_SpaceGet

+

获取虚拟地址对应的进程空间结构体指针

+

LOS_GetKVmSpace

+

获取内核进程空间结构体指针

+

LOS_GetVmallocSpace

+

获取vmalloc空间结构体指针

+

LOS_GetVmSpaceList

+

获取进程空间链表指针

+

虚拟地址区间region相关的操作

+

LOS_RegionFind

+

根据起始地址在进程空间内查找是否存在虚拟地址区间

+

LOS_RegionRangeFind

+

根据地址区间在进程空间内查找是否存在虚拟地址区间

+

LOS_IsRegionFileValid

+

判断虚拟地址区间region是否与文件关联映射

+

LOS_RegionAlloc

+

申请空闲的虚拟地址区间

+

LOS_RegionFree

+

释放进程空间内特定的region

+

LOS_RegionEndAddr

+

获取指定地址区间region的结束地址

+

LOS_RegionSize

+

获取region的大小

+

LOS_IsRegionTypeFile

+

判断是否为文件内存映射

+

LOS_IsRegionPermUserReadOnly

+

判断地址区间是否是用户空间只读属性

+

LOS_IsRegionFlagPrivateOnly

+

判断地址区间是否是具有私有属性

+

LOS_SetRegionTypeFile

+

设置文件内存映射属性

+

LOS_IsRegionTypeDev

+

判断是否为设备内存映射

+

LOS_SetRegionTypeDev

+

设置设备内存映射属性

+

LOS_IsRegionTypeAnon

+

判断是否为匿名映射

+

LOS_SetRegionTypeAnon

+

设置匿名映射属性

+

地址校验

+

LOS_IsUserAddress

+

判断地址是否在用户态空间

+

LOS_IsUserAddressRange

+

判断地址区间是否在用户态空间

+

LOS_IsKernelAddress

+

判断地址是否在内核空间

+

LOS_IsKernelAddressRange

+

判断地址区间是否在内核空间

+

LOS_IsRangeInSpace

+

判断地址区间是否在进程空间内

+

vmalloc操作

+

LOS_VMalloc

+

vmalloc申请内存

+

LOS_VFree

+

vmalloc释放内存

+

LOS_IsVmallocAddress

+

判断地址是否是通过vmalloc申请的

+

内存申请系列接口

+

LOS_KernelMalloc

+

申请小于16k的内存则通过堆内存池获取,否则申请多个连续物理页

+

LOS_KernelMallocAlign

+

申请具有对齐属性的内存,申请规则:申请小于16k的内存则通过堆内存池获取,否则申请多个连续物理页

+

LOS_KernelFree

+

释放内核堆内存

+

LOS_KernelRealloc

+

重新分配内核内存空间

+

其他

+

LOS_PaddrQuery

+

根据虚拟地址获取对应的物理地址

+

LOS_VmSpaceFree

+

释放进程空间,包括虚拟内存区间、页表等信息

+

LOS_VmSpaceReserve

+

在进程空间中预留一块内存空间

+

LOS_VaddrToPaddrMmap

+

将指定长度的物理地址区间与虚拟地址区间做映射,需提前申请物理地址区间

+

LOS_UserSpaceVmAlloc

+

根据地址、大小、权限等信息在用户进程空间内申请地址区间region

+
+ +### 开发流程 + +虚拟内存相关接口的使用: + +1. 根据进程空间获取的系列接口可以得到进程空间结构体,进而可以读取结构体相应信息。 +2. 对虚拟地址区间做相关操作: + - 通过LOS\_RegionAlloc申请虚拟地址区间; + + - 通过LOS\_RegionFind、LOS\_RegionRangeFind可以查询是否存在相应的地址区间; + - 通过LOS\_RegionFree释放虚拟地址区间。 + +3. vmalloc接口及内存申请系列接口可以在内核中根据需要申请内存。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>内存申请系列接口申请的内存要求物理内存是连续的,当系统内存无法满足大块连续内存的申请条件时会申请失败,一般适用于小块内存的申请;vmalloc相关接口申请的内存可以获得不连续的物理内存,但其是以页(当前系统一个页为4096字节)为单位的,当需要申请以页为整数倍的内存时可以通过vmalloc申请,例如文件系统中文件读取需要较大的缓存,便可以通过vmalloc相关接口申请内存。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-inner.md b/zh-cn/device-dev/kernel/kernel-small-basic-inner.md new file mode 100644 index 0000000000000000000000000000000000000000..e87bd724f62b26d823d6dce02dca15d264e62ca9 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-inner.md @@ -0,0 +1,11 @@ +# 内存管理 + +- **[堆内存管理](kernel-small-basic-inner-head.md)** + +- **[物理内存管理](kernel-small-basic-inner-physical.md)** + +- **[虚拟内存管理](kernel-small-basic-inner-virtual.md)** + +- **[虚实映射](kernel-small-basic-inner-reflect.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-manage-debug.md b/zh-cn/device-dev/kernel/kernel-small-basic-manage-debug.md new file mode 100644 index 0000000000000000000000000000000000000000..9f9c08d6d26a014a2e656470b20822de1d51486c --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-manage-debug.md @@ -0,0 +1,63 @@ +# 调度器 + +- [基本概念](#section123882355719) +- [运行机制](#section143015396572) +- [开发指导](#section10604192145816) + - [接口说明](#section207985910582) + - [开发流程](#section1015110331584) + + +## 基本概念 + +OpenHarmony LiteOS-A内核 了高优先级优先+同优先级时间片轮转的抢占式调度机制,系统从启动开始基于real time的时间轴向前运行,使得该调度算法具有很好的实时性。 + +OpenHarmony 的调度算法将tickless机制天然嵌入到调度算法中,一方面使得系统具有更低的功耗,另一方面也使得tick中断按需响应,减少无用的tick中断响应,进一步提高系统的实时性。 + +OpenHarmony 的进程调度策略支持SCHED\_RR,线程调度策略支持SCHED\_RR和SCHED\_FIFO。 + +OpenHarmony 调度的最小单元为线程。 + +## 运行机制 + +OpenHarmony 采用进程优先级队列+线程优先级队列的方式,进程优先级范围为0-31,共有32个进程优先级桶队列,每个桶队列对应一个线程优先级桶队列;线程优先级范围也为0-31,一个线程优先级桶队列也有32个优先级队列。 + +**图 1** 调度优先级桶队列示意图 + + +![](figure/zh-cn_image_0000001127520662.png) + +OpenHarmony 在系统启动内核初始化之后开始调度,运行过程中创建的进程或线程会被加入到调度队列,系统根据进程和线程的优先级及线程的时间片消耗情况选择最优的线程进行调度运行,线程一旦调度到就会从调度队列上删除,线程在运行过程中发生阻塞,会被加入到对应的阻塞队列中并触发一次调度,调度其它线程运行。如果调度队列上没有可以调度的线程,则系统就会选择KIdle进程的线程进行调度运行。 + +**图 2** 调度流程示意图 + + +![](figure/zh-cn_image_0000001176974089.png) + +## 开发指导 + +### 接口说明 + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

触发系统调度

+

LOS_Schedule

+

触发系统调度

+
+ +### 开发流程 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>系统启动初始化阶段,不允许触发调度。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-manage-process.md b/zh-cn/device-dev/kernel/kernel-small-basic-manage-process.md new file mode 100644 index 0000000000000000000000000000000000000000..c2e4e581a4abdf327805cb6a93bb24c4006448f7 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-manage-process.md @@ -0,0 +1,178 @@ +# 进程 + +- [基本概念](#section89346055119) +- [运行机制](#section174514474512) +- [开发指导](#section159637182521) + - [接口说明](#section1153124135212) + - [开发流程](#section1533674618526) + + +## 基本概念 + +进程是系统资源管理的最小单元。OpenHarmony LiteOS-A内核提供的进程模块主要用于实现用户态进程的隔离,内核态被视为一个进程空间,不存在其它进程\(KIdle除外,KIdle进程是系统提供的空闲进程,和KProcess共享一个进程空间)。 + +- OpenHarmony 的进程模块主要为用户提供多个进程,实现了进程之间的切换和通信,帮助用户管理业务程序流程。 +- OpenHarmony 的进程采用抢占式调度机制,采用高优先级优先+同优先级时间片轮转的调度算法。 +- OpenHarmony 的进程一共有32个优先级\(0-31\),用户进程可配置的优先级有22个\(10-31\),最高优先级为10,最低优先级为31。 +- 高优先级的进程可抢占低优先级进程,低优先级进程必须在高优先级进程阻塞或结束后才能得到调度。 +- 每一个用户态进程均拥有自己独立的进程空间,相互之间不可见,实现进程间隔离。 +- 用户态根进程init由内核态创建,其它用户态子进程均由init进程fork而来。 + +**进程状态说明:** + +- 初始化(Init):进程正在被创建。 + +- 就绪(Ready):进程在就绪列表中,等待CPU调度。 +- 运行(Running):进程正在运行。 +- 阻塞(Pending):进程被阻塞挂起。本进程内所有的线程均被阻塞时,进程被阻塞挂起。 +- 僵尸态(Zombies):进程运行结束,等待父进程回收其控制块资源。 + +**图 1** 进程状态迁移示意图 +![](figure/进程状态迁移示意图.png "进程状态迁移示意图") + +**进程状态迁移说明:** + +- Init→Ready: + + 进程创建或fork时,拿到该进程控制块后进入Init状态,处于进程初始化阶段,当进程初始化完成将进程插入调度队列,此时进程进入就绪状态。 + +- Ready→Running: + + 进程创建后进入就绪态,发生进程切换时,就绪列表中最高优先级的进程被执行,从而进入运行态。若此时该进程中已无其它线程处于就绪态,则进程从就绪列表删除,只处于运行态;若此时该进程中还有其它线程处于就绪态,则该进程依旧在就绪队列,此时进程的就绪态和运行态共存,但对外呈现的进程状态为运行态。 + +- Running→Pending: + + 进程在最后一个线程转为阻塞态时, 进程内所有的线程均处于阻塞态,此时进程同步进入阻塞态,然后发生进程切换。 + +- Pending→Ready: + + 阻塞进程内的任意线程恢复就绪态时,进程被加入到就绪队列,同步转为就绪态。 + +- Ready→Pending: + + 进程内的最后一个就绪态线程转为阻塞态时,进程从就绪列表中删除,进程由就绪态转为阻塞态。 + +- Running→Ready: + + 进程由运行态转为就绪态的情况有以下两种: + + 1. 有更高优先级的进程创建或者恢复后,会发生进程调度,此刻就绪列表中最高优先级进程变为运行态,那么原先运行的进程由运行态变为就绪态。 + 2. 若进程的调度策略为LOS\_SCHED\_RR,且存在同一优先级的另一个进程处于就绪态,则该进程的时间片消耗光之后,该进程由运行态转为就绪态,另一个同优先级的进程由就绪态转为运行态。 + +- Running→Zombies: + + 当进程的主线程或所有线程运行结束后,进程由运行态转为僵尸态,等待父进程回收资源。 + + +## 运行机制 + +OpenHarmony 提供的进程模块主要用于实现用户态进程的隔离,支持用户态进程的创建、退出、资源回收、设置/获取调度参数、获取进程ID、设置/获取进程组ID等功能。 + +用户态进程通过fork父进程而来,fork进程时会将父进程的进程虚拟内存空间clone到子进程,子进程实际运行时通过写时复制机制将父进程的内容按需复制到子进程的虚拟内存空间。 + +进程只是资源管理单元,实际运行是由进程内的各个线程完成的,不同进程内的线程相互切换时会进行进程空间的切换。 + +**图 2** 进程管理示意图 + + +![](figure/zh-cn_image_0000001127519136.png) + +## 开发指导 + +### 接口说明 + +**表 1** 进程管理模块接口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

进程调度参数控制

+

LOS_GetProcessScheduler

+

获取指定进程的调度策略

+

LOS_SetProcessScheduler

+

设置指定进程的调度参数,包括优先级和调度策略

+

LOS_GetProcessPriority

+

获取指定进程的优先级

+

LOS_SetProcessPriority

+

设置指定进程的优先级

+

等待回收子进程

+

LOS_Wait

+

等待子进程结束并回收子进程

+

进程组

+

LOS_GetProcessGroupID

+

获取指定进程的进程组ID

+

LOS_GetCurrProcessGroupID

+

获取当前进程的进程组ID

+

获取进程ID

+

LOS_GetCurrProcessID

+

获取当前进程的进程ID

+

用户及用户组

+

LOS_GetUserID

+

获取当前进程的用户ID

+

LOS_GetGroupID

+

获取当前进程的用户组ID

+

LOS_CheckInGroups

+

检查指定用户组ID是否在当前进程的用户组内

+

系统支持的最大进程数

+

LOS_GetSystemProcessMaximum

+

获取系统支持的最大进程数目

+
+ +### 开发流程 + +不支持内核态进程创建,内核态不涉及进程相关开发。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- idle线程的数量跟随CPU核心数,每个CPU均有一个相应的idle线程。 +>- 不支持创建除KProcess和KIdle进程之外的其它内核态进程。 +>- 用户态进程通过系统调用进入内核态后创建的线程属于KProcess, 不属于当前用户态进程。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-manage-thread.md b/zh-cn/device-dev/kernel/kernel-small-basic-manage-thread.md new file mode 100644 index 0000000000000000000000000000000000000000..0bb10cbfae91c353c956e8ec98e0c642543fb84e --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-manage-thread.md @@ -0,0 +1,331 @@ +# 线程 + +- [基本概念](#section138411646175417) +- [运行机制](#section1381918945512) +- [开发指导](#section10649727135519) + - [接口说明](#section78333315555) + - [开发流程](#section16229657115514) + - [编程实例](#section2809723165612) + + +## 基本概念 + +从系统的角度看,线程是竞争系统资源的最小运行单元。线程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它线程运行。 + +OpenHarmony 内核中同优先级进程内的线程统一调度、运行。 + +OpenHarmony 内核中的线程采用抢占式调度机制,同时支持时间片轮转调度和FIFO调度方式。 + +OpenHarmony 内核的线程一共有32个优先级\(0-31\),最高优先级为0,最低优先级为31。 + +当前进程内, 高优先级的线程可抢占低优先级线程,低优先级线程必须在高优先级线程阻塞或结束后才能得到调度。 + +**线程状态说明**: + +- 初始化(Init):线程正在被创建。 + +- 就绪(Ready):线程在就绪列表中,等待CPU调度。 +- 运行(Running):线程正在运行。 +- 阻塞(Blocked):线程被阻塞挂起。Blocked状态包括:pending\(因为锁、事件、信号量等阻塞\)、suspended(主动pend)、delay\(延时阻塞\)、pendtime\(因为锁、事件、信号量时间等超时等待\)。 +- 退出(Exit):线程运行结束,等待父线程回收其控制块资源。 + +**图 1** 线程状态迁移示意图 +![](figure/线程状态迁移示意图.png "线程状态迁移示意图") + +**线程状态迁移说明:** + +- Init→Ready: + + 线程创建拿到控制块后为初始化阶段\(Init状态\),当线程初始化完成将线程插入调度队列,此时线程进入就绪状态。 + +- Ready→Running: + + 线程创建后进入就绪态,发生线程切换时,就绪列表中最高优先级的线程被执行,从而进入运行态,此刻该线程从就绪列表中删除。 + +- Running→Blocked: + + 正在运行的线程发生阻塞(挂起、延时、读信号量等)时,线程状态由运行态变成阻塞态,然后发生线程切换,运行就绪列表中剩余最高优先级线程。 + +- Blocked→Ready : + + 阻塞的线程被恢复后(线程恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的线程会被加入就绪列表,从而由阻塞态变成就绪态。 + +- Ready→Blocked: + + 线程也有可能在就绪态时被阻塞(挂起),此时线程状态会由就绪态转变为阻塞态,该线程从就绪列表中删除,不会参与线程调度,直到该线程被恢复。 + +- Running→Ready: + + 有更高优先级线程创建或者恢复后,会发生线程调度,此刻就绪列表中最高优先级线程变为运行态,那么原先运行的线程由运行态变为就绪态,并加入就绪列表中。 + +- Running→Exit: + + 运行中的线程运行结束,线程状态由运行态变为退出态。若为设置了分离属性(LOS\_TASK\_STATUS\_DETACHED)的线程,运行结束后将直接销毁。 + + +## 运行机制 + +OpenHarmony 线程管理模块提供线程创建、线程延时、线程挂起和线程恢复、锁线程调度和解锁线程调度、根据ID查询线程控制块信息功能。 + +用户创建线程时,系统会将线程栈进行初始化,预置上下文。此外,系统还会将“线程入口函数”地址放在相应位置。这样在线程第一次启动进入运行态时,将会执行线程入口函数。 + +## 开发指导 + +### 接口说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

线程的创建和删除

+

LOS_TaskCreateOnly

+

创建线程,并使该线程进入Init状态,不执行线程调度

+

LOS_TaskCreate

+

创建线程,并使该线程进入Ready状态,并调度

+

LOS_TaskDelete

+

删除指定的线程

+

线程状态控制

+

LOS_TaskResume

+

恢复挂起的线程

+

LOS_TaskSuspend

+

挂起指定的线程

+

LOS_TaskDelay

+

线程延时等待

+

LOS_TaskYield

+

显式放权,调整调用线程优先级的线程调度顺序

+

线程调度的控制

+

LOS_TaskLock

+

锁线程调度

+

LOS_TaskUnlock

+

解锁线程调度

+

线程优先级的控制

+

LOS_CurTaskPriSet

+

设置当前线程的优先级

+

LOS_TaskPriSet

+

设置指定线程的优先级

+

LOS_TaskPriGet

+

获取指定线程的优先级

+

线程信息获取

+

LOS_CurTaskIDGet

+

获取当前线程的ID

+

LOS_TaskInfoGet

+

获取指定线程的信息

+

线程绑核操作

+

LOS_TaskCpuAffiSet

+

绑定指定线程到指定cpu上运行,仅在多核下使用

+

LOS_TaskCpuAffiGet

+

获取指定线程的绑核信息,仅在多核下使用

+

线程调度参数的控制

+

LOS_GetTaskScheduler

+

获取指定线程的调度策略

+

LOS_SetTaskScheduler

+

设置指定线程的调度参数,包括优先级和调度策略

+

系统支持的最大线程数

+

LOS_GetSystemTaskMaximum

+

获取系统支持的最大线程数目

+
+ +### 开发流程 + +线程的典型开发流程: + +1. 通过LOS\_TaskCreate创建一个线程。 + - 指定线程的执行入口函数 + + - 指定线程名 + - 指定线程的栈大小 + - 指定线程的优先级 + - 指定线程的属性,是否支持LOS\_TASK\_STATUS\_DETACHED属性 + - 多核运行时,可以选择设置线程的绑核属性 + +2. 线程参与调度运行,执行用户指定的业务代码。 +3. 线程执行结束,如果线程设置了LOS\_TASK\_STATUS\_DETACHED属性,则线程运行结束后自动回收线程资源,如果未设置LOS\_TASK\_STATUS\_DETACHED属性,则需要调用LOS\_TaskDelete接口回收线程资源。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 内核态具有最高权限,可以操作任意进程内的线程。 +>- 用户态进程通过系统调用进入内核态后创建的线程属于KProcess, 不属于当前用户态进程。 + +### 编程实例 + +代码实现如下: + +``` +UINT32 g_taskLoID; +UINT32 g_taskHiID; +#define TSK_PRIOR_HI 4 +#define TSK_PRIOR_LO 5 +UINT32 ExampleTaskHi(VOID) +{ + UINT32 ret; + PRINTK("Enter TaskHi Handler.\n"); + /* 延时2个Tick,延时后该任务会挂起,执行剩余任务中最高优先级的任务(g_taskLoID任务) */ + ret = LOS_TaskDelay(2); + if (ret != LOS_OK) { + PRINTK("Delay Task Failed.\n"); + return LOS_NOK; + } + /* 2个Tick时间到了后,该任务恢复,继续执行 */ + PRINTK("TaskHi LOS_TaskDelay Done.\n"); + /* 挂起自身任务 */ + ret = LOS_TaskSuspend(g_taskHiID); + if (ret != LOS_OK) { + PRINTK("Suspend TaskHi Failed.\n"); + return LOS_NOK; + } + PRINTK("TaskHi LOS_TaskResume Success.\n"); + return LOS_OK; +} + +/* 低优先级任务入口函数 */ +UINT32 ExampleTaskLo(VOID) +{ + UINT32 ret; + PRINTK("Enter TaskLo Handler.\n"); + /* 延时2个Tick,延时后该任务会挂起,执行剩余任务中就高优先级的任务(背景任务) */ + ret = LOS_TaskDelay(2); + if (ret != LOS_OK) { + PRINTK("Delay TaskLo Failed.\n"); + return LOS_NOK; + } + PRINTK("TaskHi LOS_TaskSuspend Success.\n"); + /* 恢复被挂起的任务g_taskHiID */ + ret = LOS_TaskResume(g_taskHiID); + if (ret != LOS_OK) { + PRINTK("Resume TaskHi Failed.\n"); + return LOS_NOK; + } + PRINTK("TaskHi LOS_TaskDelete Success.\n"); + return LOS_OK; +} +/* 任务测试入口函数,在里面创建优先级不一样的两个任务 */ +UINT32 ExampleTaskCaseEntry(VOID) +{ + UINT32 ret; + TSK_INIT_PARAM_S initParam = {0}; + + /* 锁任务调度 */ + LOS_TaskLock(); + PRINTK("LOS_TaskLock() Success!\n"); + initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleTaskHi; + initParam.usTaskPrio = TSK_PRIOR_HI; + initParam.pcName = "HIGH_NAME"; + initParam.uwStackSize = LOS_TASK_MIN_STACK_SIZE; + initParam.uwResved = LOS_TASK_STATUS_DETACHED; + + /* 创建高优先级任务,由于锁任务调度,任务创建成功后不会马上执行 */ + ret = LOS_TaskCreate(&g_taskHiID, &initParam); + if (ret != LOS_OK) { + LOS_TaskUnlock(); + PRINTK("ExampleTaskHi create Failed! ret=%d\n", ret); + return LOS_NOK; + } + PRINTK("ExampleTaskHi create Success!\n"); + + initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleTaskLo; + initParam.usTaskPrio = TSK_PRIOR_LO; + initParam.pcName = "LOW_NAME"; + initParam.uwStackSize = LOS_TASK_MIN_STACK_SIZE; + initParam.uwResved = LOS_TASK_STATUS_DETACHED; + + /* 创建低优先级任务,由于锁任务调度,任务创建成功后不会马上执行 */ + ret = LOS_TaskCreate(&g_taskLoID, &initParam); + if (ret!= LOS_OK) { + LOS_TaskUnlock(); + PRINTK("ExampleTaskLo create Failed!\n"); + return LOS_NOK; + } + PRINTK("ExampleTaskLo create Success!\n"); + + /* 解锁任务调度,此时会发生任务调度,执行就绪列表中最高优先级任务 */ + LOS_TaskUnlock(); + + while(1){}; + return LOS_OK; +} +``` + +编译运行得到的结果为: + +``` +LOS_TaskLock() Success! +ExampleTaskHi create Success! +ExampleTaskLo create Success! +Enter TaskHi Handler. +Enter TaskLo Handler. +TaskHi LOS_TaskDelay Done. +TaskHi LOS_TaskSuspend Success. +TaskHi LOS_TaskResume Success. +TaskHi LOS_TaskDelete Success. +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-manage.md b/zh-cn/device-dev/kernel/kernel-small-basic-manage.md new file mode 100644 index 0000000000000000000000000000000000000000..1e5b646e4108cd5498641f6e914ca9d60c45c652 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-manage.md @@ -0,0 +1,9 @@ +# 进程管理 + +- **[进程](kernel-small-basic-manage-process.md)** + +- **[线程](kernel-small-basic-manage-thread.md)** + +- **[调度器](kernel-small-basic-manage-debug.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-time.md b/zh-cn/device-dev/kernel/kernel-small-basic-time.md new file mode 100644 index 0000000000000000000000000000000000000000..30e9f81eb1c9465b3d5deadb9f5f486825f66e74 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-time.md @@ -0,0 +1,153 @@ +# 时间管理 + +- [基本概念](#section12903185785119) +- [开发指导](#section430981720522) + - [接口说明](#section1040142705214) + - [开发流程](#section1381224710522) + - [编程实例](#section1344610245416) + + +## 基本概念 + +时间管理以系统时钟为基础。时间管理提供给应用程序所有和时间有关的服务。系统时钟是由定时/计数器产生的输出脉冲触发中断而产生的,一般定义为整数或长整数。输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为时标或者Tick。一个Tick的时长可以静态配置。用户是以秒、毫秒为单位计时,而操作系统时钟计时是以Tick为单位的,当用户需要对系统操作时,例如任务挂起、延时等,输入秒为单位的数值,此时需要时间管理模块对二者进行转换。 + +Tick与秒之间的对应关系可以配置。 + +- **Cycle** + + 系统最小的计时单位。Cycle的时长由系统主频决定,系统主频就是每秒钟的Cycle数。 + + +- **Tick** + + Tick是操作系统的基本时间单位,对应的时长由系统主频及每秒Tick数决定,由用户配置。 + + +OpenHarmony系统的时间管理模块提供时间转换、统计、延迟功能以满足用户对时间相关需求的实现。 + +## 开发指导 + +用户需要了解当前系统运行的时间以及Tick与秒、毫秒之间的转换关系时,需要使用到时间管理模块的接口。 + +### 接口说明 + +OpenHarmony LiteOS-A内核的时间管理提供下面几种功能,接口详细信息可以查看API参考。 + +**表 1** 时间管理相关接口说明 + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

时间转换

+

LOS_MS2Tick

+

毫秒转换成Tick

+

LOS_Tick2MS

+

Tick转换成毫秒

+

时间统计

+

LOS_TickCountGet

+

获取当前Tick数

+

LOS_CyclePerTickGet

+

每个Tick的cycle数

+
+ +### 开发流程 + +1. 调用时间转换接口; +2. 获取系统Tick数完成时间统计等。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 获取系统Tick数需要在系统时钟使能之后。 +>- 时间管理不是单独的功能模块,依赖于los\_config.h中的OS\_SYS\_CLOCK和LOSCFG\_BASE\_CORE\_TICK\_PER\_SECOND两个配置选项。 +>- 系统的Tick数在关中断的情况下不进行计数,故系统Tick数不能作为准确时间计算。 + +### 编程实例 + +前置条件: + +- 配置好LOSCFG\_BASE\_CORE\_TICK\_PER\_SECOND,即系统每秒的Tick数。 +- 配置好OS\_SYS\_CLOCK 系统时钟频率,单位:Hz。 + +**示例代码** + +时间转换: + +``` +VOID Example_TransformTime(VOID) +{ + UINT32 uwMs; + UINT32 uwTick; + uwTick = LOS_MS2Tick(10000); //10000 ms数转换为Tick数 + PRINTK("uwTick = %d \n",uwTick); + uwMs= LOS_Tick2MS(100); //100 Tick数转换为ms数 + PRINTK("uwMs = %d \n",uwMs); +} +``` + +时间统计和时间延迟: + +``` +VOID Example_GetTime(VOID) +{ + UINT32 uwcyclePerTick; + UINT64 uwTickCount; + + uwcyclePerTick = LOS_CyclePerTickGet(); //每个Tick多少Cycle数 + if(0 != uwcyclePerTick) + { + PRINTK("LOS_CyclePerTickGet = %d \n", uwcyclePerTick); + } + + uwTickCount = LOS_TickCountGet(); //获取Tick数 + if(0 != uwTickCount) + { + PRINTK("LOS_TickCountGet = %d \n", (UINT32)uwTickCount); + } + LOS_TaskDelay(200);//延迟200 Tick + uwTickCount = LOS_TickCountGet(); + if(0 != uwTickCount) + { + PRINTK("LOS_TickCountGet after delay = %d \n", (UINT32)uwTickCount); + } +} +``` + +**结果验证** + +编译运行的结果如下: + +时间转换: + +``` +uwTick = 10000 +uwMs = 100 +``` + +时间统计和时间延迟: + +``` +LOS_CyclePerTickGet = 49500 +LOS_TickCountGet = 5042 +LOS_TickCountGet after delay = 5242 +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-trans-info.md b/zh-cn/device-dev/kernel/kernel-small-basic-trans-info.md new file mode 100644 index 0000000000000000000000000000000000000000..37d570e01637a4f7177ec4d4aa33005f06abdbdc --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-trans-info.md @@ -0,0 +1,273 @@ +# 信号量 + +- [基本概念](#section1577111168131) +- [运行机制](#section118423019134) +- [开发指导](#section01419503131) + - [接口说明](#section1232345431312) + - [开发流程](#section154261711141419) + - [编程实例](#section658135571417) + - [实例描述](#section125244411653) + - [编程示例](#section1742105514512) + - [结果验证](#section11297301617) + + +## 基本概念 + +信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务间同步或共享资源的互斥访问。 + +一个信号量的数据结构中,通常有一个计数值,用于对有效资源数的计数,表示剩下的可被使用的共享资源数,其值的含义分两种情况: + +- 0,表示该信号量当前不可获取,因此可能存在正在等待该信号量的任务。 +- 正值,表示该信号量当前可被获取。 + +以同步为目的的信号量和以互斥为目的的信号量在使用上有如下不同: + +- 用作互斥时,初始信号量计数值不为0,表示可用的共享资源个数。在需要使用共享资源前,先获取信号量,然后使用一个共享资源,使用完毕后释放信号量。这样在共享资源被取完,即信号量计数减至0时,其他需要获取信号量的任务将被阻塞,从而保证了共享资源的互斥访问。另外,当共享资源数为1时,建议使用二值信号量,一种类似于互斥锁的机制。 +- 用作同步时,初始信号量计数值为0。任务1获取信号量而阻塞,直到任务2或者某中断释放信号量,任务1才得以进入Ready或Running态,从而达到了任务间的同步。 + +## 运行机制 + +**信号量控制块** + +``` +/** + * 信号量控制块数据结构 + */ +typedef struct { + UINT16 semStat; /* 信号量状态 */ + UINT16 semType; /* 信号量类型 */ + UINT16 semCount; /* 信号量计数 */ + UINT16 semId; /* 信号量索引号 */ + LOS_DL_LIST semList; /* 挂接阻塞于该信号量的任务 */ +} LosSemCB; +``` + +**信号量运作原理** + +信号量允许多个任务在同一时刻访问共享资源,但会限制同一时刻访问此资源的最大任务数目。当访问资源的任务数达到该资源允许的最大数量时,会阻塞其他试图获取该资源的任务,直到有任务释放该信号量。 + +- 信号量初始化 + + 初始化时为配置的N个信号量申请内存(N值可以由用户自行配置,通过LOSCFG\_BASE\_IPC\_SEM\_LIMIT宏实现),并把所有信号量初始化成未使用,加入到未使用链表中供系统使用 + +- 信号量创建 + + 从未使用的信号量链表中获取一个信号量,并设定初值。 + +- 信号量申请 + + 若其计数器值大于0,则直接减1返回成功。否则任务阻塞,等待其它任务释放该信号量,等待的超时时间可设定。当任务被一个信号量阻塞时,将该任务挂到信号量等待任务队列的队尾。 + +- 信号量释放 + + 若没有任务等待该信号量,则直接将计数器加1返回。否则唤醒该信号量等待任务队列上的第一个任务。 + +- 信号量删除 + + 将正在使用的信号量置为未使用信号量,并挂回到未使用链表。 + + +运行示意图如下图所示: + +**图 1** 信号量运作示意图 +![](figure/信号量运作示意图-21.png "信号量运作示意图-21") + +## 开发指导 + +### 接口说明 + +**表 1** 信号量模块接口 + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

创建/删除信号量

+

LOS_SemCreate

+

创建信号量,返回信号量ID

+

LOS_BinarySemCreate

+

创建二值信号量,其计数值最大为1

+

LOS_SemDelete

+

删除指定的信号量

+

申请/释放信号量

+

LOS_SemPend

+

申请指定的信号量,并设置超时时间

+

LOS_SemPost

+

释放指定的信号量

+
+ +### 开发流程 + +1. 创建信号量LOS\_SemCreate,若要创建二值信号量则调用LOS\_BinarySemCreate。 +2. 申请信号量LOS\_SemPend。 +3. 释放信号量LOS\_SemPost。 +4. 删除信号量LOS\_SemDelete。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>由于中断不能被阻塞,因此不能在中断中使用阻塞模式申请信号量。 + +### 编程实例 + +### 实例描述 + +本实例实现如下功能: + +1. 测试任务ExampleSem创建一个信号量,锁任务调度,创建两个任务ExampleSemTask1、ExampleSemTask2, ExampleSemTask2优先级高于ExampleSemTask1,两个任务中申请同一信号量,解锁任务调度后两任务阻塞,测试任务ExampleSem释放信号量。 +2. ExampleSemTask2得到信号量,被调度,然后任务休眠20Tick,ExampleSemTask2延迟,ExampleSemTask1被唤醒。 +3. ExampleSemTask1定时阻塞模式申请信号量,等待时间为10Tick,因信号量仍被ExampleSemTask2持有,ExampleSemTask1挂起,10Tick后仍未得到信号量,ExampleSemTask1被唤醒,试图以永久阻塞模式申请信号量,ExampleSemTask1挂起。 +4. 20Tick后ExampleSemTask2唤醒, 释放信号量后,ExampleSemTask1得到信号量被调度运行,最后释放信号量。 +5. ExampleSemTask1执行完,40Tick后任务ExampleSem被唤醒,执行删除信号量。 + +### 编程示例 + +示例代码如下: + +``` +#include "los_sem.h" +#include "securec.h" + +/* 任务ID */ +static UINT32 g_testTaskId01; +static UINT32 g_testTaskId02; + +/* 测试任务优先级 */ +#define TASK_PRIO_TEST 5 + +/* 信号量结构体id */ +static UINT32 g_semId; + +VOID ExampleSemTask1(VOID) +{ + UINT32 ret; + + printf("ExampleSemTask1 try get sem g_semId, timeout 10 ticks.\n"); + + /* 定时阻塞模式申请信号量,定时时间为10ticks */ + ret = LOS_SemPend(g_semId, 10); + + /* 申请到信号量 */ + if (ret == LOS_OK) { + LOS_SemPost(g_semId); + return; + } + /* 定时时间到,未申请到信号量 */ + if (ret == LOS_ERRNO_SEM_TIMEOUT) { + printf("ExampleSemTask1 timeout and try get sem g_semId wait forever.\n"); + + /*永久阻塞模式申请信号量*/ + ret = LOS_SemPend(g_semId, LOS_WAIT_FOREVER); + printf("ExampleSemTask1 wait_forever and get sem g_semId.\n"); + if (ret == LOS_OK) { + LOS_SemPost(g_semId); + return; + } + } +} + +VOID ExampleSemTask2(VOID) +{ + UINT32 ret; + printf("ExampleSemTask2 try get sem g_semId wait forever.\n"); + + /* 永久阻塞模式申请信号量 */ + ret = LOS_SemPend(g_semId, LOS_WAIT_FOREVER); + + if (ret == LOS_OK) { + printf("ExampleSemTask2 get sem g_semId and then delay 20 ticks.\n"); + } + + /* 任务休眠20 ticks */ + LOS_TaskDelay(20); + + printf("ExampleSemTask2 post sem g_semId.\n"); + /* 释放信号量 */ + LOS_SemPost(g_semId); + return; +} + +UINT32 ExampleSem(VOID) +{ + UINT32 ret; + TSK_INIT_PARAM_S task1; + TSK_INIT_PARAM_S task2; + + /* 创建信号量 */ + LOS_SemCreate(0, &g_semId); + + /* 锁任务调度 */ + LOS_TaskLock(); + + /* 创建任务1 */ + (VOID)memset_s(&task1, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); + task1.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleSemTask1; + task1.pcName = "TestTask1"; + task1.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; + task1.usTaskPrio = TASK_PRIO_TEST; + ret = LOS_TaskCreate(&g_testTaskId01, &task1); + if (ret != LOS_OK) { + printf("task1 create failed .\n"); + return LOS_NOK; + } + + /* 创建任务2 */ + (VOID)memset_s(&task2, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); + task2.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleSemTask2; + task2.pcName = "TestTask2"; + task2.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; + task2.usTaskPrio = (TASK_PRIO_TEST - 1); + ret = LOS_TaskCreate(&g_testTaskId02, &task2); + if (ret != LOS_OK) { + printf("task2 create failed.\n"); + return LOS_NOK; + } + + /* 解锁任务调度 */ + LOS_TaskUnlock(); + + ret = LOS_SemPost(g_semId); + + /* 任务休眠400 ticks */ + LOS_TaskDelay(400); + + /* 删除信号量 */ + LOS_SemDelete(g_semId); + return LOS_OK; +} +``` + +### 结果验证 + +编译运行得到的结果为: + +``` +ExampleSemTask2 try get sem g_semId wait forever. +ExampleSemTask2 get sem g_semId and then delay 20 ticks. +ExampleSemTask1 try get sem g_semId, timeout 10 ticks. +ExampleSemTask1 timeout and try get sem g_semId wait forever. +ExampleSemTask2 post sem g_semId. +ExampleSemTask1 wait_forever and get sem g_semId. +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-trans-lines.md b/zh-cn/device-dev/kernel/kernel-small-basic-trans-lines.md new file mode 100644 index 0000000000000000000000000000000000000000..0acd40ee2bbed38995357739133962969416d070 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-trans-lines.md @@ -0,0 +1,267 @@ +# 消息队列 + +- [基本概念](#section81171363232) +- [运行机制](#section1074515132316) + - [队列控制块](#section194431851201315) + - [队列运作原理](#section89875741418) + +- [开发指导](#section827981242419) + - [接口说明](#section19327151642413) + - [开发流程](#section1390154210243) + +- [编程实例](#section27132341285) + - [实例描述](#section197311443141017) + - [编程示例](#section972214490107) + - [结果验证](#section19287165416106) + + +## 基本概念 + +队列又称消息队列,是一种常用于任务间通信的数据结构。队列接收来自任务或中断的不固定长度消息,并根据不同的接口确定传递的消息是否存放在队列空间中。 + +任务能够从队列里面读取消息,当队列中的消息为空时,挂起读取任务;当队列中有新消息时,挂起的读取任务被唤醒并处理新消息。任务也能够往队列里写入消息,当队列已经写满消息时,挂起写入任务;当队列中有空闲消息节点时,挂起的写入任务被唤醒并写入消息。 + +可以通过调整读队列和写队列的超时时间来调整读写接口的阻塞模式,如果将读队列和写队列的超时时间设置为0,就不会挂起任务,接口会直接返回,这就是非阻塞模式。反之,如果将都队列和写队列的超时时间设置为大于0的时间,就会以阻塞模式运行。 + +消息队列提供了异步处理机制,允许将一个消息放入队列,但不立即处理。同时队列还有缓冲消息的作用,可以使用队列实现任务异步通信,队列具有如下特性: + +- 消息以先进先出的方式排队,支持异步读写。 +- 读队列和写队列都支持超时机制。 +- 每读取一条消息,就会将该消息节点设置为空闲。 +- 发送消息类型由通信双方约定,可以允许不同长度(不超过队列的消息节点大小)的消息。 +- 一个任务能够从任意一个消息队列接收和发送消息。 +- 多个任务能够从同一个消息队列接收和发送消息。 +- 创建队列时所需的队列空间,接口内系统自行动态申请内存。 + +## 运行机制 + +### 队列控制块 + +``` +/** + * 队列控制块数据结构 + */ +typedef struct { + UINT8 *queueHandle; /**< Pointer to a queue handle */ + UINT16 queueState; /**< Queue state */ + UINT16 queueLen; /**< Queue length */ + UINT16 queueSize; /**< Node size */ + UINT32 queueID; /**< queueID */ + UINT16 queueHead; /**< Node head */ + UINT16 queueTail; /**< Node tail */ + UINT16 readWriteableCnt[OS_QUEUE_N_RW]; /**< Count of readable or writable resources, 0:readable, 1:writable */ + LOS_DL_LIST readWriteList[OS_QUEUE_N_RW]; /**< the linked list to be read or written, 0:readlist, 1:writelist */ + LOS_DL_LIST memList; /**< Pointer to the memory linked list */ +} LosQueueCB; +``` + +每个队列控制块中都含有队列状态,表示该队列的使用情况: + +- OS\_QUEUE\_UNUSED:队列未被使用。 +- OS\_QUEUE\_INUSED:队列被使用中。 + +### 队列运作原理 + +- 创建队列时,创建队列成功会返回队列ID。 +- 在队列控制块中维护着一个消息头节点位置Head和一个消息尾节点位置Tail,用于表示当前队列中消息的存储情况。Head表示队列中被占用的消息节点的起始位置。Tail表示被占用的消息节点的结束位置,也是空闲消息节点的起始位置。队列刚创建时,Head和Tail均指向队列起始位置。 +- 写队列时,根据readWriteableCnt\[1\]判断队列是否可以写入,不能对已满(readWriteableCnt\[1\]为0)队列进行写操作。写队列支持两种写入方式:向队列尾节点写入,也可以向队列头节点写入。尾节点写入时,根据Tail找到起始空闲消息节点作为数据写入对象,如果Tail已经指向队列尾部则采用回卷方式。头节点写入时,将Head的前一个节点作为数据写入对象,如果Head指向队列起始位置则采用回卷方式。 +- 读队列时,根据readWriteableCnt\[0\]判断队列是否有消息需要读取,对全部空闲(readWriteableCnt\[0\]为0)队列进行读操作会引起任务挂起。如果队列可以读取消息,则根据Head找到最先写入队列的消息节点进行读取。如果Head已经指向队列尾部则采用回卷方式。 +- 删除队列时,根据队列ID找到对应队列,把队列状态置为未使用,把队列控制块置为初始状态,并释放队列所占内存。 + +图 1 队列读写数据操作示意图 + +![](figure/zh-cn_image_0000001132875772.png) + +上图对读写队列做了示意,图中只画了尾节点写入方式,没有画头节点写入,但是两者是类似的。 + +## 开发指导 + +### 接口说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

创建/删除消息队列

+

LOS_QueueCreate

+

创建一个消息队列,由系统动态申请队列空间

+

LOS_QueueDelete

+

根据队列ID删除一个指定队列

+

读/写队列(不带拷贝)

+

LOS_QueueRead

+

读取指定队列头节点中的数据(队列节点中的数据实际上是一个地址)

+

LOS_QueueWrite

+

向指定队列尾节点中写入入参bufferAddr的值(即buffer的地址)

+

LOS_QueueWriteHead

+

向指定队列头节点中写入入参bufferAddr的值(即buffer的地址)

+

读/写队列(带拷贝)

+

LOS_QueueReadCopy

+

读取指定队列头节点中的数据

+

LOS_QueueWriteCopy

+

向指定队列尾节点中写入入参bufferAddr中保存的数据

+

LOS_QueueWriteHeadCopy

+

向指定队列头节点中写入入参bufferAddr中保存的数据

+

获取队列信息

+

LOS_QueueInfoGet

+

获取指定队列的信息,包括队列ID、队列长度、消息节点大小、头节点、尾节点、可读节点数量、可写节点数量、等待读操作的任务、等待写操作的任务

+
+ +### 开发流程 + +1. 用LOS\_QueueCreate创建队列。创建成功后,可以得到队列ID。 +2. 通过LOS\_QueueWrite或者LOS\_QueueWriteCopy写队列。 +3. 通过LOS\_QueueRead或者LOS\_QueueReadCopy读队列。 +4. 通过LOS\_QueueInfoGet获取队列信息。 +5. 通过LOS\_QueueDelete删除队列。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 系统支持的最大队列数是指:整个系统的队列资源总个数,而非用户能使用的个数。例如:系统软件定时器多占用一个队列资源,那么用户能使用的队列资源就会减少一个。 +>- 创建队列时传入的队列名和flags暂时未使用,作为以后的预留参数。 +>- 队列接口函数中的入参timeOut是相对时间。 +>- LOS\_QueueReadCopy和LOS\_QueueWriteCopy及LOS\_QueueWriteHeadCopy是一组接口,LOS\_QueueRead和LOS\_QueueWrite及LOS\_QueueWriteHead是一组接口,每组接口需要配套使用。 +>- 鉴于LOS\_QueueWrite和LOS\_QueueWriteHead和LOS\_QueueRead这组接口实际操作的是数据地址,用户必须保证调用LOS\_QueueRead获取到的指针所指向的内存区域在读队列期间没有被异常修改或释放,否则可能导致不可预知的后果。 +>- 鉴于LOS\_QueueWrite和LOS\_QueueWriteHead和LOS\_QueueRead这组接口实际操作的是数据地址,也就意味着实际写和读的消息长度仅仅是一个指针数据,因此用户使用这组接口之前,需确保创建队列时的消息节点大小,为一个指针的长度,避免不必要的浪费和读取失败。 + +## 编程实例 + +### 实例描述 + +创建一个队列,两个任务。任务1调用写队列接口发送消息,任务2通过读队列接口接收消息。 + +1. 通过LOS\_TaskCreate创建任务1和任务2。 +2. 通过LOS\_QueueCreate创建一个消息队列。 +3. 在任务1 SendEntry中发送消息。 +4. 在任务2 RecvEntry中接收消息。 +5. 通过LOS\_QueueDelete删除队列。 + +### 编程示例 + +示例代码如下: + +``` +#include "los_task.h" +#include "los_queue.h" +static UINT32 g_queue; +#define BUFFER_LEN 50 + +VOID SendEntry(VOID) +{ + UINT32 ret = 0; + CHAR abuf[] = "test message"; + UINT32 len = sizeof(abuf); + + ret = LOS_QueueWriteCopy(g_queue, abuf, len, 0); + if(ret != LOS_OK) { + printf("send message failure, error: %x\n", ret); + } +} + +VOID RecvEntry(VOID) +{ + UINT32 ret = 0; + CHAR readBuf[BUFFER_LEN] = {0}; + UINT32 readLen = BUFFER_LEN; + + //休眠1s + usleep(1000000); + ret = LOS_QueueReadCopy(g_queue, readBuf, &readLen, 0); + if(ret != LOS_OK) { + printf("recv message failure, error: %x\n", ret); + } + + printf("recv message: %s\n", readBuf); + + ret = LOS_QueueDelete(g_queue); + if(ret != LOS_OK) { + printf("delete the queue failure, error: %x\n", ret); + } + + printf("delete the queue success!\n"); +} + +UINT32 ExampleQueue(VOID) +{ + printf("start queue example\n"); + UINT32 ret = 0; + UINT32 task1, task2; + TSK_INIT_PARAM_S initParam = {0}; + + initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)SendEntry; + initParam.usTaskPrio = 9; + initParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; + initParam.pcName = "SendQueue"; + + LOS_TaskLock(); + ret = LOS_TaskCreate(&task1, &initParam); + if(ret != LOS_OK) { + printf("create task1 failed, error: %x\n", ret); + return ret; + } + + initParam.pcName = "RecvQueue"; + initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)RecvEntry; + ret = LOS_TaskCreate(&task2, &initParam); + if(ret != LOS_OK) { + printf("create task2 failed, error: %x\n", ret); + return ret; + } + + ret = LOS_QueueCreate("queue", 5, &g_queue, 0, 50); + if(ret != LOS_OK) { + printf("create queue failure, error: %x\n", ret); + } + + printf("create the queue success!\n"); + LOS_TaskUnlock(); + return ret; +} +``` + +### 结果验证 + +编译运行得到的结果为: + +``` +start test example +create the queue success! +recv message: test message +delete the queue success! +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-trans-locks.md b/zh-cn/device-dev/kernel/kernel-small-basic-trans-locks.md new file mode 100644 index 0000000000000000000000000000000000000000..6f97d4432034dc17780f1cf24648f8ea49b570c7 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-trans-locks.md @@ -0,0 +1,317 @@ +# 互斥锁 + +- [基本概念](#section85865329185) +- [运行机制](#section8547454201819) +- [开发指导](#section2038861117194) + - [接口说明](#section11168318131917) + - [开发流程](#section4201191122116) + - [编程实例](#section10679328202117) + + +## 基本概念 + +互斥锁又称互斥型信号量,用于实现对共享资源的独占式处理。当有任务持有时,这个任务获得该互斥锁的所有权。当该任务释放它时,任务失去该互斥锁的所有权。当一个任务持有互斥锁时,其他任务将不能再持有该互斥锁。多任务环境下往往存在多个任务竞争同一共享资源的应用场景,互斥锁可被用于对共享资源的保护从而实现独占式访问。 + +互斥量属性包含3个属性:协议属性、优先级上限属性和类型属性。协议属性用于处理不同优先级的任务申请互斥锁,协议属性包含如下三种: + +- LOS\_MUX\_PRIO\_NONE + + 不对申请互斥锁的任务的优先级进行继承或保护操作。 + +- LOS\_MUX\_PRIO\_INHERIT + + 优先级继承属性,默认设置为该属性,对申请互斥锁的任务的优先级进行继承。在互斥锁设置为本协议属性情况下,申请互斥锁时,如果高优先级任务阻塞于互斥锁,则把持有互斥锁任务的优先级备份到任务控制块的优先级位图中,然后把任务优先级设置为和高优先级任务相同的优先级;持有互斥锁的任务释放互斥锁时,从任务控制块的优先级位图恢复任务优先级。 + +- LOS\_MUX\_PRIO\_PROTECT + + 优先级保护属性,对申请互斥锁的任务的优先级进行保护。在互斥锁设置为本协议属性情况下,申请互斥锁时,如果任务优先级小于互斥锁优先级上限,则把任务优先级备份到任务控制块的优先级位图中,然后把任务优先级设置为互斥锁优先级上限属性值;释放互斥锁时,从任务控制块的优先级位图恢复任务优先级。 + + +互斥锁的类型属性用于标记是否检测死锁,是否支持递归持有,类型属性包含如下三种: + +- LOS\_MUX\_NORMAL + + 普通互斥锁,不会检测死锁。如果任务试图对一个互斥锁重复持有,将会引起这个线程的死锁。如果试图释放一个由别的任务持有的互斥锁,或者如果一个任务试图重复释放互斥锁都会引发不可预料的结果。 + +- LOS\_MUX\_RECURSIVE + + 递归互斥锁,默认设置为该属性。在互斥锁设置为本类型属性情况下,允许同一个任务对互斥锁进行多次持有锁,持有锁次数和释放锁次数相同,其他任务才能持有该互斥锁。如果试图持有已经被其他任务持有的互斥锁,或者如果试图释放已经被释放的互斥锁,会返回错误码。 + +- LOS\_MUX\_ERRORCHECK + + 错误检测互斥锁,会自动检测死锁。在互斥锁设置为本类型属性情况下,如果任务试图对一个互斥锁重复持有,或者试图释放一个由别的任务持有的互斥锁,或者如果一个任务试图释放已经被释放的互斥锁,都会返回错误码。 + + +## 运行机制 + +多任务环境下会存在多个任务访问同一公共资源的场景,而有些公共资源是非共享的,需要任务进行独占式处理。互斥锁怎样来避免这种冲突呢? + +用互斥锁处理非共享资源的同步访问时,如果有任务访问该资源,则互斥锁为加锁状态。此时其他任务如果想访问这个公共资源则会被阻塞,直到互斥锁被持有该锁的任务释放后,其他任务才能重新访问该公共资源,此时互斥锁再次上锁,如此确保同一时刻只有一个任务正在访问这个公共资源,保证了公共资源操作的完整性。 + +**图 1** 互斥锁运作示意图 +![](figure/互斥锁运作示意图-22.png "互斥锁运作示意图-22") + +## 开发指导 + +### 接口说明 + +**表 1** 互斥锁模块接口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

初始化和销毁互斥锁

+

LOS_MuxInit

+

互斥锁初始化

+

LOS_MuxDestroy

+

销毁指定的互斥锁

+

互斥锁的申请和释放

+

LOS_MuxLock

+

申请指定的互斥锁

+

LOS_MuxTrylock

+

尝试申请指定的互斥锁,不阻塞

+

LOS_MuxUnlock

+

释放指定的互斥锁

+

校验互斥锁

+

LOS_MuxIsValid

+

判断互斥锁释放有效

+

初始化和销毁互斥锁属性

+

LOS_MuxAttrInit

+

互斥锁属性初始化

+

LOS_MuxAttrDestroy

+

销毁指定的互斥锁属性

+

设置和获取互斥锁属性

+

LOS_MuxAttrGetType

+

获取互斥锁类型属性

+

LOS_MuxAttrSetType

+

设置互斥锁类型属性

+

LOS_MuxAttrGetProtocol

+

获取互斥锁协议属性

+

LOS_MuxAttrSetProtocol

+

设置互斥锁协议属性

+

LOS_MuxAttrGetPrioceiling

+

获取互斥锁优先级上限属性

+

LOS_MuxAttrSetPrioceiling

+

设置互斥锁优先级上限属性

+

LOS_MuxGetPrioceiling

+

获取互斥锁优先级上限属性

+

LOS_MuxSetPrioceiling

+

设置互斥锁优先级上限属性

+
+ +### 开发流程 + +互斥锁典型场景的开发流程: + +1. 初始化互斥锁LOS\_MuxInit。 + +2. 申请互斥锁LOS\_MuxLock。 + +申请模式有三种:无阻塞模式、永久阻塞模式、定时阻塞模式。 + +- 无阻塞模式:任务需要申请互斥锁,若该互斥锁当前没有任务持有,或者持有该互斥锁的任务和申请该互斥锁的任务为同一个任务,则申请成功; +- 永久阻塞模式:任务需要申请互斥锁,若该互斥锁当前没有被占用,则申请成功。否则,该任务进入阻塞态,系统切换到就绪任务中优先级高者继续执行。任务进入阻塞态后,直到有其他任务释放该互斥锁,阻塞任务才会重新得以执行; +- 定时阻塞模式:任务需要申请互斥锁,若该互斥锁当前没有被占用,则申请成功。否则该任务进入阻塞态,系统切换到就绪任务中优先级高者继续执行。任务进入阻塞态后,指定时间超时前有其他任务释放该互斥锁,或者用 户指定时间超时后,阻塞任务才会重新得以执行。 + +3. 释放互斥锁LOS\_MuxUnlock。 + +- 如果有任务阻塞于指定互斥锁,则唤醒被阻塞任务中优先级高的,该任务进入就绪态,并进行任务调度; +- 如果没有任务阻塞于指定互斥锁,则互斥锁释放成功。 + +4. 销毁互斥锁LOS\_MuxDestroy。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 两个任务不能对同一把互斥锁加锁。如果某任务对已被持有的互斥锁加锁,则该任务会被挂起,直到持有该锁的任务对互斥锁解锁,才能执行对这把互斥锁的加锁操作。 +>- 互斥锁不能在中断服务程序中使用。 +>- LiteOS-A内核作为实时操作系统需要保证任务调度的实时性,尽量避免任务的长时间阻塞,因此在获得互斥锁之后,应该尽快释放互斥锁。 + +### 编程实例 + +**实例描述** + +本实例实现如下流程: + +1. 任务Example\_TaskEntry创建一个互斥锁,锁任务调度,创建两个任务Example\_MutexTask1、Example\_MutexTask2。Example\_MutexTask2优先级高于Example\_MutexTask1,解锁任务调度。 +2. Example\_MutexTask2被调度,以永久阻塞模式申请互斥锁,并成功获取到该互斥锁,然后任务休眠100Tick,Example\_MutexTask2挂起,Example\_MutexTask1被唤醒。 +3. Example\_MutexTask1以定时阻塞模式申请互斥锁,等待时间为10Tick,因互斥锁仍被Example\_MutexTask2持有,Example\_MutexTask1挂起。10Tick超时时间到达后,Example\_MutexTask1被唤醒,以永久阻塞模式申请互斥锁,因互斥锁仍被Example\_MutexTask2持有,Example\_MutexTask1挂起。 +4. 100Tick休眠时间到达后,Example\_MutexTask2被唤醒, 释放互斥锁,唤醒Example\_MutexTask1。Example\_MutexTask1成功获取到互斥锁后,释放,删除互斥锁。 + +**示例代码** + +示例代码如下: + +``` +#include +#include "los_mux.h" + +/* 互斥锁 */ +LosMux g_testMux; +/* 任务ID */ +UINT32 g_testTaskId01; +UINT32 g_testTaskId02; + +VOID Example_MutexTask1(VOID) +{ + UINT32 ret; + + printf("task1 try to get mutex, wait 10 ticks.\n"); + /* 申请互斥锁 */ + ret = LOS_MuxLock(&g_testMux, 10); + + if (ret == LOS_OK) { + printf("task1 get mutex g_testMux.\n"); + /* 释放互斥锁 */ + LOS_MuxUnlock(&g_testMux); + return; + } + if (ret == LOS_ETIMEDOUT ) { + printf("task1 timeout and try to get mutex, wait forever.\n"); + /* 申请互斥锁 */ + ret = LOS_MuxLock(&g_testMux, LOS_WAIT_FOREVER); + if (ret == LOS_OK) { + printf("task1 wait forever, get mutex g_testMux.\n"); + /* 释放互斥锁 */ + LOS_MuxUnlock(&g_testMux); + /* 删除互斥锁 */ + LOS_MuxDestroy(&g_testMux); + printf("task1 post and delete mutex g_testMux.\n"); + return; + } + } + return; +} + +VOID Example_MutexTask2(VOID) +{ + printf("task2 try to get mutex, wait forever.\n"); + /* 申请互斥锁 */ + (VOID)LOS_MuxLock(&g_testMux, LOS_WAIT_FOREVER); + + printf("task2 get mutex g_testMux and suspend 100 ticks.\n"); + + /* 任务休眠100Ticks */ + LOS_TaskDelay(100); + + printf("task2 resumed and post the g_testMux\n"); + /* 释放互斥锁 */ + LOS_MuxUnlock(&g_testMux); + return; +} + +UINT32 Example_MutexEntry(VOID) +{ + UINT32 ret; + TSK_INIT_PARAM_S task1; + TSK_INIT_PARAM_S task2; + + /* 初始化互斥锁 */ + LOS_MuxInit(&g_testMux, NULL); + + /* 锁任务调度 */ + LOS_TaskLock(); + + /* 创建任务1 */ + memset(&task1, 0, sizeof(TSK_INIT_PARAM_S)); + task1.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_MutexTask1; + task1.pcName = "MutexTsk1"; + task1.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; + task1.usTaskPrio = 5; + ret = LOS_TaskCreate(&g_testTaskId01, &task1); + if (ret != LOS_OK) { + printf("task1 create failed.\n"); + return LOS_NOK; + } + + /* 创建任务2 */ + memset(&task2, 0, sizeof(TSK_INIT_PARAM_S)); + task2.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_MutexTask2; + task2.pcName = "MutexTsk2"; + task2.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; + task2.usTaskPrio = 4; + ret = LOS_TaskCreate(&g_testTaskId02, &task2); + if (ret != LOS_OK) { + printf("task2 create failed.\n"); + return LOS_NOK; + } + + /* 解锁任务调度 */ + LOS_TaskUnlock(); + + return LOS_OK; +} +``` + +**结果验证** + +编译运行得到的结果为: + +``` +task1 try to get mutex, wait 10 ticks. +task2 try to get mutex, wait forever. +task2 get mutex g_testMux and suspend 100 ticks. +task1 timeout and try to get mutex, wait forever. +task2 resumed and post the g_testMux +task1 wait forever, get mutex g_testMux. +task1 post and delete mutex g_testMux. +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-trans-reading.md b/zh-cn/device-dev/kernel/kernel-small-basic-trans-reading.md new file mode 100644 index 0000000000000000000000000000000000000000..89bb3b752cda8332712029d05a64a0e380e58b8e --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-trans-reading.md @@ -0,0 +1,134 @@ +# 读写锁 + +- [基本概念](#section4692105214260) +- [运行机制](#section1239111562720) +- [开发指导](#section11643194275) + - [接口说明](#section15335332122717) + - [开发流程](#section14774114882714) + + +## 基本概念 + +读写锁与互斥锁类似,可用来同步同一进程中的各个任务,但与互斥锁不同的是,其允许多个读操作并发重入,而写操作互斥。 + +相对于互斥锁的开锁或闭锁状态,读写锁有三种状态:读模式下的锁,写模式下的锁,无锁。 + +读写锁的使用规则: + +- 保护区无写模式下的锁,任何任务均可以为其增加读模式下的锁。 +- 保护区处于无锁状态下,才可增加写模式下的锁。 + +多任务环境下往往存在多个任务访问同一共享资源的应用场景,读模式下的锁以共享状态对保护区访问,而写模式下的锁可被用于对共享资源的保护从而实现独占式访问。 + +这种共享-独占的方式非常适合多任务中读数据频率远大于写数据频率的应用中,提高应用多任务并发度。 + +## 运行机制 + +相较于互斥锁,读写锁如何实现读模式下的锁及写模式下的锁来控制多任务的读写访问呢? + +- 若A任务首次获取了写模式下的锁,有其他任务来获取或尝试获取读模式下的锁,均无法再上锁。 + +- 若A任务获取了读模式下的锁,当有任务来获取或尝试获取读模式下的锁时,读写锁计数均加一。 + +## 开发指导 + +### 接口说明 + +**表 1** 读写锁模块接口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

读写锁的创建和删除

+

LOS_RwlockInit

+

创建读写锁

+

LOS_RwlockDestroy

+

删除指定的读写锁

+

读模式下的锁的申请

+

LOS_RwlockRdLock

+

申请指定的读模式下的锁

+

LOS_RwlockTryRdLock

+

尝试申请指定的读模式下的锁

+

写模式下的锁的申请

+

LOS_RwlockWrLock

+

申请指定的写模式下的锁

+

LOS_RwlockTryWrLock

+

尝试申请指定的写模式下的锁

+

读写锁的释放

+

LOS_RwlockUnLock

+

释放指定读写锁

+

读写锁有效性判断

+

LOS_RwlockIsValid

+

判断读写锁有效性

+
+ +### 开发流程 + +读写锁典型场景的开发流程: + +1. 创建读写锁LOS\_RwlockInit。 + +2. 申请读模式下的锁LOS\_RwlockRdLock或写模式下的锁LOS\_RwlockWrLock。 + +申请读模式下的锁: + +- 若无人持有锁,读任务可获得锁。 +- 若有人持有锁,读任务可获得锁,读取顺序按照任务优先级。 +- 若有人(非自己)持有写模式下的锁,则当前任务无法获得锁,直到写模式下的锁释放。 + +申请写模式下的锁: + +- 若该锁当前没有任务持有,或者持有该读模式下的锁的任务和申请该锁的任务为同一个任务,则申请成功,可立即获得写模式下的锁。 +- 若该锁当前已经存在读模式下的锁,且读取任务优先级较高,则当前任务挂起,直到读模式下的锁释放。 + +3.申请读模式下的锁和写模式下的锁均有三种:无阻塞模式、永久阻塞模式、定时阻塞模式,区别在于挂起任务的时间。 + +4.释放读写锁LOS\_RwlockUnLock。 + +- 如果有任务阻塞于指定读写锁,则唤醒被阻塞任务中优先级高的,该任务进入就绪态,并进行任务调度; + +- 如果没有任务阻塞于指定读写锁,则读写锁释放成功。 + +5. 删除读写锁LOS\_RwlockDestroy。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 读写锁不能在中断服务程序中使用。 +>- LiteOS-A内核作为实时操作系统需要保证任务调度的实时性,尽量避免任务的长时间阻塞,因此在获得读写锁之后,应该尽快释放该锁。 +>- 持有读写锁的过程中,不得再调用LOS\_TaskPriSet等接口更改持有读写锁任务的优先级 + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-trans-sign.md b/zh-cn/device-dev/kernel/kernel-small-basic-trans-sign.md new file mode 100644 index 0000000000000000000000000000000000000000..d49376ae2983ecdeb477c57a4358fa79042eecff --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-trans-sign.md @@ -0,0 +1,85 @@ +# 信号 + +- [基本概念](#section172788254307) +- [运行机制](#section1249693812301) + +## 基本概念 + +信号\(signal\)是一种常用的进程间异步通信机制,用软件的方式模拟中断信号,当一个进程需要传递信息给另一个进程时,则会发送一个信号给内核,再由内核将信号传递至指定进程,而指定进程不必进行等待信号的动作。 + +## 运行机制 + +信号的运作流程分为三个部分,如表1: + +**表 1** 信号的运作流程及相关接口(用户态接口) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

注册信号回调函数

+

signal

+

注册系统总入口及注册和去注册某信号的回调函数。

+

sigaction

+

仅支持SIGINFO的选项。

+

发送信号

+

kill

+

发送信号给某个进程或进程内发送消息给某线程,为某进程下的线程设置信号标志位。

+

pthread_kill

+

raise

+

alarm

+

abort

+

触发回调

+

+

由系统调用与中断触发,内核态与用户态切换前会先进入用户态指定函数并处理完相应回调函数,再回到原用户态程序继续运行。

+
+ +>![](../public_sys-resources/icon-note.gif) **说明:** +>信号机制为提供给用户态程序进程间通信的能力,故推荐使用上表1列出的用户态POSIX相关接口。 +>注册回调函数: +>``` +>void *signal(int sig, void (*func)(int))(int); +>``` +>a. 31 号信号,会注册该进程的回调函数处理入口,不可重入。 +>b. 0-30 号信号,判断注册回调函数,注册与去注册回调函数。 +>``` +>int sigaction(int, const struct sigaction *__restrict, struct sigaction *__restrict); +>``` +>仅支持SIGINFO的选项,SIGINFO内容见sigtimedwait接口内描述。 +>发送信号: +>a. 信号的默认行为不支持STOP及COTINUE,无COREDUMP功能。 +>b. 不能屏蔽SIGSTOP、SIGKILL、SIGCONT。 +>c. 杀死进程后,若父进程不回收,会产生僵尸进程。 +>d. 异步信号,发送信号给某进程后,直到该进程被调度后才会执行信号回调(为安全起见,杀死进程的动作是进程自己执行的,内核不能通过信号强制杀死对方)。 +>e. 进程消亡会发送SIGCHLD给父进程,发送动作无法取消。 +>f. 无法通过信号唤醒正在DELAY状态的进程。触发调度需要usleep\(10000\)即10ms才能完成进程调度转让。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-trans-soft.md b/zh-cn/device-dev/kernel/kernel-small-basic-trans-soft.md new file mode 100644 index 0000000000000000000000000000000000000000..f0233bc29e08cda5d9aa26b4482189e0d6beb713 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-trans-soft.md @@ -0,0 +1,236 @@ +# 软件定时器 + +- [基本概念](#section4118241563) +- [运行机制](#section31079397569) +- [开发指导](#section18576131520577) + - [接口说明](#section3138019145719) + - [开发流程](#section1344817403575) + - [编程实例](#section114416313585) + + +## 基本概念 + +软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数值后会触发用户定义的回调函数。定时精度与系统Tick时钟的周期有关。硬件定时器受硬件的限制,数量上不足以满足用户的实际需求,因此为了满足用户需求,提供更多的定时器,Huawei LiteOS操作系统提供软件定时器功能。软件定时器扩展了定时器的数量,允许创建更多的定时业务。 + +软件定时器功能上支持: + +- 静态裁剪:能通过宏关闭软件定时器功能。 +- 软件定时器创建。 +- 软件定时器启动。 +- 软件定时器停止。 +- 软件定时器删除。 +- 软件定时器剩余Tick数获取。 + +## 运行机制 + +软件定时器是系统资源,在模块初始化的时候已经分配了一块连续的内存,系统支持的最大定时器个数由los\_config.h中的LOSCFG\_BASE\_CORE\_SWTMR\_LIMIT宏配置。软件定时器使用了系统的一个队列和一个任务资源,软件定时器的触发遵循队列规则,先进先出。同一时刻设置的定时时间短的定时器总是比定时时间长的靠近队列头,满足优先被触发的准则。软件定时器以Tick为基本计时单位,当用户创建并启动一个软件定时器时,OpenHarmony系统会根据当前系统Tick时间及用户设置的定时间隔确定该定时器的到期Tick时间,并将该定时器控制结构挂入计时全局链表。 + +当Tick中断到来时,在Tick中断处理函数中扫描软件定时器的计时全局链表,看是否有定时器超时,若有则将超时的定时器记录下来。 + +Tick中断处理函数结束后,软件定时器任务(优先级为最高)被唤醒,在该任务中调用之前记录下来的定时器的超时回调函数。 + +定时器状态 + +- OS\_SWTMR\_STATUS\_UNUSED(未使用) + + 系统在定时器模块初始化的时候将系统中所有定时器资源初始化成该状态。 + +- OS\_SWTMR\_STATUS\_CREATED(创建未启动/停止) + + 在未使用状态下调用LOS\_SwtmrCreate接口或者启动后调用LOS\_SwtmrStop接口后,定时器将变成该状态。 + +- OS\_SWTMR\_STATUS\_TICKING(计数) + + 在定时器创建后调用LOS\_SwtmrStart接口,定时器将变成该状态,表示定时器运行时的状态。 + + +定时器模式 + +OpenHarmony系统的软件定时器提供三类定时器机制: + +- 第一类是单次触发定时器,这类定时器在启动后只会触发一次定时器事件,然后定时器自动删除。 +- 第二类是周期触发定时器,这类定时器会周期性的触发定时器事件,直到用户手动停止定时器,否则将永远持续执行下去。 +- 第三类也是单次触发定时器,但与第一类不同之处在于这类定时器超时后不会自动删除,需要调用定时器删除接口删除定时器。 + +## 开发指导 + +### 接口说明 + +OpenHarmony LiteOS-A内核的软件定时器模块提供下面几种功能,接口详细信息可以查看API参考。 + +**表 1** 软件定时器接口说明 + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

创建、删除定时器

+

LOS_SwtmrCreate

+

创建软件定时器

+

LOS_SwtmrDelete

+

删除软件定时器

+

启动、停止定时器

+

LOS_SwtmrStart

+

启动软件定时器

+

LOS_SwtmrStop

+

停止软件定时器

+

获得软件定时剩余Tick数

+

LOS_SwtmrTimeGet

+

获得软件定时器剩余Tick数

+
+ +### 开发流程 + +软件定时器的典型开发流程: + +1. 配置软件定时器。 + - 确认配置项LOSCFG\_BASE\_CORE\_SWTMR和LOSCFG\_BASE\_IPC\_QUEUE为打开状态; + - 配置LOSCFG\_BASE\_CORE\_SWTMR\_LIMIT最大支持的软件定时器数; + - 配置OS\_SWTMR\_HANDLE\_QUEUE\_SIZE软件定时器队列最大长度; + +2. 创建定时器LOS\_SwtmrCreate。 + - 创建一个指定计时时长、指定超时处理函数、指定触发模式的软件定时器; + - 返回函数运行结果,成功或失败; + +3. 启动定时器LOS\_SwtmrStart。 +4. 获得软件定时器剩余Tick数LOS\_SwtmrTimeGet。 +5. 停止定时器LOS\_SwtmrStop。 +6. 删除定时器LOS\_SwtmrDelete。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 软件定时器的回调函数中不要做过多操作,不要使用可能引起任务挂起或者阻塞的接口或操作。 +>- 软件定时器使用了系统的一个队列和一个任务资源,软件定时器任务的优先级设定为0,且不允许修改 。 +>- 系统可配置的软件定时器资源个数是指:整个系统可使用的软件定时器资源总个数,而并非是用户可使用的软件定时器资源个数。例如:系统软件定时器多占用一个软件定时器资源数,那么用户能使用的软件定时器资源就会减少一个。 +>- 创建单次软件定时器,该定时器超时执行完回调函数后,系统会自动删除该软件定时器,并回收资源。 +>- 创建单次不自删除属性的定时器,用户需要调用定时器删除接口删除定时器,回收定时器资源,避免资源泄露。 + +### 编程实例 + +**前置条件** + +- 在los\_config.h中,将LOSCFG\_BASE\_CORE\_SWTMR配置项打开。 +- 配置好LOSCFG\_BASE\_CORE\_SWTMR\_LIMIT最大支持的软件定时器数。 +- 配置好OS\_SWTMR\_HANDLE\_QUEUE\_SIZE软件定时器队列最大长度。 + +**编程示例** + +``` +#include "los_swtmr.h" + +void Timer1_Callback(uint32_t arg); +void Timer2_Callback(uint32_t arg); + +UINT32 g_timercount1 = 0; +UINT32 g_timercount2 = 0; + +void Timer1_Callback(uint32_t arg) // 回调函数1 +{ + unsigned long tick_last1; + g_timercount1++; + tick_last1=(UINT32)LOS_TickCountGet(); // 获取当前Tick数 + PRINTK("g_timercount1=%d\n",g_timercount1); + PRINTK("tick_last1=%d\n",tick_last1); +} + +void Timer2_Callback(uint32_t arg) // 回调函数2 +{ + unsigned long tick_last2; + tick_last2=(UINT32)LOS_TickCountGet(); + g_timercount2 ++; + PRINTK("g_timercount2=%d\n",g_timercount2); + PRINTK("tick_last2=%d\n",tick_last2); +} + +void Timer_example(void) +{ + UINT16 id1; + UINT16 id2; // timer id + UINT32 uwTick; + + /* 创建单次软件定时器,Tick数为1000,启动到1000Tick数时执行回调函数1 */ + LOS_SwtmrCreate (1000, LOS_SWTMR_MODE_ONCE, Timer1_Callback, &id1, 1); + + /* 创建周期性软件定时器,每100Tick数执行回调函数2 */ + LOS_SwtmrCreate(100, LOS_SWTMR_MODE_PERIOD, Timer2_Callback, &id2, 1); + PRINTK("create Timer1 success\n"); + + LOS_SwtmrStart (id1); //启动单次软件定时器 + dprintf("start Timer1 success\n"); + LOS_TaskDelay(200); // 延时200Tick数 + LOS_SwtmrTimeGet(id1, &uwTick); // 获得单次软件定时器剩余Tick数 + PRINTK("uwTick =%d\n", uwTick); + + LOS_SwtmrStop(id1); // 停止软件定时器 + PRINTK("stop Timer1 success\n"); + + LOS_SwtmrStart(id1); + LOS_TaskDelay(1000); + LOS_SwtmrDelete(id1); // 删除软件定时器 + PRINTK("delete Timer1 success\n"); + + LOS_SwtmrStart(id2); // 启动周期性软件定时器 + PRINTK("start Timer2\n"); + + LOS_TaskDelay(1000); + LOS_SwtmrStop(id2); + LOS_SwtmrDelete(id2); +} +``` + +**运行结果** + +``` +create Timer1 success +start Timer1 success +uwTick =800 +stop Timer1 success +g_timercount1=1 +tick_last1=1201 +delete Timer1 success +start Timer2 +g_timercount2 =1 +tick_last1=1301 +g_timercount2 =2 +tick_last1=1401 +g_timercount2 =3 +tick_last1=1501 +g_timercount2 =4 +tick_last1=1601 +g_timercount2 =5 +tick_last1=1701 +g_timercount2 =6 +tick_last1=1801 +g_timercount2 =7 +tick_last1=1901 +g_timercount2 =8 +tick_last1=2001 +g_timercount2 =9 +tick_last1=2101 +g_timercount2 =10 +tick_last1=2201 +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-trans-things.md b/zh-cn/device-dev/kernel/kernel-small-basic-trans-things.md new file mode 100644 index 0000000000000000000000000000000000000000..88bcb9eb611198aad05c2ac94d823b373d9c9b77 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-trans-things.md @@ -0,0 +1,251 @@ +# 事件 + +- [基本概念](#section122115620816) +- [运行机制](#section94611116593) + - [事件控制块](#section1161415384467) + - [事件运作原理](#section187761153144617) + +- [开发指导](#section44744471891) + - [接口说明](#section172373513919) + - [开发流程](#section1118215161013) + - [编程实例](#section19986143311020) + - [实例描述](#section128221510145718) + - [编程示例](#section71507479577) + - [结果验证](#section16570171645813) + + +## 基本概念 + +事件(Event)是一种任务间通信的机制,可用于任务间的同步。 + +多任务环境下,任务之间往往需要同步操作,一个等待即是一个同步。事件可以提供一对多、多对多的同步操作。 + +- 一对多同步模型:一个任务等待多个事件的触发。可以是任意一个事件发生时唤醒任务处理事件,也可以是几个事件都发生后才唤醒任务处理事件。 +- 多对多同步模型:多个任务等待多个事件的触发。 + +OpenHarmony LiteOS-A的事件模块提供的事件,具有如下特点: + +- 任务通过创建事件控制块来触发事件或等待事件。 +- 事件间相互独立,内部实现为一个32位无符号整型,每一位标识一种事件类型。第25位不可用,因此最多可支持31种事件类型。 +- 事件仅用于任务间的同步,不提供数据传输功能。 +- 多次向事件控制块写入同一事件类型,在被清零前等效于只写入一次。 +- 多个任务可以对同一事件进行读写操作。 +- 支持事件读写超时机制。 + +## 运行机制 + +### 事件控制块 + +``` +/** + * 事件控制块数据结构 + */ +typedef struct tagEvent { + UINT32 uwEventID; /* 事件集合,表示已经处理(写入和清零)的事件集合 */ + LOS_DL_LIST stEventList; /* 等待特定事件的任务链表 */ +} EVENT_CB_S, *PEVENT_CB_S; +``` + +### 事件运作原理 + +**事件初始化:**会创建一个事件控制块,该控制块维护一个已处理的事件集合,以及等待特定事件的任务链表。 + +**写事件:**会向事件控制块写入指定的事件,事件控制块更新事件集合,并遍历任务链表,根据任务等待具体条件满足情况决定是否唤醒相关任务。 + +**读事件:**如果读取的事件已存在时,会直接同步返回。其他情况会根据超时时间以及事件触发情况,来决定返回时机:等待的事件条件在超时时间耗尽之前到达,阻塞任务会被直接唤醒,否则超时时间耗尽该任务才会被唤醒。 + +读事件条件满足与否取决于入参eventMask和mode,eventMask即需要关注的事件类型掩码。mode是具体处理方式,分以下三种情况: + +- LOS\_WAITMODE\_AND:逻辑与,基于接口传入的事件类型掩码eventMask,只有这些事件都已经发生才能读取成功,否则该任务将阻塞等待或者返回错误码。。 +- LOS\_WAITMODE\_OR:逻辑或,基于接口传入的事件类型掩码eventMask,只要这些事件中有任一种事件发生就可以读取成功,否则该任务将阻塞等待或者返回错误码。 +- LOS\_WAITMODE\_CLR:这是一种附加读取模式,需要与所有事件模式或任一事件模式结合使用(LOS\_WAITMODE\_AND | LOS\_WAITMODE\_CLR或 LOS\_WAITMODE\_OR | LOS\_WAITMODE\_CLR)。在这种模式下,当设置的所有事件模式或任一事件模式读取成功后,会自动清除事件控制块中对应的事件类型位。 + +**事件清零:**根据指定掩码,去对事件控制块的事件集合进行清零操作。当掩码为0时,表示将事件集合全部清零。当掩码为0xffff时,表示不清除任何事件,保持事件集合原状。 + +**事件销毁:**销毁指定的事件控制块。 + +**图 1** 事件运作原理图 +![](figure/事件运作原理图-20.png "事件运作原理图-20") + +## 开发指导 + +### 接口说明 + +OpenHarmony LiteOS-A内核的事件模块提供下面几种功能。 + +**表 1** 事件模块接口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

初始化事件

+

LOS_EventInit

+

初始化一个事件控制块

+

读/写事件

+

LOS_EventRead

+

读取指定事件类型,超时时间为相对时间:单位为Tick

+

LOS_EventWrite

+

写指定的事件类型

+

清除事件

+

LOS_EventClear

+

清除指定的事件类型

+

校验事件掩码

+

LOS_EventPoll

+

根据用户传入的事件ID、事件掩码及读取模式,返回用户传入的事件是否符合预期

+

销毁事件

+

LOS_EventDestroy

+

销毁指定的事件控制块

+
+ +### 开发流程 + +事件的典型开发流程: + +1. 初始化事件控制块 +2. 阻塞读事件控制块 +3. 写入相关事件 +4. 阻塞任务被唤醒,读取事件并检查是否满足要求 +5. 处理事件控制块 +6. 事件控制块销毁 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 进行事件读写操作时,事件的第25位为保留位,不可以进行位设置。 +>- 对同一事件反复写入,算作一次写入。 + +### 编程实例 + +### 实例描述 + +示例中,任务Example\_TaskEntry创建一个任务Example\_Event,Example\_Event读事件阻塞,Example\_TaskEntry向该任务写事件。可以通过示例日志中打印的先后顺序理解事件操作时伴随的任务切换。 + +1. 在任务Example\_TaskEntry创建任务Example\_Event,其中任务Example\_Event优先级高于Example\_TaskEntry。 +2. 在任务Example\_Event中读事件0x00000001,阻塞,发生任务切换,执行任务Example\_TaskEntry。 +3. 在任务Example\_TaskEntry向任务Example\_Event写事件0x00000001,发生任务切换,执行任务Example\_Event。 +4. Example\_Event得以执行,直到任务结束。 +5. Example\_TaskEntry得以执行,直到任务结束。 + +### 编程示例 + +示例代码如下: + +``` +#include "los_event.h" +#include "los_task.h" +#include "securec.h" + +/* 任务ID */ +UINT32 g_testTaskId; + +/* 事件控制结构体 */ +EVENT_CB_S g_exampleEvent; + +/* 等待的事件类型 */ +#define EVENT_WAIT 0x00000001 + +/* 用例任务入口函数 */ +VOID Example_Event(VOID) +{ + UINT32 event; + + /* 超时等待方式读事件,超时时间为100 ticks, 若100 ticks后未读取到指定事件,读事件超时,任务直接唤醒 */ + printf("Example_Event wait event 0x%x \n", EVENT_WAIT); + + event = LOS_EventRead(&g_exampleEvent, EVENT_WAIT, LOS_WAITMODE_AND, 100); + if (event == EVENT_WAIT) { + printf("Example_Event,read event :0x%x\n", event); + } else { + printf("Example_Event,read event timeout\n"); + } +} + +UINT32 Example_EventEntry(VOID) +{ + UINT32 ret; + TSK_INIT_PARAM_S task1; + + /* 事件初始化 */ + ret = LOS_EventInit(&g_exampleEvent); + if (ret != LOS_OK) { + printf("init event failed .\n"); + return -1; + } + + /* 创建任务 */ + (VOID)memset_s(&task1, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); + task1.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_Event; + task1.pcName = "EventTsk1"; + task1.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; + task1.usTaskPrio = 5; + ret = LOS_TaskCreate(&g_testTaskId, &task1); + if (ret != LOS_OK) { + printf("task create failed.\n"); + return LOS_NOK; + } + + /* 写g_testTaskId 等待事件 */ + printf("Example_TaskEntry write event.\n"); + + ret = LOS_EventWrite(&g_exampleEvent, EVENT_WAIT); + if (ret != LOS_OK) { + printf("event write failed.\n"); + return LOS_NOK; + } + + /* 清标志位 */ + printf("EventMask:%d\n", g_exampleEvent.uwEventID); + LOS_EventClear(&g_exampleEvent, ~g_exampleEvent.uwEventID); + printf("EventMask:%d\n", g_exampleEvent.uwEventID); + + /* 删除任务 */ + ret = LOS_TaskDelete(g_testTaskId); + if (ret != LOS_OK) { + printf("task delete failed.\n"); + return LOS_NOK; + } + + return LOS_OK; +} +``` + +### 结果验证 + +编译运行得到的结果为: + +``` +Example_Event wait event 0x1 +Example_TaskEntry write event. +Example_Event,read event :0x1 +EventMask:1 +EventMask:0 +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-trans-users.md b/zh-cn/device-dev/kernel/kernel-small-basic-trans-users.md new file mode 100644 index 0000000000000000000000000000000000000000..ded2f238253d83ba7a670cf0193ceeb7bf4b494c --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-trans-users.md @@ -0,0 +1,64 @@ +# 用户态快速互斥锁 + +- [基本概念](#section643519912920) +- [运行机制](#section16834132502910) + +## 基本概念 + +Futex\(Fast userspace mutex,用户态快速互斥锁\)是内核提供的一种系统调用能力,通常作为基础组件与用户态的相关锁逻辑结合组成用户态锁,是一种用户态与内核态共同作用的锁,例如用户态mutex锁、barrier与cond同步锁、读写锁。其用户态部分负责锁逻辑,内核态部分负责锁调度。 + +当用户态线程请求锁时,先在用户态进行锁状态的判断维护,若此时不产生锁的竞争,则直接在用户态进行上锁返回;反之,则需要进行线程的挂起操作,通过Futex系统调用请求内核介入来挂起线程,并维护阻塞队列。 + +当用户态线程释放锁时,先在用户态进行锁状态的判断维护,若此时没有其他线程被该锁阻塞,则直接在用户态进行解锁返回;反之,则需要进行阻塞线程的唤醒操作,通过Futex系统调用请求内核介入来唤醒阻塞队列中的线程。 + +## 运行机制 + +当用户态产生锁的竞争或释放需要进行相关线程的调度操作时,会触发Futex系统调用进入内核,此时会将用户态锁的地址传入内核,并在内核的Futex中以锁地址来区分用户态的每一把锁,因为用户态可用虚拟地址空间为1GiB,为了便于查找、管理,内核Futex采用哈希桶来存放用户态传入的锁。 + +当前哈希桶共有80个,0\~63号桶用于存放私有锁(以虚拟地址进行哈希),64\~79号桶用于存放共享锁(以物理地址进行哈希),私有/共享属性通过用户态锁的初始化以及Futex系统调用入参确定。 + +**图 1** Futex设计图 +![](figure/Futex设计图.jpg "Futex设计图") + +如图1,每个futex哈希桶中存放被futex\_list串联起来的哈希值相同的futex node,每个futex node对应一个被挂起的task,node中key值唯一标识一把用户态锁,具有相同key值的node被queue\_list串联起来表示被同一把锁阻塞的task队列。 + +Futex有以下三种操作: + +**表 1** Futex模块接口 + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

设置线程等待

+

OsFutexWait

+

向Futex表中插入代表被阻塞的线程的node

+

唤醒被阻塞线程

+

OsFutexWake

+

唤醒一个被指定锁阻塞的线程

+

调整锁的地址

+

OsFutexRequeue

+

调整指定锁在Futex表中的位置

+
+ +>![](../public_sys-resources/icon-note.gif) **说明:** +>Futex系统调用通常与用户态逻辑共同组成用户态锁,故推荐使用用户态POSIX接口的锁。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic-trans.md b/zh-cn/device-dev/kernel/kernel-small-basic-trans.md new file mode 100644 index 0000000000000000000000000000000000000000..c4a2feb0dcf85786aa21f0ee356c1878942993eb --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic-trans.md @@ -0,0 +1,17 @@ +# 内核通信机制 + +- **[事件](kernel-small-basic-trans-things.md)** + +- **[信号量](kernel-small-basic-trans-info.md)** + +- **[互斥锁](kernel-small-basic-trans-locks.md)** + +- **[消息队列](kernel-small-basic-trans-lines.md)** + +- **[读写锁](kernel-small-basic-trans-reading.md)** + +- **[用户态快速互斥锁](kernel-small-basic-trans-users.md)** + +- **[信号](kernel-small-basic-trans-sign.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-basic.md b/zh-cn/device-dev/kernel/kernel-small-basic.md new file mode 100644 index 0000000000000000000000000000000000000000..fbfa9ffc3fe6003c52844e624aa2455411a50be3 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-basic.md @@ -0,0 +1,17 @@ +# 基础内核 + +- **[中断及异常处理](kernel-small-basic-breakdeal.md)** + +- **[进程管理](kernel-small-basic-manage.md)** + +- **[内存管理](kernel-small-basic-inner.md)** + +- **[内核通信机制](kernel-small-basic-trans.md)** + +- **[时间管理](kernel-small-basic-time.md)** + +- **[软件定时器](kernel-small-basic-trans-soft.md)** + +- **[原子操作](kernel-small-basic-atom.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-file-newsys.md b/zh-cn/device-dev/kernel/kernel-small-bundles-file-newsys.md new file mode 100644 index 0000000000000000000000000000000000000000..ab54b352edf91fb5287598072375905dfcc99932 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-file-newsys.md @@ -0,0 +1,223 @@ +# 适配新的文件系统 + +- [基本概念](#section19480121811422) +- [适配Mount接口](#section147051940104212) +- [适配Lookup接口](#section11930181394317) +- [适配总结和注意事项](#section5617183014319) + +## 基本概念 + +所谓对接VFS层,其实就是指实现VFS层定义的若干接口函数,可根据文件系统的特点和需要适配其中部分接口。一般情况下,支持文件读写,最小的文件系统适配看起来是这样的: + +``` +struct MountOps g_yourFsMountOps = { + .Mount = YourMountMethod, +}; + +struct file_operations_vfs g_yourFsFileOps = { + .read = YourReadMethod, + .write = YourWriteMethod, +} + +struct VnodeOps g_yourFsVnodeOps = { + .Create = YourCreateMethod; + .Lookup = YourLookupMethod; + .Reclaim = YourReclaimMethod; +}; + +FSMAP_ENTRY(yourfs_fsmap, "your fs name", g_yourFsMountOps, TRUE, TRUE); // 注册文件系统 +``` + +>![](../public_sys-resources/icon-note.gif) **说明:** +>1. open和close接口不是必须要实现的接口,因为这两个接口是对文件的操作,对下层的文件系统一般是不感知的,只有当要适配的文件系统需要在open和close时做一些特别的操作时,才需要实现。 +>2. 适配文件系统,对基础知识的要求较高,适配者需要对要适配的文件系统的原理和实现具有深刻的理解,本节中不会事无巨细地介绍相关的基础知识,如果您在适配的过程中遇到疑问,建议参考kernel/liteos\_a/fs目录下已经适配好的文件系统的代码,可能就会豁然开朗。 + +## 适配Mount接口 + +Mount是文件系统第一个被调用的接口,该接口一般会读取驱动的参数,根据配置对文件系统的进行初始化,最后生成文件系统的root节点。Mount接口的定义如下: + +``` +int (*Mount)(struct Mount *mount, struct Vnode *blkDriver, const void *data); +``` + +其中,第一个参数struct Mount \*mount是Mount点的信息,适配时需要填写的是下面的变量: + +``` +struct Mount { + const struct MountOps *ops; /* Mount相关的函数钩子 */ + struct Vnode *vnodeCovered; /* Mount之后的文件系统root节点 */ + void *data; /* Mount点的私有数据 */ +}; +``` + +第二个参数struct Vnode \*blkDriver是驱动节点,可以通过这个节点访问驱动。 + +第三个参数const void \*data是mount命令传入的数据,可以根据文件系统的需要处理。 + +下面以JFFS2为例,详细看一下mount接口是如何适配的: + +``` +int VfsJffs2Bind(struct Mount *mnt, struct Vnode *blkDriver, const void *data) +{ + int ret; + int partNo; + mtd_partition *p = NULL; + struct MtdDev *mtd = NULL; + struct Vnode *pv = NULL; + struct jffs2_inode *rootNode = NULL; + + LOS_MuxLock(&g_jffs2FsLock, (uint32_t)JFFS2_WAITING_FOREVER); + + /* 首先是从驱动节点中获取文件系统需要的信息,例如jffs2读取的是分区的编号 */ + p = (mtd_partition *)((struct drv_data *)blkDriver->data)->priv; + mtd = (struct MtdDev *)(p->mtd_info); + + if (mtd == NULL || mtd->type != MTD_NORFLASH) { + LOS_MuxUnlock(&g_jffs2FsLock); + return -EINVAL; + } + + partNo = p->patitionnum; + + /* 然后生成一个文件系统的根Vnode,这里注意不要搞混rootNode和根Vnode,rootNode类型是inode,是jffs2内部维护的私有数据,而Vnode是VFS的概念,是通用的文件节点, + 这一步实际上就是把文件系统内部的私有信息保存到Vnode中,这样就可以通过Vnode直接找到文件系统中的对应文件。 + */ + ret = jffs2_mount(partNo, &rootNode); + if (ret != 0) { + LOS_MuxUnlock(&g_jffs2FsLock); + return ret; + } + + ret = VnodeAlloc(&g_jffs2Vops, &pv); + if (ret != 0) { + LOS_MuxUnlock(&g_jffs2FsLock); + goto ERROR_WITH_VNODE; + } + + /* 下面这段填写的是关于这个Vnode对应文件的相关信息,uid\gid\mode这部分信息,有的文件系统可能不支持,可以不填 */ + pv->type = VNODE_TYPE_DIR; + pv->data = (void *)rootNode; + pv->originMount = mnt; + pv->fop = &g_jffs2Fops; + mnt->data = p; + mnt->vnodeCovered = pv; + pv->uid = rootNode->i_uid; + pv->gid = rootNode->i_gid; + pv->mode = rootNode->i_mode; + + /* 这里的HashInsert是为了防止重复生成已经生成过的Vnode, 第二个参数一般会选择本文件系统内可以唯一确定某一个文件的信息,例如这里是jffs2内部inode的地址 */ + (void)VfsHashInsert(pv, rootNode->i_ino); + + g_jffs2PartList[partNo] = blkDriver; + + LOS_MuxUnlock(&g_jffs2FsLock); + + return 0; +ERROR_WITH_VNODE: + return ret; +} +... +... +const struct MountOps jffs_operations = { + .Mount = VfsJffs2Bind, + ... + ... +}; +``` + +总结: + +1. 首先从驱动节点中获取需要的私有信息。 +2. 根据私有信息,生成文件系统的根节点。 + +## 适配Lookup接口 + +Lookup是查找文件的接口,它的函数原型是: + +``` +int (*Lookup)(struct Vnode *parent, const char *name, int len, struct Vnode **vnode); +``` + +很好理解,就是从父节点parent开始,根据文件名name和文件名长度len,查找到对应的vnode返回给上层。 + +这个接口适配起来思路很清晰,给了父节点的信息和文件名,实现从父目录中查询名字为name的文件这个功能,同样以JFFS2为例: + +``` +int VfsJffs2Lookup(struct Vnode *parentVnode, const char *path, int len, struct Vnode **ppVnode) +{ + int ret; + struct Vnode *newVnode = NULL; + struct jffs2_inode *node = NULL; + struct jffs2_inode *parentNode = NULL; + + LOS_MuxLock(&g_jffs2FsLock, (uint32_t)JFFS2_WAITING_FOREVER); + + /* 首先从private data中提取父节点的信息 */ + parentNode = (struct jffs2_inode *)parentVnode->data; + + /* 然后查询得到目标节点的信息,注意这里调用的jffs2_lookup是jffs2本身的查询函数,每个文件系统都有自己的查询函数,通过父节点的信息和VFS的查询函数对接起来 */ + node = jffs2_lookup(parentNode, (const unsigned char *)path, len); + if (!node) { + LOS_MuxUnlock(&g_jffs2FsLock); + return -ENOENT; + } + + /* 接着先校验一下查找到的目标是否已经有现成的vnode了,这里对应之前提到的VfsHashInsert */ + (void)VfsHashGet(parentVnode->originMount, node->i_ino, &newVnode, NULL, NULL); + LOS_MuxUnlock(&g_jffs2FsLock); + if (newVnode) { + newVnode->parent = parentVnode; + *ppVnode = newVnode; + return 0; + } + + /* 如果vnode不存在,就新生成一个vnode,并填写相关信息 */ + ret = VnodeAlloc(&g_jffs2Vops, &newVnode); + if (ret != 0) { + PRINT_ERR("%s-%d, ret: %x\n", __FUNCTION__, __LINE__, ret); + (void)jffs2_iput(node); + LOS_MuxUnlock(&g_jffs2FsLock); + return ret; + } + + Jffs2SetVtype(node, newVnode); + newVnode->fop = parentVnode->fop; + newVnode->data = node; + newVnode->parent = parentVnode; + newVnode->originMount = parentVnode->originMount; + newVnode->uid = node->i_uid; + newVnode->gid = node->i_gid; + newVnode->mode = node->i_mode; + + /* 同时不要忘记将新生成的vnode插入hashtable中 */ + (void)VfsHashInsert(newVnode, node->i_ino); + + *ppVnode = newVnode; + + LOS_MuxUnlock(&g_jffs2FsLock); + return 0; +} +``` + +总结: + +1. 从父节点获取私有数据; +2. 根据私有信息查询到目标文件的私有数据; +3. 通过目标文件的私有数据生成目标Vnode。 + +## 适配总结和注意事项 + +通过上面两个接口的适配,其实可以发现一个规律,不管是什么接口,基本都遵循下面的适配步骤: + +1. 通过入参的vnode获取文件系统所需的私有数据。 +2. 使用私有数据完成接口的功能。 +3. 将结果包装成vnode或接口要求的其他返回格式,返回给上层。 + +核心的逻辑其实在使用私有数据完成接口的功能,这些接口都是些文件系统的通用功能,文件系统在移植前本身应该都有相应实现,所以关键是归纳总结出文件系统所需的私有数据是什么,将其存储在vnode中,供之后使用。一般情况下,私有数据的内容是可以唯一定位到文件在存储介质上位置的信息,大部分文件系统本身都会有类似数据结构可以直接使用,比如JFFS2的inode数据结构。 + +>![](../public_sys-resources/icon-caution.gif) **注意:** +>1. 文件系统中的Lookup接口不是访问文件必经的路径,仅在上层路径缓存失效时才会调用到。 +>2. 通过VfsHashGet找到了已经存在的Vnode,不要直接将其作为结果返回,其储存的信息可能已经失效,请更新相应字段后再返回。 +>3. Vnode会根据内存占用在后台自动释放,需要持久保存的信息,不要只保存在Vnode中。 +>4. Reclaim接口在Vnode释放时会自动调用,请在这个接口中释放私有数据中的资源。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-fat.md b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-fat.md new file mode 100644 index 0000000000000000000000000000000000000000..b9e1636f26c174ff15d1799eb40f3839503f75d5 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-fat.md @@ -0,0 +1,45 @@ +# FAT + +- [基本概念](#section621393911385) +- [运行机制](#section10796155213381) +- [开发指导](#section144094483919) + - [开发流程](#section139086116394) + + +## 基本概念 + +FAT文件系统是File Allocation Table(文件配置表)的简称,主要包括DBR区、FAT区、DATA区三个区域。其中,FAT区各个表项记录存储设备中对应簇的信息,包括簇是否被使用、文件下一个簇的编号、是否文件结尾等。FAT文件系统有FAT12、FAT16、FAT32等多种格式,其中,12、16、32表示对应格式中FAT表项的字节数,它们同时也限制了文件系统中的最大文件大小。FAT文件系统支持多种介质,特别在可移动存储介质(U盘、SD卡、移动硬盘等)上广泛使用,使嵌入式设备和Windows、Linux等桌面系统保持很好的兼容性,方便用户管理操作文件。 + +OpenHarmony内核支持FAT12、FAT16与FAT32三种格式的FAT文件系统,具有代码量小、资源占用小、可裁切、支持多种物理介质等特性,并且与Windows、Linux等系统保持兼容,支持多设备、多分区识别等功能。OpenHarmony内核支持硬盘多分区,可以在主分区以及逻辑分区上创建FAT文件系统。 + +## 运行机制 + +FAT文件系统设计与物理布局的相关文档在互联网上非常丰富,请开发者自行搜索查看。 + +OpenHarmony LiteOS-A内核通过Bcache提升FAT文件系统性能,Bcache是block cache的简称。当发生读写时,Bcache会缓存读写扇区附近的扇区,以减少I/O次数,提高性能。Bcache的基本缓存单位为block,每个block大小一致(默认有28个block,每个block缓存64个扇区的数据)。当Bcache脏块率(脏扇区数/总扇区数)达到阈值时,会触发写回;如果脏块率未达到阈值,则不会将缓存数据写回磁盘。如果需要保证数据写回,开发者应当调用sync和fsync触发写回。FAT文件系统的部分接口也会触发写回操作(如close、umount等),但开发者不应当基于这些接口触发写回。 + +## 开发指导 + +### 开发流程 + +基本使用流程为挂载→操作→卸载。 + +SD卡或MMC的设备名为mmcblk\[x\]p\[y\],文件系统类型为“vfat”。 + +示例: + +``` +mount("/dev/mmcblk0p0", "/mnt", "vfat", 0, NULL); +``` + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- FAT文件系统中,单个文件不能大于4 GiB。 +>- 当有两个SD卡插槽时,卡0和卡1不固定,先插上的为卡0,后插上的为卡1。 +>- 当多分区功能打开,存在多分区的情况下,卡0注册的设备节点/dev/mmcblk0\(主设备\)和/dev/mmcblk0p0\(次设备\)是同一个设备,禁止对主设备进行操作。 +>- 为避免SD卡使用异常或内存泄漏,SD卡使用过程中拔卡,用户必须先关闭正处于打开状态的文件和目录,并且卸载挂载节点。 +>- 在format操作之前,需要首先umount挂载点。 +>- 当Bcache功能生效时,需要注意: +> - 当mount函数的入参为MS\_NOSYNC时,FAT不会主动将cache的内容写回存储器件。FAT的如下接口(open、close、 unlink、rename、mkdir、rmdir、truncate)不会自动进行sync操作,速度可以提升,但是需要上层主动调用sync来进行数据同步,否则可能会数据丢失。 +> - Bcache有定时写回功能。在menuconfig中开启LOSCFG\_FS\_FAT\_CACHE\_SYNC\_THREAD选项,打开后系统会创建一个任务定时写回Bcache中的数据,默认每隔5秒检查Bcache中脏数据块比例,超过80%时进行sync操作,将Bcache中的脏数据全部写回磁盘。任务优先级、刷新时间间隔以及脏数据块比例的阈值可分别通过接口LOS\_SetSyncThreadPrio、 LOS\_SetSyncThreadInterval和LOS\_SetDirtyRatioThreshold设置。 +> - 当前cache的默认大小为28个块,每个块64个扇区。 + diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-file-jffs.md b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-jffs2.md similarity index 41% rename from zh-cn/device-dev/kernel/kernel-lite-small-file-jffs.md rename to zh-cn/device-dev/kernel/kernel-small-bundles-file-support-jffs2.md index defb65f939aaa847762a7d94a516cf5bb6b75a1a..439c2cdeaeacfa959ecec65fa30f3c07fc683e67 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-file-jffs.md +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-jffs2.md @@ -1,128 +1,32 @@ -# JFFS2 +# JFFS2 -- [概述](#section01261544730) -- [注意事项](#section94343420) -- [开发指导](#section14979101812411) +- [基本概念](#section11411110155919) +- [运行机制](#section23911025195913) +- [开发指导](#section179711119014) -## 概述 +## 基本概念 -JFFS2是Journalling Flash File System Version 2(日志文件系统)的缩写,是MTD设备上实现的日志型文件系统。JFFS2主要应用于NOR FLASH,其特点是:可读写、支持数据压缩、提供了崩溃/掉电安全保护、提供“写平衡”支持等。 +JFFS2是Journalling Flash File System Version 2(日志文件系统)的缩写,是针对MTD设备的日志型文件系统。 -闪存与磁盘介质有许多差异,因此直接将磁盘文件系统运行在闪存上存在性能和安全性上的不足。为解决这一问题,需要实现一个特别针对闪存的文件系统,JFFS2就是这样一种文件系统。 +OpenHarmony内核的JFFS2主要应用于NOR FLASH闪存,其特点是:可读写、支持数据压缩、提供了崩溃/掉电安全保护、提供“写平衡”支持等。闪存与磁盘介质有许多差异,直接将磁盘文件系统运行在闪存设备上,会导致性能和安全问题。为解决这一问题,需要实现一个特别针对闪存的文件系统,JFFS2就是这样一种文件系统。 -OpenHarmony内核的JFFS2主要应用于对NOR Flash闪存的文件管理,并且支持多分区。 +## 运行机制 -## 注意事项 +关于JFFS2文件系统的在存储设备上的实际物理布局,及文件系统本身的规格说明,请参考JFFS2的[官方规格说明文档](https://sourceware.org/jffs2/)。 -- 目前JFFS2文件系统用于NOR Flash,最终调用NOR Flash驱动接口,因此使用JFFS2文件系统之前要确保硬件上有NOR Flash,且驱动初始化成功(spinor\_init\(\)返回0)。 +这里仅列举几个对开发者和使用者会有一定影响的JFFS2的重要机制/特征: -- 系统会自动对起始地址和分区大小根据block大小进行对齐操作。有效的分区号为0\~19。 +1. Mount机制及速度问题:按照JFFS2的设计,所有的文件会按照一定的规则,切分成大小不等的节点,依次存储到flash设备上。在mount流程中,需要获取到所有的这些节点信息并缓存到内存里。因此,mount速度和flash设备的大小和文件数量的多少成线性比例关系。这是JFFS2的原生设计问题,对于mount速度非常介意的用户,可以在内核编译时开启“Enable JFFS2 SUMMARY”选项,可以极大提升mount的速度。这个选项的原理是将mount需要的信息提前存储到flash上,在mount时读取并解析这块内容,使得mount的速度变得相对恒定。这个实际是空间换时间的做法,会消耗8%左右的额外空间。 +2. 写平衡的支持:由于flash设备的物理属性,读写都只能基于某个特定大小的“块”进行,为了防止某些特定的块磨损过于严重,在JFFS2中需要对写入的块进行“平衡”的管理,保证所有的块的写入次数都是相对平均的,进而保证flash设备的整体寿命。 +3. GC\(garbage collection\)机制:在JFFS2里发生删除动作,实际的物理空间并不会立即释放,而是由独立的GC线程来做空间整理和搬移等GC动作,和所有的GC机制一样,在JFFS2里的GC会对瞬时的读写性能有一定影响。另外,为了有空间能被用来做空间整理,JFFS2会对每个分区预留3块左右的空间,这个空间是用户不可见的。 +4. 压缩机制:当前使用的JFFS2,底层会自动的在每次读/写时进行解压/压缩动作,实际IO的大小和用户请求读写的大小并不会一样。特别在写入时,不能通过写入大小来和flash剩余空间的大小来预估写入一定会成功或者失败。 +5. 硬链接机制:JFFS2支持硬链接,底层实际占用的物理空间是一份,对于同一个文件的多个硬连接,并不会增加空间的占用;反之,只有当删除了所有的硬链接时,实际物理空间才会被释放。 -- 目前支持mkfs.jffs2工具,用户可根据自己实际情况修改参数值,其他用法用户可自行搜索查看。 +## 开发指导 -- open打开一个文件,参数有O\_TRUNC时,会将文件中的内容清空。 +对于基于JFFS2和nor flash的开发,总体而言,与其他文件系统非常相似,因为都有VFS层来屏蔽了具体文件系统的差异,对外接口体现也都是标准的POSIX接口。 -- 目前JFFS2文件系统支持的操作有:open, close, read, write, seek, opendir, closedir, readdir, readdir\_r, rewinddir, statfs, sync, remove, unlink, mkdir, rmdir, rename, stat, stat64, seek64, mmap, mount, umount, chmod, chown。 - -- JFFS2支持以只读属性挂载,当mount函数的入参mountflags为MS\_RDONLY时,JFFS将开启只读属性,所有的带有写入的接口,如write、mkdir、unlink,以及通过非O\_RDONLY属性打开的文件,将均被拒绝,并传出EACCESS错误码。 - - -## 开发指导 - -**添加JFFS2分区** - -调用add\_mtd\_partition函数添加JFFS2分区,该函数会自动为设备节点命名,对于JFFS2,其命名规则是“/dev/spinorblk”加上分区号。 - -add\_mtd\_partition函数有四个参数,第一个参数表示介质,有“nand”和“spinor”两种,JFFS2分区在“spinor”上使用,而“nand”是提供给YAFFS2使用的。 - -第二个参数表示起始地址,第三个参数表示分区大小,这两个参数都以16进制的形式传入。 - -最后一个参数表示分区号,有效值为0\~19。 - -``` -INT32 uwRet; -if (uwRet = add_mtd_partition("spinor", 0x100000, 0x800000, 0) != 0) { - dprintf("add jffs2 partition failed, return %d\n", uwRet); -} else { - dprintf("Mount jffs2 on spinor.\n"); - uwRet = mount("/dev/spinorblk0", "/jffs0", "jffs2", 0, NULL); - if (uwRet) { - dprintf("mount jffs2 err %d\n", uwRet); - dprintf("Mount jffs2 on nor finished.\n"); - } -} - -if (uwRet = add_mtd_partition("spinor", 0x900000, 0x200000, 1) != 0) { - dprintf("add jffs2 partition failed, return %d\n", uwRet); -} -``` - -成功后,在Shell中可以使用partition spinor命令查看spinor flash分区信息。 - -``` -OHOS # partition spinor -spinor partition num:0, dev name:/dev/spinorblk0, mountpt:/jffs0, startaddr:0x0100000,length:0x0800000 -spinor partition num:1, dev name:/dev/spinorblk1, mountpt:(null), startaddr:0x0900000,length:0x0200000 -``` - -**挂载JFFS2** - -调用mount\(\)函数实现设备节点和挂载点的挂载。 - -该函数有五个参数,第一个参数表示设备节点,这个参数需要和add\_mtd\_partition\(\)函数对应起来,第二个参数表示挂载点。第三个参数表示文件系统类型。 - -最后两个参数表示挂载标志和数据,默认为0和NULL;这一操作也可以在Shell中使用mount命令实现,最后两个参数不需要用户给出。 - -运行命令: - -``` -OHOS # mount /dev/spinorblk1 /jffs1 jffs2 -``` - -将从串口得到如下回应信息,表明挂载成功。 - -``` -OHOS # mount /dev/spinorblk1 /jffs1 jffs2 -mount OK -``` - -挂载成功后,用户就能对norflash进行读写操作。 - -**卸载JFFS2** - -调用umount\(\)函数卸载分区,只需要正确给出挂载点即可。 - -运行命令: - -``` -OHOS # umount /jffs1 -``` - -将从串口得到如下回应信息,表明卸载成功。 - -``` -OHOS # umount /jffs1 -umount ok -``` - -**删除JFFS2分区** - -调用delete\_mtd\_partition删除已经卸载的分区。 - -该函数有两个参数,第一个参数是分区号,第二个参数为介质类型,该函数与add\_mtd\_partition\(\)函数对应。 - -``` -INT32 uwRet; -uwRet = delete_mtd_partition(1,"spinor"); -if(uwRet != 0) { - printf("delete jffs2 error\n"); -} else { - printf("delete jffs2 ok\n"); -} - -OHOS # partition spinor -spinor partition num:0, dev name:/dev/spinorblk0, mountpt:/jffs0, startaddr:0x0100000,length:0x0800000 -``` +对于整个裸nor flash设备而言,没有集中的地方来管理和记录分区的信息。因此,需要通过其他的配置方式来传递这部分信息(当前使用的方式是在烧写镜像的时候,使用bootargs参数配置的),然后在代码中调用相应的接口来添加分区,再进行挂载动作。 **制作JFFS2文件系统镜像** @@ -132,7 +36,7 @@ spinor partition num:0, dev name:/dev/spinorblk0, mountpt:/jffs0, startaddr:0x01 ./mkfs.jffs2 -d rootfs/ -o rootfs.jffs2 ``` -**表 1** 指令含义表 +**表 1** 指令含义表(更详细的介绍可以通过mkfs.jffs2 --help来查看)

指令

@@ -169,3 +73,43 @@ spinor partition num:0, dev name:/dev/spinorblk0, mountpt:/jffs0, startaddr:0x01
+**挂载JFFS2分区** + +调用int mount\(const char \*source, const char \*target, const char \*filesystemtype, unsigned long mountflags, const void \*data\)函数实现设备节点和挂载点的挂载。 + +该函数有五个参数,第一个参数const char \*source,表示设备节点,第二个参数const char \*target表示挂载点。第三个参数 const char \*filesystemtype,表示文件系统类型。 + +最后两个参数unsigned long mountflags和const void \*data表示挂载标志和数据,默认为0和NULL;这一操作也可以在Shell中使用mount命令实现,最后两个参数不需要用户给出。 + +运行命令: + +``` +OHOS # mount /dev/spinorblk1 /jffs1 jffs2 +``` + +将从串口得到如下回应信息,表明挂载成功。 + +``` +OHOS # mount /dev/spinorblk1 /jffs1 jffs2 +mount OK +``` + +挂载成功后,用户就能对norflash进行读写操作。 + +**卸载JFFS2分区** + +调用int umount\(const char \*target\)函数卸载分区,只需要正确给出挂载点即可。 + +运行命令: + +``` +OHOS # umount /jffs1 +``` + +将从串口得到如下回应信息,表明卸载成功。 + +``` +OHOS # umount /jffs1 +umount ok +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-nfs.md b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-nfs.md new file mode 100644 index 0000000000000000000000000000000000000000..d9bd6ff7caebf4e17ab803c73f49ff6c8aab1784 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-nfs.md @@ -0,0 +1,134 @@ +# NFS + +- [基本概念](#section195414101464) +- [运行机制](#section165621321194618) +- [开发指导](#section7454935184611) + +## 基本概念 + +NFS是Network File System(网络文件系统)的缩写。它最大的功能是可以通过网络,让不同的机器、不同的操作系统彼此分享其他用户的文件。因此,用户可以简单地将它看做是一个文件系统服务,在一定程度上相当于Windows环境下的共享文件夹。 + +## 运行机制 + +OpenHarmony LiteOS-A内核的NFS文件系统指的是NFS的客户端,NFS客户端能够将远程的NFS服务端分享的目录挂载到本地的机器中,运行程序和共享文件,但不占用当前系统的存储空间,在本地端的机器看起来,远程服务端的目录就好像是自己的一个磁盘一样。 + +## 开发指导 + +1. 搭建NFS服务器 + +这里以Ubuntu操作系统为例,说明服务器端设置步骤。 + +- 安装NFS服务器软件。 + +设置好Ubuntu系统的下载源,保证网络连接好的情况下执行: + +``` +sudo apt-get install nfs-kernel-server +``` + +- 创建用于挂载的目录并设置完全权限 + +``` +mkdir -p /home/sqbin/nfs +sudo chmod 777 /home/sqbin/nfs +``` + +- 设置和启动NFS server。 + +修改NFS配置文件/etc/exports,添加如下一行: + +``` +/home/sqbin/nfs *(rw,no_root_squash,async) +``` + +其中/home/sqbin/nfs是NFS共享的根目录。 + +执行以下命令启动NFS server: + +``` +sudo /etc/init.d/nfs-kernel-server start +``` + +执行以下命令重启NFS server: + +``` +sudo /etc/init.d/nfs-kernel-server restart +``` + +1. 设置单板为NFS客户端 + +本指导中的NFS客户端指运行OpenHarmony内核的设备。 + +- 硬件连接设置。 + +OpenHarmony内核设备连接到NFS服务器的网络。设置两者IP,使其处于同一网段。比如,设置NFS服务器的IP为10.67.212.178/24,设置OpenHarmony内核设备IP为10.67.212.3/24,注意:此IP为内网私有IP地址,用户使用时有差异,以用户实际IP为准。 + +OpenHarmony内核设备上的IP信息可通过ifconfig命令查看。 + +- 启动网络,确保单板到NFS服务器之间的网络通畅。 + +启动以太网或者其他类型网络,使用ping命令检查到服务器的网络是否通畅。 + +``` +OHOS # ping 10.67.212.178 +[0]Reply from 10.67.212.178: time=1ms TTL=63 +[1]Reply from 10.67.212.178: time=0ms TTL=63 +[2]Reply from 10.67.212.178: time=1ms TTL=63 +[3]Reply from 10.67.212.178: time=1ms TTL=63 +--- 10.67.212.178 ping statistics --- +4 packets transmitted, 4 received, 0 loss +``` + +客户端NFS初始化,运行命令: + +``` +OHOS # mkdir /nfs +OHOS # mount 10.67.212.178:/home/sqbin/nfs /nfs nfs 1011 1000 +``` + +将从串口得到如下回应信息,表明初始化NFS客户端成功。 + +``` +OHOS # mount 10.67.212.178:/home/sqbin/nfs /nfs nfs 1011 1000 +Mount nfs on 10.67.212.178:/home/sqbin/nfs, uid:1011, gid:1000 +Mount nfs finished. +``` + +该命令将服务器10.67.212.178上的/home/sqbin/nfs目录挂载到OpenHarmony内核设备上的/nfs上。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>本例默认nfs server已经配置可用,即示例中服务器10.67.212.178上的/home/sqbin/nfs已配置可访问。 +>mount命令的格式为: +>``` +>mount nfs +>``` +>其中“SERVER\_IP”表示服务器的IP地址;“SERVER\_PATH”表示服务器端NFS共享目录路径;“CLIENT\_PATH”表示设备上的NFS路径,“nfs”表示客户端要挂载的路径,可以根据自己需要替换。 +>如果不想有NFS访问权限限制,可以在Linux命令行将NFS根目录权限设置成777: +>``` +>chmod -R 777 /home/sqbin/nfs +>``` +>至此,NFS客户端设置完毕。NFS文件系统已成功挂载。 + +1. 利用NFS共享文件 + +在NFS服务器下新建目录dir,并保存。在OpenHarmony内核下运行ls命令: + +``` +OHOS # ls /nfs +``` + +则可从串口得到如下回应: + +``` +OHOS # ls /nfs +Directory /nfs: +drwxr-xr-x 0 u:0 g:0 dir +``` + +可见,刚刚在NFS服务器上新建的dir目录已同步到客户端\(OpenHarmony内核系统\)的/nfs目录,两者保持同步。 + +同样地,在客户端\(OpenHarmony内核系统\)上创建文件和目录,在NFS服务器上也可以访问,读者可自行体验。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>目前,NFS客户端仅支持NFS v3部分规范要求,因此对于规范支持不全的服务器,无法完全兼容。在开发测试过程中,建议使用Linux的NFS server,其对NFS支持很完善。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-procfs.md b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-procfs.md new file mode 100644 index 0000000000000000000000000000000000000000..d84d28862e85bfe5578bda0ac231922c2e56aaf8 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-procfs.md @@ -0,0 +1,85 @@ +# Procfs + +- [基本概念](#section146801917174017) +- [运行机制](#section479762916408) +- [开发指导](#section1221174524014) + - [编程实例](#section52016575401) + + +## 基本概念 + +procfs是进程文件系统的简称,是一种虚拟文件系统,他用文件的形式,展示进程或其他系统信息。相比调用接口的方式获取信息,以文件操作的方式获取系统信息更为方便。 + +## 运行机制 + +OpenHarmony内核中,procfs在开机时会自动挂载到/proc目录下,仅支持内核模块创建文件节点来提供查询服务。 + +## 开发指导 + +procfs文件的创建无法使用一般的文件系统接口,需要使用ProcMkdir接口创建目录,使用CreateProcEntry接口创建文件。文件节点功能的开发就是实现read和write函数的钩子挂到CreateProcEntry创建的文件中。当用户使用读写procfs的文件时,就会调用到钩子函数来实现自定义的功能。 + +### 编程实例 + +下面我们以创建/proc/hello/world文件为例,实现如下功能: + +1.在/proc/hello/world位置创建一个文件 + +2.当读文件内容时,返回"HelloWorld!" + +3.当写文件内容时,打印写入的内容 + +``` +#include "proc_fs.h" + +static int TestRead(struct SeqBuf *buf, void *arg) +{ + LosBufPrintf(buf, "Hello World!\n"); /* 将数据打印到buffer中,这个buffer中的数据会返回到read的结果中 */ + return 0; +} + +static int TestWrite(struct ProcFile *pf, const char *buffer, size_t buflen, loff_t *ppos) +{ + if ((buffer == NULL) || (buflen <= 0)) { + return -EINVAL; + } + + PRINTK("your input is: %s\n", buffer); /* 注意和上面的read接口区别,这是对write接口输入命令的反馈,这个打印只会打印到控制台 */ + return buflen; +} +static const struct ProcFileOperations HELLO_WORLD_OPS = { + .read = TestRead, + .write = TestWrite, +}; + +void HelloWorldInit(void) +{ + /* 创建hello目录 */ + struct ProcDirEntry *dir = ProcMkdir("hello", NULL); + if (dir == NULL) { + PRINT_ERR("create dir failed!\n"); + return; + } + + /* 创建world文件 */ + struct ProcDirEntry *entry = CreateProcEntry("world", 0, dir); + if (entry == NULL) { + PRINT_ERR("create entry failed!\n"); + return; + } + + /* 将自定义的read和write钩子挂到文件中 */ + entry->procFileOps = &HELLO_WORLD_OPS; +} +``` + +**结果验证** + +启动后在shell输入如下命令 + +``` +OHOS # cat /proc/hello/world +OHOS # Hello World! +OHOS # echo "yo" > /proc/hello/world +OHOS # your input is: yo +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-ramfs.md b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-ramfs.md new file mode 100644 index 0000000000000000000000000000000000000000..5aba9e3f237d8ac211e5b35cfa9d97f0f75a9a31 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support-ramfs.md @@ -0,0 +1,64 @@ +# Ramfs + +- [基本概念](#section9507151014420) +- [运行机制](#section1859711263447) +- [开发指导](#section163554380448) + +## 基本概念 + +RAMFS是一个可动态调整大小的基于RAM的文件系统。RAMFS没有后备存储源。向RAMFS中进行的文件写操作也会分配目录项和页缓存,但是数据并不写回到任何其他存储介质上,掉电后数据丢失。 + +## 运行机制 + +RAMFS文件系统把所有的文件都放在 RAM 中,所以读/写操作发生在RAM中,可以用RAMFS来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对存储器的读写损耗,也提高了数据读写速度。 + +## 开发指导 + +挂载: + +``` +mount(NULL, "/dev/shm", "ramfs", 0, NULL) +``` + +创建目录: + +``` +mkdir(pathname, mode) +``` + +创建文件: + +``` +open(pathname, O_NONBLOCK | O_CREAT | O_RDWR, mode) +``` + +读取目录: + +``` +dir = opendir(pathname) +ptr = readdir(dir) +closedir(dir) +``` + +删除文件: + +``` +unlink(pathname) +``` + +删除目录: + +``` +rmdir(pathname) +``` + +去挂载: + +``` +umount("/dev/shm") +``` + +>![](../public_sys-resources/icon-caution.gif) **注意:** +>- RAMFS只能挂载一次,一次挂载成功后,后面不能继续挂载到其他目录。 +>- RAMFS属于调测功能,默认配置为关闭,正式产品中不要使用该功能。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-file-support.md b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support.md new file mode 100644 index 0000000000000000000000000000000000000000..d9c71f742360de17030ab8afc0bdcd4020ac435f --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-file-support.md @@ -0,0 +1,13 @@ +# 支持的文件系统 + +- **[FAT](kernel-small-bundles-file-support-fat.md)** + +- **[JFFS2](kernel-small-bundles-file-support-jffs2.md)** + +- **[NFS](kernel-small-bundles-file-support-nfs.md)** + +- **[Ramfs](kernel-small-bundles-file-support-ramfs.md)** + +- **[Procfs](kernel-small-bundles-file-support-procfs.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-file-virtu.md b/zh-cn/device-dev/kernel/kernel-small-bundles-file-virtu.md new file mode 100644 index 0000000000000000000000000000000000000000..33e469244ad48444fa1527055b6d7d98fb196e9e --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-file-virtu.md @@ -0,0 +1,794 @@ +# 虚拟文件系统 + +- [基本概念](#section1253851143520) +- [运行机制](#section14915913123510) +- [开发指导](#section1759563620358) + - [接口说明](#section17865142133511) + - [开发流程](#section64113023616) + - [编程实例](#section236041883618) + + +## 基本概念 + +VFS(Virtual File System)是文件系统的虚拟层,它不是一个实际的文件系统,而是一个异构文件系统之上的软件粘合层,为用户提供统一的类Unix文件操作接口。由于不同类型的文件系统接口不统一,若系统中有多个文件系统类型,访问不同的文件系统就需要使用不同的非标准接口。而通过在系统中添加VFS层,提供统一的抽象接口,屏蔽了底层异构类型的文件系统的差异,使得访问文件系统的系统调用不用关心底层的存储介质和文件系统类型,提高开发效率。 + +OpenHarmony内核中,VFS框架是通过在内存中的树结构来实现的,树的每个结点都是一个Vnode结构体,父子结点的关系以PathCache结构体保存。VFS最主要的两个功能是: + +- 查找节点。 +- 统一调用(标准)。 + +## 运行机制 + +当前,VFS层主要通过函数指针,实现对不同文件系统类型调用不同接口实现标准接口功能;通过Vnode与PathCache机制,提升路径搜索以及文件访问的性能;通过挂载点管理进行分区管理;通过FD管理进行进程间FD隔离等。下面将对这些机制进行简要说明。 + +1. 文件系统操作函数指针:VFS层通过函数指针的形式,将统一调用按照不同的文件系统类型,分发到不同文件系统中进行底层操作。各文件系统的各自实现一套Vnode操作、挂载点操作以及文件操作接口,并以函数指针结构体的形式存储于对应Vnode、挂载点、File结构体中,实现VFS层对下访问。 +2. Vnode:Vnode是具体文件或目录在VFS层的抽象封装,它屏蔽了不同文件系统的差异,实现资源的统一管理。Vnode节点主要有以下几种类型: + + - 挂载点:挂载具体文件系统,如/、/storage + - 设备节点:/dev目录下的节点,对应于一个设备,如/dev/mmcblk0 + - 文件/目录节点:对应于具体文件系统中的文件/目录,如/bin/init + + Vnode通过哈希以及LRU机制进行管理。当系统启动后,对文件或目录的访问会优先从哈希链表中查找Vnode缓存,若缓存没有命中,则并从对应文件系统中搜索目标文件或目录,创建并缓存对应的Vnode。当Vnode缓存数量达到上限时,将淘汰长时间未访问的Vnode,其中挂载点Vnode与设备节点Vnode不参与淘汰。当前系统中Vnode的规格默认为512,该规格可以通过LOSCFG\_MAX\_VNODE\_SIZE进行配置。Vnode数量过大,会造成较大的内存占用;Vnode数量过少,则会造成搜索性能下降。下图展示了Vnode的创建流程。 + + **图 1** Vnode创建流程 + ![](figure/Vnode创建流程.png "Vnode创建流程") + + +1. PathCache:PathCache是路径缓存,与Vnode对应。PathCache同样通过哈希链表存储,通过父Vnode中缓存的PathCache可以快速获取子Vnode,加速路径查找。下图展示了文件/目录的查找流程。 + + **图 2** 文件查找流程 + ![](figure/文件查找流程.png "文件查找流程") + + +1. PageCache:PageCache是文件级别的内核缓存。当前PageCache仅支持对二进制文件操作,在初次访问该文件时通过mmap映射到内存中,减少内核内存的占用,也大大提升了对同一个文件的读写操作速度。另外基于PageCache可实现以文件为基底的进程间通信。 +2. fd管理:Fd(File Description)是描述一个打开的文件/目录的描述符。当前OpenHarmony内核中,fd总规格为896,分为三种类型: + + - 普通文件描述符,系统总规格为512。 + - Socket描述符,系统总规格为128。 + - 消息队列描述符,系统总规格为256。 + + 当前OpenHarmony内核中,对不同进程中的fd进行隔离,即进程只能访问本进程的fd,所有进程的fd映射到全局fd表中进行统一分配管理。进程的文件描述符最多有256个。 + +3. 挂载点管理:当前OpenHarmony内核中,对系统中所有挂载点通过链表进行统一管理。挂载点结构体中,记录了该挂载分区内的所有Vnode。当分区卸载时,会释放分区内的所有Vnode。 + +## 开发指导 + +### 接口说明 + +当前文件系统支持的接口如下表所示,表格中的“×”代表对应文件系统不支持该接口。 + +**表 1** 支持接口列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

分类

+

接口名称

+

功能

+

FAT

+

JFFS2

+

NFS

+

TMPFS

+

PROCFS

+

文件操作

+

open

+

打开文件

+

+

+

+

+

+

read/pread/readv/preadv

+

读取文件

+

+

+

+

+

+

write/pwrite/writev/pwritev

+

写入文件

+

+

+

+

+

+

lseek

+

设置文件偏移

+

+

+

+

+

×

+

close

+

关闭文件

+

+

+

+

+

+

unlink

+

删除文件

+

+

+

+

+

×

+

fstat

+

查询文件信息

+

+

+

+

+

+

fallocate

+

预分配大小

+

+

×

+

×

+

×

+

×

+

truncate

+

文件截断

+

+

+

×

+

+

×

+

link

+

创建硬链接

+

×

+

+

×

+

×

+

×

+

symlink

+

创建软链接

+

+

+

×

+

×

+

×

+

readlink

+

读取软链接

+

+

+

×

+

×

+

×

+

dup

+

复制文件句柄

+

+

+

+

+

+

fsync

+

文件内容刷入设备

+

+

×

+

×

+

×

+

×

+

ioctl

+

设备控制

+

×

+

×

+

×

+

+

×

+

fcntl

+

文件控制操作

+

+

+

+

+

+

目录操作

+

mkdir

+

创建目录

+

+

+

+

+

×

+

opendir

+

打开目录

+

+

+

+

+

+

readdir

+

读取目录

+

+

+

+

+

+

closedir

+

关闭目录

+

+

+

+

+

+

telldir

+

获取目录偏移

+

+

+

+

+

+

seekdir

+

设置目录偏移

+

+

+

+

+

+

rewinddir

+

重置目录偏移

+

+

+

+

+

×

+

scandir

+

读取目录数据

+

+

+

+

+

+

rmdir

+

删除目录

+

+

+

+

+

×

+

chdir

+

切换当前路径

+

+

+

+

+

+

getcwd

+

获取当前路径

+

+

+

+

+

+

realpath

+

相对/绝对路径转换

+

+

+

+

+

+

rename

+

文件/目录重命名

+

+

+

+

+

×

+

chmod

+

修改文件/目录属性

+

+

+

×

+

×

+

×

+

chown

+

修改文件/目录所有者

+

+

+

×

+

×

+

×

+

stat/lstat

+

查询文件/目录信息

+

+

+

+

+

+

access

+

查询文件/目录访问权限

+

+

+

+

+

+

分区操作

+

mount

+

挂载分区

+

+

+

+

+

+

umount

+

卸载分区

+

+

+

+

+

×

+

statfs

+

查询挂载分区信息

+

+

+

+

+

+

format

+

格式化分区

+

+

×

+

×

+

×

+

×

+

sync

+

分区内容刷入设备

+

+

×

+

×

+

×

+

×

+
+ +### 开发流程 + +文件系统的主要开发流程包括挂载/卸载分区,以及系列目录/文件操作。 + +### 编程实例 + +代码实现如下: + +``` +#include +#include +#include "sys/stat.h" +#include "fcntl.h" +#include "unistd.h" + +#define LOS_OK 0 +#define LOS_NOK -1 + +int main(void) +{ + int ret; + int fd = -1; + ssize_t len; + off_t off; + char mntName[20] = "/storage"; + char devName[20] = "/dev/mmcblk0p0"; + char dirName[20] = "/storage/test"; + char fileName[20] = "/storage/test/file.txt"; + char writeBuf[20] = "Hello OpenHarmony!"; + char readBuf[20] = {0}; + + /* 创建目录“/storage” */ + ret = mkdir(mntName, 0777); + if (ret != LOS_OK) { + printf("mkdir failed.\n"); + return LOS_NOK; + } + + /* 挂载设备“/dev/mmcblk0p0”到“/storage” */ + ret = mount(devName, mntName, "vfat", 0, 0); + if (ret != LOS_OK) { + printf("mount failed.\n"); + return LOS_NOK; + } + + /* 创建目录“/storage/test” */ + ret = mkdir(dirName, 0777); + if (ret != LOS_OK) { + printf("mkdir failed.\n"); + return LOS_NOK; + } + + /* 创建可读写文件“/storage/test/file.txt” */ + fd = open(fileName, O_RDWR | O_CREAT, 0777); + if (fd < 0) { + printf("open file failed.\n"); + return LOS_NOK; + } + + /* 将writeBuf中的内容写入文件 */ + len = write(fd, writeBuf, strlen(writeBuf)); + if (len != strlen(writeBuf)) { + printf("write file failed.\n"); + return LOS_NOK; + } + + /* 将文件内容刷入存储设备中 */ + ret = fsync(fd); + if (ret != LOS_OK) { + printf("fsync failed.\n"); + return LOS_NOK; + } + + /* 将读写指针偏移至文件头 */ + off = lseek(fd, 0, SEEK_SET); + if (off != 0) { + printf("lseek failed.\n"); + return LOS_NOK; + } + + /* 将文件内容读出至readBuf中,读取长度为readBuf大小 */ + len = read(fd, readBuf, sizeof(readBuf)); + if (len != strlen(readBuf)) { + printf("read file failed.\n"); + return LOS_NOK; + } + printf("%s\n", readBuf); + + /* 关闭文件 */ + ret = close(fd); + if (ret != LOS_OK) { + printf("close failed.\n"); + return LOS_NOK; + } + + /* 删除文件“/storage/test/file.txt” */ + ret = unlink(fileName); + if (ret != LOS_OK) { + printf("unlink failed.\n"); + return LOS_NOK; + } + + /* 删除目录“/storage/test” */ + ret = rmdir(dirName); + if (ret != LOS_OK) { + printf("rmdir failed.\n"); + return LOS_NOK; + } + + /* 卸载分区“/storage” */ + ret = umount(mntName); + if (ret != LOS_OK) { + printf("umount failed.\n"); + return LOS_NOK; + } + + /* 删除目录“/storage” */ + ret = rmdir(mntName); + if (ret != LOS_OK) { + printf("rmdir failed.\n"); + return LOS_NOK; + } + + return LOS_OK; +} +``` + +**结果验证** + +编译运行得到的结果为: + +``` +Hello OpenHarmony! +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-file.md b/zh-cn/device-dev/kernel/kernel-small-bundles-file.md new file mode 100644 index 0000000000000000000000000000000000000000..c5ca4f2192823bf7e96ad2591241ce194cd07e54 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-file.md @@ -0,0 +1,17 @@ +# 文件系统 + +文件系统(File System,或者简称FS),是操作系统中输入输出的一种主要形式,主要负责和内外部的存储设备交互。 + +文件系统对上通过C库提供的POSIX标准的操作接口,具体可以参考C库的API文档说明。对下,通过内核态的VFS虚拟层,屏蔽了各个具体文件系统的差异。基本架构如下: + +**图 1** 文件系统的总体结构 + +![](figure/zh-cn_image_0000001125101908.png) + +- **[虚拟文件系统](kernel-small-bundles-file-virtu.md)** + +- **[支持的文件系统](kernel-small-bundles-file-support.md)** + +- **[适配新的文件系统](kernel-small-bundles-file-newsys.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-init.md b/zh-cn/device-dev/kernel/kernel-small-bundles-init.md new file mode 100644 index 0000000000000000000000000000000000000000..d18d59b436d7d4a5d183a745a1ad51a9a8d5aaf1 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-init.md @@ -0,0 +1,82 @@ +# 动态加载与链接 + +- [基本概念](#section208951139453) +- [运行机制](#section14140155320511) +- [开发指导](#section133501496612) + - [接口说明](#section874113201669) + - [开发流程](#section196712561563) + + +## 基本概念 + +OpenHarmony系统的动态加载与链接机制主要是由内核加载器以及动态链接器构成,内核加载器用于加载应用程序以及动态链接器,动态链接器用于加载应用程序所依赖的共享库,并对应用程序和共享库进行符号重定位。与静态链接相比,动态链接是将应用程序与动态库推迟到运行时再进行链接的一种机制。 + +**动态链接的优势:** + +1. 多个应用程序可以共享一份代码,最小加载单元为页,相对静态链接可以节约磁盘和内存空间。 +2. 共享库升级时,理论上将旧版本的共享库覆盖即可(共享库中的接口向下兼容),无需重新链接。 +3. 加载地址可以进行随机化处理,防止攻击,保证安全性。 + +## 运行机制 + +**图 1** 动态加载流程 +![](figure/动态加载流程.png "动态加载流程") + +1. 内核根据应用程序ELF文件的PT\_LOAD段信息映射至进程空间。对于ET\_EXEC类型的文件,根据PT\_LOAD段中p\_vaddr进行固定地址映射;对于ET\_DYN类型(位置无关的可执行程序,通过编译选项“-fPIE”得到)的文件,内核通过mmap接口选择base基址进行映射(load\_addr = base + p\_vaddr)。 +2. 若应用程序是静态链接的(静态链接不支持编译选项“-fPIE”),设置堆栈信息后跳转至应用程序ELF文件中e\_entry指定的地址并运行;若程序是动态链接的,应用程序ELF文件中会有PT\_INTERP段,保存动态链接器的路径信息(ET\_DYN类型)。musl的动态链接器是libc-musl.so的一部分,libc-musl.so的入口即动态链接器的入口。内核通过mmap接口选择base基址进行映射,设置堆栈信息后跳转至base + e\_entry(该e\_entry为动态链接器的入口)地址并运行动态链接器。 +3. 动态链接器自举并查找应用程序依赖的所有共享库并对导入符号进行重定位,最后跳转至应用程序的e\_entry(或base + e\_entry),开始运行应用程序。 + +**图 2** 程序执行流程 +![](figure/程序执行流程.png "程序执行流程") + +1. 加载器与链接器调用mmap映射PT\_LOAD段; +2. 内核调用map\_pages接口查找并映射pagecache已有的缓存; +3. 程序执行时,内存若无所需代码或数据时触发缺页中断,将elf文件内容读入内存,并将该内存块加入pagecache; +4. 映射步骤3已读入文件内容的内存块; +5. 程序继续执行; + +至此,程序将在不断地缺页中断中执行。 + +## 开发指导 + +### 接口说明 + +LOS\_DoExecveFile + +**函数原型:** + +INT32 LOS\_DoExecveFile\(const CHAR \*fileName, CHAR \* const \*argv, CHAR \* const \*envp\); + +**函数功能:**根据fileName执行一个新的用户程序。 + +**参数说明:** + + + + + + + + + + + + + + + + +

参数

+

描述

+

fileName

+

二进制可执行文件名,可以是路径名。

+

argv

+

程序执行所需的参数序列,以NULL结尾。无需参数时填入NULL。

+

envp

+

程序执行所需的新的环境变量序列,以NULL结尾。无需新的环境变量时填入NULL。

+
+ +### 开发流程 + +LOS\_DoExecveFile接口一般由用户通过execve系列接口利用系统调用机制调用创建新的进程,内核不能直接调用该接口启动新进程。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-lite.md b/zh-cn/device-dev/kernel/kernel-small-bundles-lite.md new file mode 100644 index 0000000000000000000000000000000000000000..a44f54d389805c71c54b33b53f4e84a35400ad22 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-lite.md @@ -0,0 +1,70 @@ +# 轻量级进程间通信 + +- [基本概念](#section1980994712918) +- [运行机制](#section849811592918) +- [开发指导](#section17571315171017) + - [接口说明](#section725022011103) + + +## 基本概念 + +LiteIPC是OpenHarmony LiteOS-A内核提供的一种新型IPC(Inter-Process Communication,即进程间通信)机制,不同于传统的System V IPC机制,LiteIPC主要是为RPC(Remote Procedure Call,即远程过程调用)而设计的,而且是通过设备文件的方式对上层提供接口的,而非传统的API函数方式。 + +LiteIPC中有两个主要概念,一个是ServiceManager,另一个是Service。整个系统只能有一个ServiceManager,而Service可以有多个。ServiceManager有两个主要功能:一是负责Service的注册和注销,二是负责管理Service的访问权限(只有有权限的任务(Task)可以向对应的Service发送IPC消息)。 + +## 运行机制 + +首先将需要接收IPC消息的任务通过ServiceManager注册成为一个Service,然后通过ServiceManager为该Service任务配置访问权限,即指定哪些任务可以向该Service任务发送IPC消息。LiteIPC的核心思想就是在内核态为每个Service任务维护一个IPC消息队列,该消息队列通过LiteIPC设备文件向上层用户态程序分别提供代表收取IPC消息的读操作和代表发送IPC消息的写操作。 + +## 开发指导 + +### 接口说明 + +**表 1** LiteIPC模块接口(仅LiteOS-A内部使用) + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

模块初始化

+

OsLiteIpcInit

+

初始化LiteIPC模块

+

IPC消息内存池

+

LiteIpcPoolInit

+

初始化进程的IPC消息内存池

+

LiteIpcPoolReInit

+

重新初始化进程的IPC消息内存池

+

LiteIpcPoolDelete

+

释放进程的IPC消息内存池

+

Service管理

+

LiteIpcRemoveServiceHandle

+

删除指定的Service

+
+ +>![](../public_sys-resources/icon-note.gif) **说明:** +>LiteIPC模块接口都只在LiteOS-A内部使用。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-share.md b/zh-cn/device-dev/kernel/kernel-small-bundles-share.md new file mode 100644 index 0000000000000000000000000000000000000000..89aaeb511fed766fc43f15b25e040c55a9d6e688 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-share.md @@ -0,0 +1,47 @@ +# 虚拟动态共享库 + +- [基本概念](#section174577181688) +- [运行机制](#section546363114810) + +## 基本概念 + +VDSO(Virtual Dynamic Shared Object,虚拟动态共享库)相对于普通的动态共享库,区别在于其so文件不保存在文件系统中,存在于系统镜像中,由内核在运行时确定并提供给应用程序,故称为虚拟动态共享库。 + +OpenHarmony系统通过VDSO机制实现上层用户态程序可以快速读取内核相关数据的一种通道方法,可用于实现部分系统调用的加速,也可用于实现非系统敏感数据(硬件配置、软件配置)的快速读取。 + +## 运行机制 + +VDSO其核心思想就是内核看护一段内存,并将这段内存映射(只读)进用户态应用程序的地址空间,应用程序通过链接vdso.so后,将某些系统调用替换为直接读取这段已映射的内存从而避免系统调用达到加速的效果。 + +VDSO总体可分为数据页与代码页两部分: + +- 数据页提供内核映射给用户进程的内核时数据; +- 代码页提供屏蔽系统调用的主要逻辑; + +**图 1** VDSO系统设计 +![](figure/VDSO系统设计.jpg "VDSO系统设计") + +如图1所示,当前VDSO机制有以下几个主要步骤: + +① 内核初始化时进行VDSO数据页的创建; + +② 内核初始化时进行VDSO代码页的创建; + +③ 根据系统时钟中断不断将内核一些数据刷新进VDSO的数据页; + +④ 用户进程创建时将代码页映射进用户空间; + +⑤ 用户程序在动态链接时对VDSO的符号进行绑定; + +⑥ 当用户程序进行特定系统调用时(例如clock\_gettime\(CLOCK\_REALTIME\_COARSE, &ts\)),VDSO代码页会将其拦截; + +⑦ VDSO代码页将正常系统调用转为直接读取映射好的VDSO数据页; + +⑧ 从VDSO数据页中将数据传回VDSO代码页; + +⑨ 将从VDSO数据页获取到的数据作为结果返回给用户程序; + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 当前VDSO机制支持LibC库clock\_gettime接口的CLOCK\_REALTIME\_COARSE与CLOCK\_MONOTONIC\_COARSE功能,clock\_gettime接口的使用方法详见POSIX标准。用户调用C库接口clock\_gettime\(CLOCK\_REALTIME\_COARSE, &ts\)或者clock\_gettime\(CLOCK\_MONOTONIC\_COARSE, &ts\)即可使用VDSO机制。 +>- 使用VDSO机制得到的时间精度会与系统tick中断的精度保持一致,适用于对时间没有高精度要求且短时间内会高频触发clock\_gettime或gettimeofday系统调用的场景,若有高精度要求,不建议采用VDSO机制。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles-system.md b/zh-cn/device-dev/kernel/kernel-small-bundles-system.md new file mode 100644 index 0000000000000000000000000000000000000000..b2118533c9e071e95995729fda0af400fcca37ab --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles-system.md @@ -0,0 +1,176 @@ +# 系统调用 + +- [基本概念](#section889710401734) +- [运行机制](#section195177541314) +- [开发指导](#section193492047135419) + - [开发流程](#section7165741122210) + - [编程实例](#section107131418224) + + +## 基本概念 + +OpenHarmony LiteOS-A实现了用户态与内核态的区分隔离,用户态程序不能直接访问内核资源,而系统调用则为用户态程序提供了一种访问内核资源、与内核进行交互的通道。 + +## 运行机制 + +如图1所示,用户程序通过调用System API(系统API,通常是系统提供的POSIX接口)进行内核资源访问与交互请求,POSIX接口内部会触发SVC/SWI异常,完成系统从用户态到内核态的切换,然后对接到内核的Syscall Handler(系统调用统一处理接口)进行参数解析,最终分发至具体的内核处理函数。 + +**图 1** 系统调用示意图 +![](figure/系统调用示意图.png "系统调用示意图") + +Syscall Handler的具体实现在kernel/liteos\_a/syscall/los\_syscall.c中OsArmA32SyscallHandle函数,在进入系统软中断异常时会调用此函数,并且按照kernel/liteos\_a/syscall/syscall\_lookup.h中的清单进行系统调用的入参解析,执行各系统调用最终对应的内核处理函数。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 系统调用提供基础的用户态程序与内核的交互功能,不建议开发者直接使用系统调用接口,推荐使用内核提供的对外POSIX接口,若需要新增系统调用接口,详见开发指导。 +>- 内核向用户态提供的系统调用接口清单详见kernel/liteos\_a/syscall/syscall\_lookup.h,内核相应的系统调用对接函数清单详见kernel/liteos\_a/syscall/los\_syscall.h。 + +## 开发指导 + +### 开发流程 + +新增系统调用的典型开发流程如下: + +1. 在LibC库中确定并添加新增的系统调用号。 +2. 在LibC库中新增用户态的函数接口声明及实现。 +3. 在内核系统调用头文件中确定并添加新增的系统调用号及对应内核处理函数的声明。 +4. 在内核中新增该系统调用对应的内核处理函数。 + +### 编程实例 + +**示例代码**: + +1. 在LibC库syscall.h.in中新增系统调用号 + + 如下所示,其中\_\_NR\_new\_syscall\_sample为新增系统调用号: + + ``` + ... + /* 当前现有的系统调用清单 */ + /* OHOS customized syscalls, not compatible with ARM EABI */ + #define __NR_OHOS_BEGIN 500 + #define __NR_pthread_set_detach (__NR_OHOS_BEGIN + 0) + #define __NR_pthread_join (__NR_OHOS_BEGIN + 1) + #define __NR_pthread_deatch (__NR_OHOS_BEGIN + 2) + #define __NR_creat_user_thread (__NR_OHOS_BEGIN + 3) + #define __NR_processcreat (__NR_OHOS_BEGIN + 4) + #define __NR_processtart (__NR_OHOS_BEGIN + 5) + #define __NR_printf (__NR_OHOS_BEGIN + 6) + #define __NR_dumpmemory (__NR_OHOS_BEGIN + 13) + #define __NR_mkfifo (__NR_OHOS_BEGIN + 14) + #define __NR_mqclose (__NR_OHOS_BEGIN + 15) + #define __NR_realpath (__NR_OHOS_BEGIN + 16) + #define __NR_format (__NR_OHOS_BEGIN + 17) + #define __NR_shellexec (__NR_OHOS_BEGIN + 18) + #define __NR_ohoscapget (__NR_OHOS_BEGIN + 19) + #define __NR_ohoscapset (__NR_OHOS_BEGIN + 20) + + #define __NR_new_syscall_sample (__NR_OHOS_BEGIN + 21) /* 新增的系统调用号 __NR_new_syscall_sample:521 */ + + #define __NR_syscallend (__NR_OHOS_BEGIN + 22) + ... + ``` + +2. 在LibC库中新增用户态接口的声明与实现 + + ``` + #include "stdio_impl.h" + #include "syscall.h" + ... + /* 新增系统调用用户态的接口实现 */ + void newSyscallSample(int num) + { + printf("user mode: num = %d\n", num); + __syscall(SYS_new_syscall_sample, num); + return; + } + ``` + +3. 在内核系统调用头文件中新增系统调用号 + + 如下所示,在third\_party/musl/porting/liteos\_a/kernel/include/bits/syscall.h文件中,\_\_NR\_new\_syscall\_sample为新增系统调用号。 + + ``` + ... + /* 当前现有的系统调用清单 */ + /* OHOS customized syscalls, not compatible with ARM EABI */ + #define __NR_OHOS_BEGIN 500 + #define __NR_pthread_set_detach (__NR_OHOS_BEGIN + 0) + #define __NR_pthread_join (__NR_OHOS_BEGIN + 1) + #define __NR_pthread_deatch (__NR_OHOS_BEGIN + 2) + #define __NR_creat_user_thread (__NR_OHOS_BEGIN + 3) + #define __NR_processcreat (__NR_OHOS_BEGIN + 4) + #define __NR_processtart (__NR_OHOS_BEGIN + 5) + #define __NR_printf (__NR_OHOS_BEGIN + 6) + #define __NR_dumpmemory (__NR_OHOS_BEGIN + 13) + #define __NR_mkfifo (__NR_OHOS_BEGIN + 14) + #define __NR_mqclose (__NR_OHOS_BEGIN + 15) + #define __NR_realpath (__NR_OHOS_BEGIN + 16) + #define __NR_format (__NR_OHOS_BEGIN + 17) + #define __NR_shellexec (__NR_OHOS_BEGIN + 18) + #define __NR_ohoscapget (__NR_OHOS_BEGIN + 19) + #define __NR_ohoscapset (__NR_OHOS_BEGIN + 20) + + #define __NR_new_syscall_sample (__NR_OHOS_BEGIN + 21) /* 新增的系统调用号 __NR_new_syscall_sample:521 */ + + #define __NR_syscallend (__NR_OHOS_BEGIN + 22) + ... + ``` + + 在kernel/liteos\_a/syscall/syscall\_lookup.h中,增加一行SYSCALL\_HAND\_DEF\(\_\_NR\_new\_syscall\_sample, SysNewSyscallSample, void, ARG\_NUM\_1\): + + ``` + ... + /* 当前现有的系统调用清单 */ + SYSCALL_HAND_DEF(__NR_chown, SysChown, int, ARG_NUM_3) + SYSCALL_HAND_DEF(__NR_chown32, SysChown, int, ARG_NUM_3) + #ifdef LOSCFG_SECURITY_CAPABILITY + SYSCALL_HAND_DEF(__NR_ohoscapget, SysCapGet, UINT32, ARG_NUM_2) + SYSCALL_HAND_DEF(__NR_ohoscapset, SysCapSet, UINT32, ARG_NUM_1) + #endif + /* 新增系统调用 */ + SYSCALL_HAND_DEF(__NR_new_syscall_sample, SysNewSyscallSample, void, ARG_NUM_1) + ... + ``` + +4. 在内核中新增内核该系统调用对应的处理函数 + + 如下所示,在kernel/liteos\_a/syscall/los\_syscall.h中,SysNewSyscallSample为新增系统调用的内核处理函数声明: + + ``` + ... + /* 当前现有的系统调用内核处理函数声明清单 */ + extern int SysClockSettime64(clockid_t clockID, const struct timespec64 *tp); + extern int SysClockGettime64(clockid_t clockID, struct timespec64 *tp); + extern int SysClockGetres64(clockid_t clockID, struct timespec64 *tp); + extern int SysClockNanoSleep64(clockid_t clk, int flags, const struct timespec64 *req, struct timespec64 *rem); + extern int SysTimerGettime64(timer_t timerID, struct itimerspec64 *value); + extern int SysTimerSettime64(timer_t timerID, int flags, const struct itimerspec64 *value, struct itimerspec64 *oldValue); + /* 新增的系统调用内核处理函数声明 */ + extern void SysNewSyscallSample(int num); + ... + ``` + + 新增的系统调用的内核处理函数实现如下: + + ``` + include "los_printf.h" + ... + /* 新增系统调用内核处理函数的实现 */ + void SysNewSyscallSample(int num) + { + PRINTK("kernel mode: num = %d\n", num); + return; + } + ``` + + +**结果验证:** + +用户态程序调用newSyscallSample\(10\)接口,得到输出结果如下: + +``` +/* 用户态接口与内核态接口均有输出,证明系统调用已使能 */ +user mode: num = 10 +kernel mode: num = 10 +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-bundles.md b/zh-cn/device-dev/kernel/kernel-small-bundles.md new file mode 100644 index 0000000000000000000000000000000000000000..1a174f1c6efefd717b421bf7e513c1fa9d32f6da --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-bundles.md @@ -0,0 +1,13 @@ +# 扩展组件 + +- **[系统调用](kernel-small-bundles-system.md)** + +- **[动态加载与链接](kernel-small-bundles-init.md)** + +- **[虚拟动态共享库](kernel-small-bundles-share.md)** + +- **[轻量级进程间通信](kernel-small-bundles-lite.md)** + +- **[文件系统](kernel-small-bundles-file.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-inner-info.md b/zh-cn/device-dev/kernel/kernel-small-debug-inner-info.md new file mode 100644 index 0000000000000000000000000000000000000000..74ba36bc295e6e4855eefce41d57204c4bc4df18 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-inner-info.md @@ -0,0 +1,106 @@ +# 内存信息统计 + +- [基础概念](#section52691565235) +- [功能配置](#section470611682411) +- [开发指导](#section9368374243) + - [开发流程](#section679912407257) + - [编程实例](#section1025453412611) + + +## 基础概念 + +内存信息包括内存池大小、内存使用量、剩余内存大小、最大空闲内存、内存水线、内存节点数统计、碎片率等。 + +- 内存水线:即内存池的最大使用量,每次申请和释放时,都会更新水线值,实际业务可根据该值,优化内存池大小; + +- 碎片率:衡量内存池的碎片化程度,碎片率高表现为内存池剩余内存很多,但是最大空闲内存块很小,可以用公式(fragment=100-100\*最大空闲内存块大小/剩余内存大小)来度量 + +- 其他统计信息:调用接口LOS\_MemInfoGet时,会扫描内存池的节点信息,统计出相关信息。 + +## 功能配置 + +LOSCFG\_MEM\_WATERLINE:开关宏,默认关闭;若需要打开这个功能,可以在配置项中开启“Debug-\> Enable memory pool waterline or not”。如需获取内存水线,需要打开该配置。 + +## 开发指导 + +### 开发流程 + +关键结构体介绍: + +``` +typedef struct { + UINT32 totalUsedSize; // 内存池的内存使用量 + UINT32 totalFreeSize; // 内存池的剩余内存大小 + UINT32 maxFreeNodeSize; // 内存池的最大空闲内存块大小 + UINT32 usedNodeNum; // 内存池的非空闲内存块个数 + UINT32 freeNodeNum; // 内存池的空闲内存块个数 +#if (LOSCFG_MEM_WATERLINE == 1) // 默认关闭,可以通过menuconfig配置工具打开 + UINT32 usageWaterLine; // 内存池的水线值 +#endif +} LOS_MEM_POOL_STATUS; +``` + +- 内存水线获取:调用LOS\_MemInfoGet接口,第1个参数是内存池首地址,第2个参数是LOS\_MEM\_POOL\_STATUS类型的句柄,其中字段usageWaterLine即水线值。 + +- 内存碎片率计算:同样调用LOS\_MemInfoGet接口,可以获取内存池的剩余内存大小和最大空闲内存块大小,然后根据公式(fragment=100-100\*最大空闲内存块大小/剩余内存大小)得出此时的动态内存池碎片率。 + +### 编程实例 + +本实例实现如下功能: + +1. 创建一个监控线程,用于获取内存池的信息; +2. 调用LOS\_MemInfoGet接口,获取内存池的基础信息; +3. 利用公式算出使用率及碎片率。 + +**示例代码** + +代码实现如下: + +``` +#include +#include +#include "los_task.h" +#include "los_memory.h" +#include "los_config.h" + +void MemInfoTaskFunc(void) +{ + LOS_MEM_POOL_STATUS poolStatus = {0}; + + /* pool为要统计信息的内存地址,此处以OS_SYS_MEM_ADDR为例 */ + void *pool = OS_SYS_MEM_ADDR; + LOS_MemInfoGet(pool, &poolStatus); + /* 算出内存池当前的碎片率百分比 */ + unsigned char fragment = 100 - poolStatus.maxFreeNodeSize * 100 / poolStatus.totalFreeSize; + /* 算出内存池当前的使用率百分比 */ + unsigned char usage = LOS_MemTotalUsedGet(pool) * 100 / LOS_MemPoolSizeGet(pool); + printf("usage = %d, fragment = %d, maxFreeSize = %d, totalFreeSize = %d, waterLine = %d\n", usage, fragment, poolStatus.maxFreeNodeSize, + poolStatus.totalFreeSize, poolStatus.usageWaterLine); +} + +int MemTest(void) +{ + unsigned int ret; + unsigned int taskID; + TSK_INIT_PARAM_S taskStatus = {0}; + taskStatus.pfnTaskEntry = (TSK_ENTRY_FUNC)MemInfoTaskFunc; + taskStatus.uwStackSize = 0x1000; + taskStatus.pcName = "memInfo"; + taskStatus.usTaskPrio = 10; + ret = LOS_TaskCreate(&taskID, &taskStatus); + if (ret != LOS_OK) { + printf("task create failed\n"); + return -1; + } + return 0; +} +``` + +**结果验证** + +编译运行输出的结果如下: + +``` +usage = 22, fragment = 3, maxFreeSize = 49056, totalFreeSize = 50132, waterLine = 1414 +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-inner-leak.md b/zh-cn/device-dev/kernel/kernel-small-debug-inner-leak.md new file mode 100644 index 0000000000000000000000000000000000000000..bd226640d40b006648dc013445ad18bc490fccd1 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-inner-leak.md @@ -0,0 +1,126 @@ +# 内存泄漏检测 + +- [基础概念](#section1026719436293) +- [功能配置](#section13991354162914) +- [开发指导](#section95828159308) + - [开发流程](#section369844416304) + - [编程实例](#section460801313313) + + +## 基础概念 + +内存泄漏检测机制作为内核的可选功能,用于辅助定位动态内存泄漏问题。开启该动能,动态内存机制会自动记录申请内存时的函数调用关系(下文简称LR)。如果出现泄漏,就可以利用这些记录的信息,找到内存申请的地方,方便进一步确认。 + +## 功能配置 + +1. LOSCFG\_MEM\_LEAKCHECK:开关宏,默认关闭;如需要打开这个功能,可以在配置项中开启“Debug-\> Enable Function call stack of Mem operation recorded”。 +2. LOS\_RECORD\_LR\_CNT:记录的LR层数,默认3层;每层LR消耗sizeof\(void \*\)字节数的内存。 +3. LOS\_OMIT\_LR\_CNT:忽略的LR层数,默认2层,即从调用LOS\_MemAlloc的函数开始记录,可根据实际情况调整。为啥需要这个配置?有3点原因如下: + - LOS\_MemAlloc接口内部也有函数调用; + - 外部可能对LOS\_MemAlloc接口有封装; + - LOS\_RECORD\_LR\_CNT 配置的LR层数有限; + + +正确配置这个宏,将无效的LR层数忽略,就可以记录有效的LR层数,节省内存消耗。 + +## 开发指导 + +### 开发流程 + +该调测功能可以分析关键的代码逻辑中是否存在内存泄漏。开启这个功能,每次申请内存时,会记录LR信息。在需要检测的代码段前后,调用LOS\_MemUsedNodeShow接口,每次都会打印指定内存池已使用的全部节点信息,对比前后两次的节点信息,新增的节点信息就是疑似泄漏的内存节点。通过LR,可以找到具体申请的代码位置,进一步确认是否泄漏。 + +调用LOS\_MemUsedNodeShow接口输出的节点信息格式如下:每1行为一个节点信息;第1列为节点地址,可以根据这个地址,使用GDB等手段查看节点完整信息;第2列为节点的大小,等于节点头大小+数据域大小;第3\~5列为函数调用关系LR地址,可以根据这个值,结合汇编文件,查看该节点具体申请的位置。 + +``` +node size LR[0] LR[1] LR[2] +0x10017320: 0x528 0x9b004eba 0x9b004f60 0x9b005002 +0x10017848: 0xe0 0x9b02c24e 0x9b02c246 0x9b008ef0 +0x10017928: 0x50 0x9b008ed0 0x9b068902 0x9b0687c4 +0x10017978: 0x24 0x9b008ed0 0x9b068924 0x9b0687c4 +0x1001799c: 0x30 0x9b02c24e 0x9b02c246 0x9b008ef0 +0x100179cc: 0x5c 0x9b02c24e 0x9b02c246 0x9b008ef0 +``` + +>![](../public_sys-resources/icon-caution.gif) **注意:** +>开启内存检测会影响内存申请的性能,且每个内存节点都会记录LR地址,内存开销也加大。 + +### 编程实例 + +本实例实现如下功能:构建内存泄漏代码段。 + +1. 调用OsMemUsedNodeShow接口,输出全部节点信息打印; +2. 申请内存,但没有释放,模拟内存泄漏; +3. 再次调用OsMemUsedNodeShow接口,输出全部节点信息打印; +4. 将两次log进行对比,得出泄漏的节点信息; +5. 通过LR地址,找出泄漏的代码位置; + +**示例代码** + +代码实现如下: + +``` +#include +#include +#include "los_memory.h" +#include "los_config.h" + +void MemLeakTest(void) +{ + OsMemUsedNodeShow(LOSCFG_SYS_HEAP_ADDR); + void *ptr1 = LOS_MemAlloc(LOSCFG_SYS_HEAP_ADDR, 8); + void *ptr2 = LOS_MemAlloc(LOSCFG_SYS_HEAP_ADDR, 8); + OsMemUsedNodeShow(LOSCFG_SYS_HEAP_ADDR); +} +``` + +**结果验证** + +编译运行输出log如下: + +``` +node size LR[0] LR[1] LR[2] +0x20001b04: 0x24 0x08001a10 0x080035ce 0x080028fc +0x20002058: 0x40 0x08002fe8 0x08003626 0x080028fc +0x200022ac: 0x40 0x08000e0c 0x08000e56 0x0800359e +0x20002594: 0x120 0x08000e0c 0x08000e56 0x08000c8a +0x20002aac: 0x56 0x08000e0c 0x08000e56 0x08004220 + +node size LR[0] LR[1] LR[2] +0x20001b04: 0x24 0x08001a10 0x080035ce 0x080028fc +0x20002058: 0x40 0x08002fe8 0x08003626 0x080028fc +0x200022ac: 0x40 0x08000e0c 0x08000e56 0x0800359e +0x20002594: 0x120 0x08000e0c 0x08000e56 0x08000c8a +0x20002aac: 0x56 0x08000e0c 0x08000e56 0x08004220 +0x20003ac4: 0x1d 0x08001458 0x080014e0 0x080041e6 +0x20003ae0: 0x1d 0x080041ee 0x08000cc2 0x00000000 +``` + +对比两次log,差异如下,这些内存节点就是疑似泄漏的内存块: + +``` +0x20003ac4: 0x1d 0x08001458 0x080014e0 0x080041e6 +0x20003ae0: 0x1d 0x080041ee 0x08000cc2 0x00000000 +``` + +部分汇编文件如下: + +``` + MemLeakTest: + 0x80041d4: 0xb510 PUSH {R4, LR} + 0x80041d6: 0x4ca8 LDR.N R4, [PC, #0x2a0] ; g_memStart + 0x80041d8: 0x0020 MOVS R0, R4 + 0x80041da: 0xf7fd 0xf93e BL LOS_MemUsedNodeShow ; 0x800145a + 0x80041de: 0x2108 MOVS R1, #8 + 0x80041e0: 0x0020 MOVS R0, R4 + 0x80041e2: 0xf7fd 0xfbd9 BL LOS_MemAlloc ; 0x8001998 + 0x80041e6: 0x2108 MOVS R1, #8 + 0x80041e8: 0x0020 MOVS R0, R4 + 0x80041ea: 0xf7fd 0xfbd5 BL LOS_MemAlloc ; 0x8001998 + 0x80041ee: 0x0020 MOVS R0, R4 + 0x80041f0: 0xf7fd 0xf933 BL LOS_MemUsedNodeShow ; 0x800145a + 0x80041f4: 0xbd10 POP {R4, PC} + 0x80041f6: 0x0000 MOVS R0, R0 +``` + +其中,通过查找0x080041ee,就可以发现该内存节点是在MemLeakTest接口里申请的且是没有释放的。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-inner-step.md b/zh-cn/device-dev/kernel/kernel-small-debug-inner-step.md new file mode 100644 index 0000000000000000000000000000000000000000..cc3e46c0d7e0782aefeac31834c8c8eb2b0a690b --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-inner-step.md @@ -0,0 +1,84 @@ +# 踩内存检测 + +- [基础概念](#section17368154517335) +- [功能配置](#section4696190123420) +- [开发指导](#section672362973417) + - [开发流程](#section026014863416) + - [编程实例](#section186311302356) + + +## 基础概念 + +踩内存检测机制作为内核的可选功能,用于检测动态内存池的完整性。通过该机制,可以及时发现内存池是否发生了踩内存问题,并给出错误信息,便于及时发现系统问题,提高问题解决效率,降低问题定位成本。 + +## 功能配置 + +LOSCFG\_BASE\_MEM\_NODE\_INTEGRITY\_CHECK:开关宏,默认关闭;若打开这个功能,可以在配置项中开启“Debug-\> Enable integrity check or not”。 + +1、开启这个功能,每次申请内存,会实时检测内存池的完整性。 + +2、如果不开启该功能,也可以调用LOS\_MemIntegrityCheck接口检测,但是每次申请内存时,不会实时检测内存完整性,而且由于节点头没有魔鬼数字(开启时才有,省内存),检测的准确性也会相应降低,但对于系统的性能没有影响,故根据实际情况开关该功能。 + +由于该功能只会检测出哪个内存节点被破坏了,并给出前节点信息(因为内存分布是连续的,当前节点最有可能被前节点破坏)。如果要进一步确认前节点在哪里申请的,需开启内存泄漏检测功能,通过LR记录,辅助定位。 + +>![](../public_sys-resources/icon-caution.gif) **注意:** +>开启该功能,节点头多了魔鬼数字字段,会增大节点头大小。由于实时检测完整性,故性能影响较大;若性能敏感的场景,可以不开启该功能,使用LOS\_MemIntegrityCheck接口检测。 + +## 开发指导 + +### 开发流程 + +通过调用LOS\_MemIntegrityCheck接口检测内存池是否发生了踩内存,如果没有踩内存问题,那么接口返回0且没有log输出;如果存在踩内存问题,那么会输出相关log,详见下文编程实例的结果输出。 + +### 编程实例 + +本实例实现如下功能: + +1. 申请两个物理上连续的内存块; +2. 通过memset构造越界访问,踩到下个节点的头4个字节; +3. 调用LOS\_MemIntegrityCheck检测是否发生踩内存。 + +**示例代码** + +代码实现如下: + +``` +#include +#include +#include "los_memory.h" +#include "los_config.h" + +void MemIntegrityTest(void) +{ + /* 申请两个物理连续的内存块 */ + void *ptr1 = LOS_MemAlloc(LOSCFG_SYS_HEAP_ADDR, 8); + void *ptr2 = LOS_MemAlloc(LOSCFG_SYS_HEAP_ADDR, 8); + /* 第一个节点内存块大小是8字节,那么12字节的清零,会踩到第二个内存节点的节点头,构造踩内存场景 */ + memset(ptr1, 0, 8 + 4); + LOS_MemIntegrityCheck(LOSCFG_SYS_HEAP_ADDR); +} +``` + +**结果验证** + +编译运行输出log如下: + +``` +[ERR][OsMemMagicCheckPrint], 2028, memory check error! +memory used but magic num wrong, magic num = 0x00000000 /* 提示信息,检测到哪个字段被破坏了,用例构造了将下个节点的头4个字节清零,即魔鬼数字字段 */ + + broken node head: 0x20003af0 0x00000000 0x80000020, prev node head: 0x20002ad4 0xabcddcba 0x80000020 +/* 被破坏节点和其前节点关键字段信息,分别为其前节点地址、节点的魔鬼数字、节点的sizeAndFlag;可以看出被破坏节点的魔鬼数字字段被清零,符合用例场景 */ + + broken node head LR info: /* 节点的LR信息需要开启内存检测功能才有有效输出 */ + LR[0]:0x0800414e + LR[1]:0x08000cc2 + LR[2]:0x00000000 + + pre node head LR info: /* 通过LR信息,可以在汇编文件中查找前节点是哪里申请,然后排查其使用的准确性 */ + LR[0]:0x08004144 + LR[1]:0x08000cc2 + LR[2]:0x00000000 +[ERR]Memory interity check error, cur node: 0x20003b10, pre node: 0x20003af0 /* 被破坏节点和其前节点的地址 */ +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-inner.md b/zh-cn/device-dev/kernel/kernel-small-debug-inner.md new file mode 100644 index 0000000000000000000000000000000000000000..cea736bf6db851fc8d0f86936c169c4ecf556f56 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-inner.md @@ -0,0 +1,9 @@ +# 内存调测 + +- **[内存信息统计](kernel-small-debug-inner-info.md)** + +- **[内存泄漏检测](kernel-small-debug-inner-leak.md)** + +- **[踩内存检测](kernel-small-debug-inner-step.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-other.md b/zh-cn/device-dev/kernel/kernel-small-debug-other.md new file mode 100644 index 0000000000000000000000000000000000000000..7e6aabd55a8ec6075036ae56f69f6b2d093d1955 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-other.md @@ -0,0 +1,7 @@ +# 其他内核调测手段 + +- **[临终遗言](kernel-small-debug-trace-other-topic.md)** + +- **[常见问题定位方法](kernel-small-debug-trace-other-faqs.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-pro-cpu.md b/zh-cn/device-dev/kernel/kernel-small-debug-pro-cpu.md new file mode 100644 index 0000000000000000000000000000000000000000..67325d84c9be596063aed18a571b51956e13f202 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-pro-cpu.md @@ -0,0 +1,195 @@ +# CPU占用率 + +- [基本概念](#section17683419227) +- [运行机制](#section593718536227) +- [开发指导](#section11284210152311) + - [接口说明](#section3745151592312) + - [开发流程](#section122901429182316) + - [编程实例](#section1765785212310) + + +## 基本概念 + +CPU(中央处理器,Central Processing Unit)占用率分为系统CPU占用率、进程CPU占用率、任务CPU占用率和中断CPU占用率。用户通过系统级的CPU占用率,判断当前系统负载是否超出设计规格。通过系统中各个进程/任务/中断的CPU占用情况,判断各个进程/任务/中断的CPU占用率是否符合设计的预期。 + +- 系统CPU占用率(CPU Percent) + + 指周期时间内系统的CPU占用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系统CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分比。100表示系统满负荷运转。 + +- 进程CPU占用率 + + 指单个进程的CPU占用率,用于表示单个进程在一段时间内的闲忙程度。进程CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分比。100表示在一段时间内系统一直在运行该进程。 + +- 任务CPU占用率 + + 指单个任务的CPU占用率,用于表示单个任务在一段时间内的闲忙程度。任务CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分比。100表示在一段时间内系统一直在运行该任务。 + +- 中断CPU占用率 + + 指单个中断的CPU占用率,用于表示单个中断在一段时间内的闲忙程度。中断CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分比。100表示在一段时间内系统一直在运行该中断。 + + +## 运行机制 + +OpenHarmony LiteOS-A内核CPUP(CPU Percent,CPU占用率)模块采用进程、任务和中断级记录的方式,在进程/任务切换时,记录进程/任务启动时间,进程/任务切出或者退出时,系统会累加整个进程/任务的占用时间; 在执行中断时系统会累加记录每个中断的执行时间。 + +OpenHarmony 提供以下四种CPU占用率的信息查询: + +- 系统CPU占用率 +- 进程CPU占用率 +- 任务CPU占用率 +- 中断CPU占用率 + +**CPU占用率的计算方法:** + +系统CPU占用率=系统中除idle任务外其他任务运行总时间/系统运行总时间 + +进程CPU占用率=进程运行总时间/系统运行总时间 + +任务CPU占用率=任务运行总时间/系统运行总时间 + +中断CPU占用率=中断运行总时间/系统运行总时间 + +## 开发指导 + +### 接口说明 + +**表 1** CPUP模块接口 + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

系统CPU占用率

+

LOS_HistorySysCpuUsage

+

获取系统历史CPU占用率

+

进程CPU占用率

+

LOS_HistoryProcessCpuUsage

+

获取指定进程历史CPU占用率

+

LOS_GetAllProcessCpuUsage

+

获取系统所有进程的历史CPU占用率

+

任务CPU占用率

+

LOS_HistoryTaskCpuUsage

+

获取指定任务历史CPU占用率

+

中断CPU占用率

+

LOS_GetAllIrqCpuUsage

+

获取系统所有中断的历史CPU占用率

+
+ +### 开发流程 + +CPU占用率的典型开发流程: + +1. 调用获取系统历史CPU占用率函数LOS\_HistorySysCpuUsage。 +2. 调用获取指定进程历史CPU占用率函数LOS\_HistoryProcessCpuUsage。 + - 若进程已创建,则关中断,根据不同模式正常获取,恢复中断; + - 若进程未创建,则返回错误码; + +3. 调用获取所有进程CPU占用率函数LOS\_GetAllProcessCpuUsage。 + - 若CPUP已初始化,则关中断,根据不同模式正常获取,恢复中断; + - 若CPUP未初始化或有非法入参,则返回错误码; + +4. 调用获取指定任务历史CPU占用率函数LOS\_HistoryTaskCpuUsage。 + - 若任务已创建,则关中断,根据不同模式正常获取,恢复中断; + - 若任务未创建,则返回错误码; + +5. 调用获取所有中断CPU占用率函数LOS\_GetAllIrqCpuUsage。 + - 若CPUP已初始化,则关中断,根据不同模式正常获取,恢复中断; + - 若CPUP未初始化或有非法入参,则返回错误码; + + +### 编程实例 + +本实例实现如下功能: + +1. 创建一个用于CPUP测试的任务。 +2. 获取当前系统CPUP。 +3. 以不同模式获取历史系统CPUP。 +4. 获取创建的测试任务的CPUP。 +5. 以不同模式获取创建的测试任务的CPUP。 + +前提条件: + +在menuconfig 配置中打开cpup控制开关。 + +**示例代码** + +代码实现如下: + +``` +#include "los_task.h" +#include "los_cpup.h" +#define MODE 4 +UINT32 g_cpuTestTaskID; +VOID ExampleCpup(VOID) +{ + printf("entry cpup test example\n"); + while(1) { + usleep(100); + } +} +UINT32 ItCpupTest(VOID) +{ + UINT32 ret; + UINT32 cpupUse; + TSK_INIT_PARAM_S cpupTestTask = { 0 }; + memset(&cpupTestTask, 0, sizeof(TSK_INIT_PARAM_S)); + cpupTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleCpup; + cpupTestTask.pcName = "TestCpupTsk"; + cpupTestTask.uwStackSize = 0x800; + cpupTestTask.usTaskPrio = 5; + ret = LOS_TaskCreate(&g_cpuTestTaskID, &cpupTestTask); + if(ret != LOS_OK) { + printf("cpupTestTask create failed .\n"); + return LOS_NOK; + } + + usleep(100); + + /* 获取当前系统历史cpu占用率 */ + cpupUse = LOS_HistorySysCpuUsage(CPU_LESS_THAN_1S); + printf("the history system cpu usage in all time:%u.%u\n", + cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); + /* 获取指定任务的cpu占用率,该测试例程中指定的任务为以上创建的cpup测试任务 */ + cpupUse = LOS_HistoryTaskCpuUsage(g_cpuTestTaskID, CPU_LESS_THAN_1S); + printf("cpu usage of the cpupTestTask in all time:\n TaskID: %d\n usage: %u.%u\n", + g_cpuTestTaskID, cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); + return LOS_OK; +} +``` + +**结果验证** + +编译运行得到的结果为: + +``` +entry cpup test example +the history system cpu usage in all time: 3.0 +cpu usage of the cpupTestTask in all time: TaskID:10 usage: 0.0 +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-pro.md b/zh-cn/device-dev/kernel/kernel-small-debug-pro.md new file mode 100644 index 0000000000000000000000000000000000000000..2211771b01420eca2868bbf21987ec8cf2349434 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-pro.md @@ -0,0 +1,5 @@ +# 进程调测 + +- **[CPU占用率](kernel-small-debug-pro-cpu.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-abn.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-abnormal.md similarity index 98% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-abn.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-abnormal.md index 93243d7f3fd758299fab4dd6c21cbed3b487155b..a76b3054e77720289dfa4374339d64841d7bad8c 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-abn.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-abnormal.md @@ -1,4 +1,4 @@ -# 用户态异常信息说明 +# 用户态异常信息说明 用户态在运行过程中,可能由于各种原因出现用户态系统异常,异常信息如下所示: diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-sample.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-build.md similarity index 92% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-sample.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-build.md index 0ab161a9080a9a6b1f7e06215a91a5d68c26e82d..66e0d24b3f988aa002bd7aec2975f6114acfad55 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-sample.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-build.md @@ -1,10 +1,10 @@ -# Shell命令编程实例 +# Shell命令编程实例 - [实例描述](#section87143612316) - [静态注册方式](#section1660495712314) -- [静态注册编程实例](#section0410326242) +- [静态注册编程实例](#section1233411684113) - [动态注册方式](#section6804126192412) -- [动态注册编程实例](#section17474410102419) +- [动态注册编程实例](#section2335121613418) ## 实例描述 @@ -23,7 +23,7 @@ 4. 重新编译代码后运行。 -## 静态注册编程实例 +## 静态注册编程实例 1. 定义命令所要调用的函数cmd\_test: @@ -78,7 +78,7 @@ 2. 重新编译后运行。 -## 动态注册编程实例 +## 动态注册编程实例 1. 在用户应用函数中调用osCmdReg函数动态注册命令。 diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-cpup.md b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-cpup.md similarity index 81% rename from zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-cpup.md rename to zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-cpup.md index 5d9bf1de8a7e21bf2e07681ba275a02ff007c638..d4369646dd0747a718a3ebbe86552d870eb4db74 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-shell-cmd-sys-cpup.md +++ b/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-cpup.md @@ -1,4 +1,4 @@ -# cpup +# cpup - [命令功能](#section1842161614217) - [命令格式](#section5629527427) @@ -30,10 +30,7 @@ cpup \[_mode_\] \[_taskID_\]

mode

● 缺省:显示系统最近10s内的CPU占用率。

-

● 0:显示系统最近10s内的CPU占用率。

-

● 1:显示系统最近1s内的CPU占用率。

-

● 其他数字:显示系统启动至今总的CPU 占用率。

+
  • 缺省:显示系统最近10s内的CPU占用率。
  • 0:显示系统最近10s内的CPU占用率。
  • 1:显示系统最近1s内的CPU占用率。
  • 其他数字:显示系统启动至今总的CPU 占用率。

[0,0xFFFFFFFF]

+ + + + + + + + + + + + + + + + +

参数

+

参数说明

+

startAddr

+

存取异常信息的物理介质起始地址

+

space

+

存取的空间大小

+

buf

+

存取异常信息的内存缓冲区

+

log_read_write_fn

+

存取异常信息的函数

+
+ +**表 2** log\_read\_write\_fn 参数说明 + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

startAddr

+

存取异常信息的物理介质起始地址

+

space

+

存取的空间大小

+

rwFlag

+

读写标记,0为写,1为读

+

buf

+

存取异常信息的内存缓冲区

+
+ +## 开发流程 + +该功能依赖于宏LOSCFG\_SAVE\_EXCINFO,使用临终遗言功能时,在配置项中开启“ Enable Saving Exception Information ”:Debug-\> Enable Saving Exception Information ;若关闭该选项,则该功能失效。功能开启后,可在SystemInit中调用LOS\_ExcInfoRegHook来注册存取异常信息的位置、大小、内存缓冲区以及存取函数。当系统进入异常时,会将异常时系统各类信息先保存在注册时传入的内存缓冲区中,最后调用注册的存取函数,将异常信息写入到物理存储介质中。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 注册的存取位置不要跟其他存储重叠。 +>- 注册的内存缓冲区不能太小,建议不低于16KiB,否则异常信息会存储不完整。 +>- 注册的读写函数对应的具体存储介质的驱动功能正常,才能保证存取功能正常。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug-trace.md b/zh-cn/device-dev/kernel/kernel-small-debug-trace.md new file mode 100644 index 0000000000000000000000000000000000000000..bc83604a8bdc7246917a3e9666d57d55bd1c89f5 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug-trace.md @@ -0,0 +1,102 @@ +# Trace + +- [基本概念](#section531482192018) +- [运行机制](#section5125124532010) +- [使用指导](#section1381714413216) + +## 基本概念 + +Trace是内核提供的一个跟踪模块关键流程的功能框架,各个模块根据机制需要,可以在关键位置通过Trace进行相关信息记录,再通过文件或者其他方式导出,对数据进行分析。 + +Trace的记录要求: + +1. 需要尽快的完成信息记录,对系统时序的影响降低到最小; +2. 需要尽可能的用小的空间存储大的数据量,减少内存消耗。 + +## 运行机制 + +在内核启动初期完成Trace功能的初始化,并且在支持Trace功能的模块进行初始化时,完成模块相应的Trace类型及回调函数的注册,触发Trace记录的trace point的具体位置可由各模块自行决定。 + +当系统触发到一个trace point时,Trace模块会对输入信息进行封装,添加Trace帧头信息,包含Trace类型、运行的cpuid、运行的任务id、运行的相对时间戳以及运行的进程id;再将trace frame记录到预先申请好的循环buffer中。 + +如果循环buffer记录的frame过多则可能出现翻转,会覆盖之前的记录,故保持记录的信息始终是最新的信息。Trace循环buffer的数据可以通过文件dump等形式导出进行详细分析,导出信息已按照时间戳信息完成排序。 + +![](figure/zh-cn_image_0000001127390512.png) + +## 使用指导 + +1. 配置Trace控制宏LOSCFG\_KERNEL\_TRACE,默认关,通过在menuconfig内核配置"Kernel-\>Enable Trace Feature"中打开。 +2. 内核启动完成Trace初始化,对应接口OsTraceInit。 +3. 统一在los\_trace\_frame.h定义模块内traceframe结构体,并在los\_trace\_frame.c中实现模块Trace回调函数的实现。 +4. 需要跟踪的模块在初始化或者更早阶段完成Trace注册,对应接口LOS\_TraceReg。 +5. 在需要开始跟踪的位置打开Trace开关进行记录,结束的位置关闭Trace开关停止记录。 +6. 通过LOS\_Trace2File接口导出到文件。 +7. 根据帧头及帧体数据结构,对数据进行二次分析。 + +**接口说明** + +OpenHarmony LiteOS-A内核的Trace框架提供下面几种功能,接口详细信息可以查看API参考。 + +**表 1** Trace接口说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

打桩记录

+

LOS_Trace

+

Trace信息记录打桩

+

注册解注册

+

LOS_TraceReg

+

Trace类型注册

+

LOS_TraceUnreg

+

Trace类型解注册

+

开关

+

LOS_TraceTypeSwitch

+

Trace分类开关

+

LOS_TraceSwitch

+

Trace总开关

+

数据导出

+

LOS_TraceBufDataGet

+

Trace数据获取到堆缓存(缓存空间内部申请,使用完需显示释放)

+

LOS_Trace2File

+

Trace数据存储到文件系统(依赖文件系统)

+
+ +>![](../public_sys-resources/icon-note.gif) **说明:** +>- frame buffer是个循环buffer,如果记录过长时间会覆盖旧的信息,该buffer的大小可以在los\_config.h中LOS\_TRACE\_BUFFER\_SIZE宏配置,默认配置512KiB。 +>- 尽管Trace已经尽快的完成了组装及记录,但是仍旧会对系统整体性能产生不可避免的影响。 +>- Trace支持多个模块的Trace同时记录,根据需要开关各个模块的Trace,有助于降低数据分析量。 +>- 当前内核的task、memory、liteipc模块支持Trace记录功能。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-debug.md b/zh-cn/device-dev/kernel/kernel-small-debug.md new file mode 100644 index 0000000000000000000000000000000000000000..0e14d2f0e6905483ee9f7d8020eec11eaddc4824 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-debug.md @@ -0,0 +1,13 @@ +# 调测与工具 + +- **[Shell](kernel-small-debug-shell.md)** + +- **[Trace](kernel-small-debug-trace.md)** + +- **[进程调测](kernel-small-debug-pro.md)** + +- **[内存调测](kernel-small-debug-inner.md)** + +- **[其他内核调测手段](kernel-small-debug-other.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-list-basic-link.md b/zh-cn/device-dev/kernel/kernel-small-list-basic-link.md new file mode 100644 index 0000000000000000000000000000000000000000..fe91be48f962e88edc3e5f8e946a980f8f6522a1 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-list-basic-link.md @@ -0,0 +1,229 @@ +# 双向链表 + +- [基本概念](#section1990715203418) +- [功能说明](#section848334511411) +- [开发流程](#section01781261552) + - [编程实例](#section8354175218128) + + +## 基本概念 + +双向链表是指含有往前和往后两个方向的链表,即每个结点中除存放下一个节点指针外,还增加一个指向前一个节点的指针。其头指针head是唯一确定的。从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点,这种数据结构形式使得双向链表在查找时更加方便,特别是大量数据的遍历。由于双向链表具有对称性,能方便地完成各种插入、删除等操作,但需要注意前后方向的操作。 + +## 功能说明 + +双向链表模块为用户提供下面几种功能,接口详细信息可以查看API参考。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名

+

描述

+

初始化链表

+

LOS_ListInit

+

将指定节点初始化为双向链表节点

+

LOS_DL_LIST_HEAD

+

定义一个节点并初始化为双向链表节点

+

增加节点

+

LOS_ListAdd

+

将指定节点插入到双向链表头端

+

LOS_ListHeadInsert

+

将指定节点插入到双向链表头端,LOS_ListAdd

+

LOS_ListTailInsert

+

将指定节点插入到双向链表尾端

+

增加链表

+

LOS_ListAddList

+

将指定链表的头端插入到双向链表头端

+

LOS_ListHeadInsertList

+

将指定链表的头端插入到双向链表头端,同LOS_ListAddList

+

LOS_ListTailInsertList

+

将指定链表的尾端插入到双向链表头端

+

删除节点

+

LOS_ListDelete

+

将指定节点从链表中删除

+

LOS_ListDelInit

+

将指定节点从链表中删除,并使用该节点初始化链表

+

判断双向链表

+

LOS_ListEmpty

+

判断链表是否为空

+

LOS_DL_LIST_IS_END

+

判断指定链表节点是否为链表尾端

+

LOS_DL_LIST_IS_ON_QUEUE

+

判断链表节点是否在双向链表里

+

获取结构体信息

+

LOS_OFF_SET_OF

+

获取指定结构体内的成员相对于结构体起始地址的偏移量

+

LOS_DL_LIST_ENTRY

+

获取双向链表中第一个链表节点所在的结构体地址,接口的第一个入参表示的是链表中的头节点,第二个入参是要获取的结构体名称,第三个入参是链表在该结构体中的名称

+

LOS_ListPeekHeadType

+

获取双向链表中第一个链表节点所在的结构体地址,接口的第一个入参表示的是链表中的头节点,第二个入参是要获取的结构体名称,第三个入参是链表在该结构体中的名称。如果链表为空,返回NULL。

+

LOS_ListRemoveHeadType

+

获取双向链表中第一个链表节点所在的结构体地址,并把第一个链表节点从链表中删除。接口的第一个入参表示的是链表中的头节点,第二个入参是要获取的结构体名称,第三个入参是链表在该结构体中的名称。如果链表为空,返回NULL。

+

LOS_ListNextType

+

获取双向链表中指定链表节点的下一个节点所在的结构体地址。接口的第一个入参表示的是链表中的头节点,第二个入参是指定的链表节点,第三个入参是要获取的结构体名称,第四个入参是链表在该结构体中的名称。如果链表节点下一个为链表头结点为空,返回NULL。

+

遍历双向链表

+

LOS_DL_LIST_FOR_EACH

+

遍历双向链表

+

LOS_DL_LIST_FOR_EACH_SAFE

+

遍历双向链表,并存储当前节点的后继节点用于安全校验

+

遍历包含双向链表的结构体

+

LOS_DL_LIST_FOR_EACH_ENTRY

+

遍历指定双向链表,获取包含该链表节点的结构体地址

+

LOS_DL_LIST_FOR_EACH_ENTRY_SAFE

+

遍历指定双向链表,获取包含该链表节点的结构体地址,并存储包含当前节点的后继节点的结构体地址

+
+ +## 开发流程 + +双向链表的典型开发流程: + +1. 调用LOS\_ListInit/LOS\_DL\_LIST\_HEAD初始双向链表。 +2. 调用LOS\_ListAdd向链表插入节点。 +3. 调用LOS\_ListTailInsert向链表尾部插入节点。 +4. 调用LOS\_ListDelete删除指定节点。 +5. 调用LOS\_ListEmpty判断链表是否为空。 +6. 调用LOS\_ListDelInit删除指定节点并以此节点初始化链表。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>- 需要注意节点指针前后方向的操作。 +>- 链表操作接口,为底层接口,不对入参进行判空,需要使用者确保传参合法。 +>- 如果链表节点的内存是动态申请的,删除节点时,要注意释放内存。 + +### 编程实例 + +**实例描述** + +本实例实现如下功能: + +1. 初始化双向链表。 +2. 增加节点。 +3. 删除节点。 +4. 测试操作是否成功。 + +``` +#include "stdio.h" +#include "los_list.h" + +static UINT32 ListSample(VOID) +{ + LOS_DL_LIST listHead = {NULL,NULL}; + LOS_DL_LIST listNode1 = {NULL,NULL}; + LOS_DL_LIST listNode2 = {NULL,NULL}; + + //首先初始化链表 + PRINTK("Initial head\n"); + LOS_ListInit(&listHead); + + //添加节点1和节点2,并校验他们的相互关系 + LOS_ListAdd(&listHead, &listNode1); + if (listNode1.pstNext == &listHead && listNode1.pstPrev == &listHead) { + PRINTK("Add listNode1 success\n"); + } + + LOS_ListTailInsert(&listHead, &listNode2); + if (listNode2.pstNext == &listHead && listNode2.pstPrev == &listNode1) { + PRINTK("Tail insert listNode2 success\n"); + } + + //删除两个节点 + LOS_ListDelete(&listNode1); + LOS_ListDelete(&listNode2); + + //确认链表为空 + if (LOS_ListEmpty(&listHead)) { + PRINTK("Delete success\n"); + } + + return LOS_OK; +} +``` + +**结果验证** + +编译运行得到的结果为: + +``` +Initial head +Add listNode1 success +Tail insert listNode2 success +Delete success +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-list-basic-moves.md b/zh-cn/device-dev/kernel/kernel-small-list-basic-moves.md new file mode 100644 index 0000000000000000000000000000000000000000..2cdda3573af304694e43b180774905dab36a79ab --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-list-basic-moves.md @@ -0,0 +1,125 @@ +# 位操作 + +- [基本概念](#section1990715203418) +- [功能说明](#section848334511411) +- [编程实例](#section67569495514) + - [实例描述](#section33551554391) + - [结果验证](#section8931859194) + + +## 基本概念 + +位操作是指对二进制数的bit位进行操作。程序可以设置某一变量为状态字,状态字中的每一bit位(标志位)可以具有自定义的含义。 + +## 功能说明 + +系统提供标志位的置1和清0操作,可以改变标志位的内容,同时还提供获取状态字中标志位为1的最高位和最低位的功能。用户也可以对系统的寄存器进行位操作。位操作模块为用户提供下面几种功能,接口详细信息可以查看API参考。 + +**表 1** 位操作模块接口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

功能分类

+

接口名称

+

描述

+

置1/清0标志位

+

LOS_BitmapSet

+

对状态字的某一标志位进行置1操作

+

LOS_BitmapClr

+

对状态字的某一标志位进行清0操作

+

获取标志位为1的bit位

+

LOS_HighBitGet

+

获取状态字中为1的最高位

+

LOS_LowBitGet

+

获取状态字中为1的最低位

+

连续bit位操作

+

LOS_BitmapSetNBits

+

对状态字的连续标志位进行置1操作

+

LOS_BitmapClrNBits

+

对状态字的连续标志位进行清0操作

+

LOS_BitmapFfz

+

获取从最低有效位开始的第一个0的bit位

+
+ +## 编程实例 + +### 实例描述 + +对数据实现位操作,本实例实现如下功能: + +1. 某一标志位置1。 +2. 获取标志位为1的最高bit位。 +3. 某一标志位清0。 +4. 获取标志位为1的最低bit位。 + +``` +#include "los_bitmap.h" +#include "los_printf.h" + +static UINT32 BitSample(VOID) +{ + UINT32 flag = 0x10101010; + UINT16 pos; + + PRINTK("\nBitmap Sample!\n"); + PRINTK("The flag is 0x%8x\n", flag); + + pos = 8; + LOS_BitmapSet(&flag, pos); + PRINTK("LOS_BitmapSet:\t pos : %d, the flag is 0x%0+8x\n", pos, flag); + + pos = LOS_HighBitGet(flag); + PRINTK("LOS_HighBitGet:\t The highest one bit is %d, the flag is 0x%0+8x\n", pos, flag); + + LOS_BitmapClr(&flag, pos); + PRINTK("LOS_BitmapClr:\t pos : %d, the flag is 0x%0+8x\n", pos, flag); + + pos = LOS_LowBitGet(flag); + PRINTK("LOS_LowBitGet:\t The lowest one bit is %d, the flag is 0x%0+8x\n\n", pos, flag); + + return LOS_OK; +} +``` + +### 结果验证 + +编译运行得到的结果为: + +``` +Bitmap Sample! +The flag is 0x10101010 +LOS_BitmapSet: pos : 8, the flag is 0x10101110 +LOS_HighBitGet:The highest one bit is 28, the flag is 0x10101110 +LOS_BitmapClr: pos : 28, the flag is 0x00101110 +LOS_LowBitGet: The lowest one bit is 4, the flag is 0x00101110 +``` + diff --git a/zh-cn/device-dev/kernel/kernel-small-list-basic.md b/zh-cn/device-dev/kernel/kernel-small-list-basic.md new file mode 100644 index 0000000000000000000000000000000000000000..6116fbd543418b5622bf58c1e7b9e48236d62994 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-list-basic.md @@ -0,0 +1,7 @@ +# 基本数据结构 + +- **[双向链表](kernel-small-list-basic-link.md)** + +- **[位操作](kernel-small-list-basic-moves.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-lite-small-lib-standard.md b/zh-cn/device-dev/kernel/kernel-small-list-standard.md similarity index 51% rename from zh-cn/device-dev/kernel/kernel-lite-small-lib-standard.md rename to zh-cn/device-dev/kernel/kernel-small-list-standard.md index 9af746232e7fec8dc578856a3d16335453b22dfd..732a187a26d98e23db1d856b5e244c4479e83f88 100644 --- a/zh-cn/device-dev/kernel/kernel-lite-small-lib-standard.md +++ b/zh-cn/device-dev/kernel/kernel-small-list-standard.md @@ -1,21 +1,27 @@ -# 标准库 +# 标准库 -- [框架流程](#section1247343413257) -- [操作实例](#section4807125622614) -- [常见问题](#section1219455217277) +- [标准库接口框架](#section149319478561) +- [操作实例](#section20874620185915) +- [与Linux标准库差异](#section6555642165713) + - [进程](#section11299104511409) + - [内存](#section175754484116) + - [文件系统](#section118191113134220) + - [信号](#section195939264421) + - [Time](#section20825124304213) -OpenHarmony内核使用**musl libc**库,支持标准POSIX接口,开发者可基于POSIX标准接口开发内核之上的组件及应用。 -## 框架流程 +OpenHarmony内核使用musl libc库,支持标准POSIX接口,开发者可基于POSIX标准接口开发内核之上的组件及应用。 -**图 1** POSIX接口框架 +## 标准库接口框架 + +**图 1** POSIX接口框架 ![](figure/POSIX接口框架.png "POSIX接口框架") -**musl libc**库支持POSIX标准,涉及的系统调用相关接口由OpenHarmony内核适配支持 ,以满足接口对外描述的功能要求。 +musl libc库支持POSIX标准,涉及的系统调用相关接口由OpenHarmony内核适配支持 ,以满足接口对外描述的功能要求。 标准库支持接口的详细情况请参考C库的API文档,其中也涵盖了与POSIX标准之间的差异说明。 -## 操作实例 +## 操作实例 在本示例中,主线程创建了THREAD\_NUM个子线程,每个子线程启动后等待被主线程唤醒,主线程成功唤醒所有子线程后,子线程继续执行直至生命周期结束,同时主线程通过pthread\_join方法等待所有线程执行结束。 @@ -191,7 +197,91 @@ int main(int argc, char *argv[]) #endif /* __cplusplus */ ``` -## 常见问题 +## 与Linux标准库差异 + +本节描述了OpenHarmony内核承载的标准库与Linux标准库之间存在的关键差异。更多差异详见C库API文档说明。 + +### 进程 + +1. OpenHarmony用户态**进程**优先级只支持静态优先级且用户态可配置的优先级范围为10\(最高优先级\)-31\(最低优先级)。 +2. OpenHarmony用户态**线程**优先级只支持静态优先级且用户态可配置的优先级范围为0\(最高优先级\)-31\(最低优先级)。 +3. OpenHarmony进程调度策略只支持SCHED\_RR, 线程调度策略支持SCHED\_RR和SCHED\_FIFO。 + +### 内存 + +**h2****与Linux mmap的差异** + +mmap接口原型为:void \*mmap \(void \*addr, size\_t length, int prot, int flags, int fd, off\_t offset\)。 + +其中,参数fd的生命周期实现与Linux glibc存在差异。具体体现在,glibc在成功调用mmap进行映射后,可以立即释放fd句柄。在OpenHarmony内核中,不允许用户在映射成功后立即关闭相关fd,只允许在取消映射munmap后再进行fd的close操作。如果用户不进行fd的close操作,操作系统将在进程退出时对该fd进行回收。 + +**h2****代码举例** + +Linux目前支持的情况如下: + +``` +int main(int argc, char *argv[]) +{ + int fd; + void *addr = NULL; + ... + fd = open(argv[1], O_RDONLY); + if (fd == -1){ + perror("open"); + exit(EXIT_FAILURE); + } + addr = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, offset); + if (addr == MAP_FAILED) { + perror("mmap"); + exit(EXIT_FAILURE); + } + close(fd); /* OpenHarmony does not support closing fd immediately after the mapping is successful. */ + ... + exit(EXIT_SUCCESS); +} +``` + +OpenHarmony支持的情况如下: + +``` +int main(int argc, char *argv[]) +{ + int fd; + void *addr = NULL; + ... + fd = open(argv[1], O_RDONLY); + if (fd == -1) { + perror("open"); + exit(EXIT_FAILURE); + } + addr = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, offset); + if (addr == MAP_FAILED) { + perror("mmap"); + exit(EXIT_FAILURE); + } + ... + munmap(addr, length); + close(fd); /* Close fd after the munmap is canceled. */ + exit(EXIT_SUCCESS); +} +``` + +### 文件系统 + +**系统目录**:用户无权限修改系统目录和设备挂载目录。包含/dev,/proc,/app,/bin,/data,/etc,/lib,/system,/usr目录。 + +**用户目录**:用户可以在该目录下进行文件创建、读写,但**不能进行设备挂载**。用户目录指/storage目录。 + +除**系统目录**与**用户目录**之外,用户可以自行创建文件夹进行设备的挂载。但是要注意,已挂载的文件夹及其子文件夹不允许重复或者嵌套挂载,非空文件夹不允许挂载。 + +### 信号 + +- 信号默认行为不支持STOP、CONTINUE、COREDUMP功能。 +- 无法通过信号唤醒正在睡眠状态(举例:进程调用sleep函数进入睡眠)的进程。原因:信号机制无唤醒功能,当且仅当进程被CPU调度运行时才能处理信号内容。 +- 进程退出后会发送SIGCHLD给父进程,发送动作无法取消。 +- 信号仅支持1-30号信号,接收方收到多次同一信号,仅执行一次回调函数。 + +### Time -无。 +OpenHarmony当前时间精度以tick计算,系统默认10ms/tick。sleep、timeout系列函数时间误差<=20ms。 diff --git a/zh-cn/device-dev/kernel/kernel-small-list.md b/zh-cn/device-dev/kernel/kernel-small-list.md new file mode 100644 index 0000000000000000000000000000000000000000..0c012b2cf5366336ed6ca474eb24738ddb53be7c --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-list.md @@ -0,0 +1,7 @@ +# 附录 + +- **[基本数据结构](kernel-small-list-basic.md)** + +- **[标准库](kernel-small-list-standard.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small-overview.md b/zh-cn/device-dev/kernel/kernel-small-overview.md new file mode 100644 index 0000000000000000000000000000000000000000..85151373f45051fbc9813d33976e1459e8abe05a --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-overview.md @@ -0,0 +1,97 @@ +# 内核概述 + +- [简介](#section6614133913129) +- [内核架构](#section827143517385) + +## 简介 + +OpenHarmony 轻量级内核是基于IoT领域轻量级物联网操作系统Huawei LiteOS内核演进发展的新一代内核,包含LiteOS-M和LiteOS-A两类内核。LiteOS-M内核主要应用于轻量系统,面向的MCU一般是百K级内存,可支持MPU隔离,业界类似的内核有FreeRTOS或ThreadX等;LiteOS-A内核主要应用于小型系统,面向设备一般是M级内存,可支持MMU隔离,业界类似的内核有Zircon或Darwin等。本开发指南适用于LiteOS-A内核。 + +为适应IoT产业的高速发展,OpenHarmony 轻量级内核不断优化和扩展,能够带给应用开发者友好的开发体验和统一开放的生态系统能力。轻量级内核LiteOS-A重要的新特性如下: + +- 新增了丰富的内核机制 + + 新增虚拟内存、系统调用、多核、轻量级IPC(Inter-Process Communication,进程间通信)、DAC(Discretionary Access Control,自主访问控制)等机制,丰富了内核能力;为了更好的兼容软件和开发者体验,新增支持多进程,使得应用之间内存隔离、相互不影响,提升系统的健壮性。 + +- 引入统一驱动框架HDF(Hardware Driver Foundation) + + 引入统一驱动框架HDF,统一驱动标准,为设备厂商提供了更统一的接入方式,使驱动更加容易移植,力求做到一次开发,多系统部署。 + +- 支持1200+标准POSIX接口 + + 更加全面的支持POSIX标准接口,使得应用软件易于开发和移植,给应用开发者提供了更友好的开发体验。 + +- 内核和硬件高解耦 + + 轻量级内核与硬件高度解耦,新增单板,内核代码不用修改。 + + +## 内核架构 + +轻量级内核主要由基础内核、扩展组件、HDF框架、POSIX接口组成。轻量级内核的文件系统、网络协议等扩展功能(没有像微内核那样运行在用户态)运行在内核地址空间,主要考虑组件之间直接函数调用比进程间通信或远程过程调用要快得多。 + +**图 1** OpenHarmony LiteOS-A内核架构图 + + +![](figure/zh-cn_image_0000001179063579.png) + +- 基础内核主要包括内核的基础机制,如调度、内存管理、中断异常等 +- 扩展组件主要包括文件系统、网络协议和安全等扩展功能 +- HDF框架是外设驱动统一标准框架 +- POSIX接口是为兼容POSIX标准的应用方便移植到OpenHarmony + +**基础内核** + +基础内核组件实现精简,主要包括内核的基础机制,如调度、内存管理、中断异常、内核通信等; + +- 进程管理:支持进程和线程,基于Task实现进程,进程独立4GB地址空间 +- 多核调度:支持任务和中断亲核性设置,支持绑核运行 +- 实时调度:支持高优先级抢占,同优先级时间片轮转 +- 虚拟内存:支持缺页异常,内核空间静态映射到0-1G地址,用户空间映射到1-4G地址 +- 内核通信:事件、信号量、互斥锁、队列 +- 时间管理:软件定时器、系统时钟 + +**文件系统** + +轻量级内核支持FAT,JFFS2,NFS,ramfs,procfs等众多文件系统,并对外提供完整的POSIX标准的操作接口,功能非常强大;内部使用VFS层作为统一的适配层框架,方便移植新的文件系统,各个文件系统也能自动利用VFS层提供的丰富的功能。 + +主要特性有: + +- 完整的POSIX接口支持 +- 文件级缓存\(pagecache) +- 磁盘级缓存(bcache) +- 目录缓存\(pathcache\) +- DAC能力 +- 支持嵌套挂载及文件系统堆叠等 +- 支持特性的裁剪和资源占用的灵活配置。 + +**网络协议** + +轻量级内核网络协议基于开源LWIP构建,对LWIP的RAM占用进行优化,同时提高LWIP的传输性能。 + +- 协议: IP、IPv6、 ICMP、 ND、MLD、 UDP、 TCP、IGMP、ARP、PPPoS、PPPoE +- API:socket API +- 扩展特性:多网络接口IP转发、TCP拥塞控制、RTT估计和快速恢复/快速重传 +- 应用程序:HTTP\(S\)服务、SNTP客户端、SMTP\(S\)客户端、ping工具、NetBIOS名称服务、mDNS响应程序、MQTT客户端、TFTP服务、DHCP客户端、DNS客户端、AutoIP/APIPA(零配置)、SNMP代理 + +**HDF框架** + +轻量级内核集成HDF框架,HDF框架旨在为开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。 + +- 支持多内核平台 +- 支持用户态驱动 +- 可配置组件化驱动模型 +- 基于消息的驱动接口模型 +- 基于对象的驱动、设备管理 +- HDI(Hardware Driver Interface)统一硬件接口 +- 支持电源管理、PnP + +**扩展组件** + +对内核功能进行扩展,可选但很重要的机制。 + +- 动态链接:支持标准ELF链接执行、加载地址随机化 +- 进程通信:支持轻量级LiteIPC,同时也支持标准的Mqueue、Pipe、Fifo、Signal等机制 +- 系统调用:支持170+系统调用 ,同时有支持VDSO机制 +- 权限管理:支持进程粒度的特权划分和管控,UGO三种权限配置 + diff --git a/zh-cn/device-dev/kernel/kernel-small-start-kernel.md b/zh-cn/device-dev/kernel/kernel-small-start-kernel.md new file mode 100644 index 0000000000000000000000000000000000000000..7fb58fa0b65aed49254a6aa3ac51931bdd8deeb5 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-start-kernel.md @@ -0,0 +1,135 @@ +# 内核态启动 + +- [内核启动流程](#section9882154318299) +- [编程样例](#section19145114703217) + - [实例描述](#section1045483642518) + + +## 内核启动流程 + +内核启动流程包含汇编启动阶段和C语言启动阶段2部分,如图1所示。汇编启动阶段完成CPU初始设置,关闭dcache/icache,使能FPU及neon,设置MMU建立虚实地址映射,设置系统栈,清理bss段,调用C语言main函数等。C语言启动阶段包含OsMain函数及开始调度等,其中如上图所示,OsMain函数用于内核基础初始化和架构、板级初始化等,其整体由内核启动框架主导初始化流程,图中右边区域为启动框架中可接受外部模块注册启动的阶段,各个阶段的说明如下表1所示。 + +**图 1** 内核启动流程图 + + +![](figure/zh-cn_image_0000001178856385.png) + +**表 1** 启动框架层级 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

层级

+

说明

+

LOS_INIT_LEVEL_EARLIEST

+

最早期初始化

+

说明:不依赖架构,单板以及后续模块会对其有依赖的纯软件模块初始化

+

例如:Trace模块

+

LOS_INIT_LEVEL_ARCH_EARLY

+

架构早期初始化

+

说明:架构相关,后续模块会对其有依赖的模块初始化,如启动过程中非必需的功能,建议放到LOS_INIT_LEVEL_ARCH层

+

LOS_INIT_LEVEL_PLATFORM_EARLY

+

平台早期初始化

+

说明:单板平台、驱动相关,后续模块会对其有依赖的模块初始化,如启动过程中必需的功能,建议放到LOS_INIT_LEVEL_PLATFORM层

+

例如:uart模块

+

LOS_INIT_LEVEL_KMOD_PREVM

+

内存初始化前的内核模块初始化

+

说明:在内存初始化之前需要使能的模块初始化

+

LOS_INIT_LEVEL_VM_COMPLETE

+

基础内存就绪后的初始化

+

说明:此时内存初始化完毕,需要进行使能且不依赖进程间通讯机制与系统进程的模块初始化

+

例如:共享内存功能

+

LOS_INIT_LEVEL_ARCH

+

架构后期初始化

+

说明:架构拓展功能相关,后续模块会对其有依赖的模块初始化

+

LOS_INIT_LEVEL_PLATFORM

+

平台后期初始化

+

说明:单板平台、驱动相关,后续模块会对其有依赖的模块初始化

+

例如:驱动内核抽象层初始化(mmc、mtd)

+

LOS_INIT_LEVEL_KMOD_BASIC

+

内核基础模块初始化

+

说明:内核可拆卸的基础模块初始化

+

例如:VFS初始化

+

LOS_INIT_LEVEL_KMOD_EXTENDED

+

内核扩展模块初始化

+

说明:内核可拆卸的扩展模块初始化

+

例如:系统调用初始化、ProcFS初始化、Futex初始化、HiLog初始化、HiEvent初始化、LiteIPC初始化

+

LOS_INIT_LEVEL_KMOD_TASK

+

内核任务创建

+

说明:进行内核任务的创建(内核线程,软件定时器任务)

+

例如:资源回收系统常驻任务的创建、SystemInit任务创建、CPU占用率统计任务创建

+
+ +## 编程样例 + +### 实例描述 + +新增一个内核模块,需要在内核初始化时进行该模块的初始化,则通过内核启动框架将该模块的初始化函数注册进内核启动流程中。 + +**示例代码** + +``` +/* 内核启动框架头文件 */ +#include "los_init.h" +...... + +/* 新增模块的初始化函数 */ +unsigned int OsSampleModInit(void) +{ + PRINTK("OsSampleModInit SUCCESS!\n"); + ...... +} +...... +/* 在启动框架的目标层级中注册新增模块 */ +LOS_MODULE_INIT(OsSampleModInit, LOS_INIT_LEVEL_KMOD_EXTENDED); +``` + +**结果验证** + +``` +main core booting up... +OsSampleModInit SUCCESS! +releasing 1 secondary cores +cpu 1 entering scheduler +cpu 0 entering scheduler +``` + +根据上述系统启动阶段的打印可知,内核在启动时进行了该注册模块的初始化函数调用,完成该模块的初始化操作。 + +>![](../public_sys-resources/icon-note.gif) **说明:** +>启动框架中同一层级内的注册模块不能有依赖关系,建议新增模块按照上述启动阶段进行模块初始化的拆分,按需注册启动。 +>可通过查看系统编译生成文件OHOS\_Image.map中.rodata.init.kernel.\*段内的符号表来了解当前已注册进内核启动框架中的各个模块初始化入口,以及检查新注册的模块初始化入口是否生效。 + diff --git a/zh-cn/device-dev/kernel/kernel-small-start-users.md b/zh-cn/device-dev/kernel/kernel-small-start-users.md new file mode 100644 index 0000000000000000000000000000000000000000..e5f2ad5e8dd9bd91cdd96b3b9c61f2603d658ddd --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-start-users.md @@ -0,0 +1,82 @@ +# 用户态启动 + +- [用户态根进程启动](#section79911135647) + - [根进程的启动过程](#section1184317581349) + - [根进程的职责](#section1590220321759) + +- [用户态程序运行](#section194576310611) + +## 用户态根进程启动 + +根进程是系统第一个用户态进程,进程ID为1,它是所有用户态进程的祖先。 + +**图 1** 进程树示意图 +![](figure/进程树示意图.png "进程树示意图") + +### 根进程的启动过程 + +使用链接脚本将如下init启动代码放置到系统镜像指定位置。 + +``` +#define LITE_USER_SEC_ENTRY __attribute__((section(".user.entry"))) +LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args) +{ +#ifdef LOSCFG_KERNEL_DYNLOAD + sys_call3(__NR_execve, (UINTPTR)g_initPath, 0, 0); +#endif + while (true) { + } +} +``` + +系统启动阶段,OsUserInitProcess启动init进程。具体过程如下: + +1. 由内核OsLoadUserInit加载上述代码。 +2. 创建新的进程空间,启动/bin/init进程。 + +### 根进程的职责 + +- 启动关键系统程序或服务,如交互进程shell。 + + >![](../public_sys-resources/icon-note.gif) **说明:** + >在OpenHarmony 中**init**进程通过读取/etc/init.cfg,根据配置执行指定命令,或启动指定进程(详见:[init启动引导](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/init%E5%90%AF%E5%8A%A8%E5%BC%95%E5%AF%BC%E7%BB%84%E4%BB%B6.md))。 + + +- 监控回收孤儿进程,清理子进程中的僵尸进程。 + +## 用户态程序运行 + +用户态程序常见编译方式有如下两种: + +1. [利用框架编译用户态进程](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/%E8%BF%90%E8%A1%8CHello-OHOS.md)。 +2. 手动编译 + + 实例: + + ``` + clang --target=arm-liteos --sysroot=prebuilts/lite/sysroot -o helloworld helloworld.c + ``` + + **clang**:编译器下载:[llvm安装指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/Ubuntu%E7%BC%96%E8%AF%91%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.md#section12202192215415)。 + + **--target**:--target=arm-liteos,指定编译平台为arm-liteos。 + + **--sysroot**:--sysroot=$\{YOUR\_ROOT\_PATH\}/prebuilts/lite/sysroot,指定头文件以及依赖标准库搜索路径为prebuilts下的指定路径。 + + +用户态程序启动有如下常见方式: + +- shell命令启动进程。 + + ``` + OHOS $ exec helloworld + OHOS $ ./helloworld + OHOS $ /bin/helloworld + ``` + + +- 通过POSIX接口启动新进程。 + + Fork方法创建一个新的进程,exec类接口执行一个全新的进程。 + + diff --git a/zh-cn/device-dev/kernel/kernel-small-start.md b/zh-cn/device-dev/kernel/kernel-small-start.md new file mode 100644 index 0000000000000000000000000000000000000000..92d668687e68c0e4af027a7876d22c86de4b39f2 --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small-start.md @@ -0,0 +1,7 @@ +# 内核启动 + +- **[内核态启动](kernel-small-start-kernel.md)** + +- **[用户态启动](kernel-small-start-users.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-small.md b/zh-cn/device-dev/kernel/kernel-small.md new file mode 100644 index 0000000000000000000000000000000000000000..9d1e5ac95c92846928ef4163ee522690893cb8ca --- /dev/null +++ b/zh-cn/device-dev/kernel/kernel-small.md @@ -0,0 +1,15 @@ +# 小型系统内核 + +- **[内核概述](kernel-small-overview.md)** + +- **[内核启动](kernel-small-start.md)** + +- **[基础内核](kernel-small-basic.md)** + +- **[扩展组件](kernel-small-bundles.md)** + +- **[调测与工具](kernel-small-debug.md)** + +- **[附录](kernel-small-list.md)** + + diff --git a/zh-cn/device-dev/kernel/kernel-standard-des.md b/zh-cn/device-dev/kernel/kernel-standard-overview.md similarity index 100% rename from zh-cn/device-dev/kernel/kernel-standard-des.md rename to zh-cn/device-dev/kernel/kernel-standard-overview.md diff --git a/zh-cn/device-dev/kernel/kernel-standard.md b/zh-cn/device-dev/kernel/kernel-standard.md index 67af7b81d0828a100373e0ab9de0d5b4dee9cd92..abe3b66da42466ce36b361415167cb01b875a082 100644 --- a/zh-cn/device-dev/kernel/kernel-standard.md +++ b/zh-cn/device-dev/kernel/kernel-standard.md @@ -1,6 +1,6 @@ # 标准系统内核 -- **[Linux内核概述](kernel-standard-des.md)** +- **[Linux内核概述](kernel-standard-overview.md)** - **[OpenHarmony开发板Patch使用指导](kernel-standard-patch.md)** diff --git a/zh-cn/device-dev/kernel/kernel.md b/zh-cn/device-dev/kernel/kernel.md index 05e683e74b37a2999709a58946b4377b4175feb4..46e7da114340a8847e178c1eaef5e8df7800fcb7 100644 --- a/zh-cn/device-dev/kernel/kernel.md +++ b/zh-cn/device-dev/kernel/kernel.md @@ -1,6 +1,8 @@ # 内核 -- **[轻量和小型系统内核](kernel-lite.md)** +- **[轻量系统内核](kernel-mini.md)** + +- **[小型系统内核](kernel-small.md)** - **[标准系统内核](kernel-standard.md)** diff --git a/zh-cn/device-dev/porting/Readme-CN.md b/zh-cn/device-dev/porting/Readme-CN.md index 32f2176a2d3ee35afe7adbb8fc516b9e83afc278..a0e1900ee58a76f4516a082b0c67e5288ab474f5 100755 --- a/zh-cn/device-dev/porting/Readme-CN.md +++ b/zh-cn/device-dev/porting/Readme-CN.md @@ -9,7 +9,7 @@ | 小型系统类设备 | 内存>1MB、有MMU | LiteOS-A、Linux | | 标准系统类设备 | 内存>128MB | Linux | -## 代码准备 +## 1.代码准备 目前OpenHarmony已经为各厂家创建了仓库并在openharmony-sig中进行孵化。参与孵化仓开发,需要使用如下方法初始化和下载代码。 @@ -19,14 +19,39 @@ repo init -u https://gitee.com/openharmony-sig/manifest.git -b master -m devboar 其他下载步骤与主线相同。 -## 开始移植你的开发板 - -- [轻量级系统](transplant-minichip.md) -- [小型系统](transplant-smallchip.md) -- [标准系统](standard-system-porting-guide.md) - -# 三方库移植 - -- [三方库移植指导](transplant-thirdparty.md) - - +## 2. 开始移植你的开发板 + +- [轻量系统芯片移植指导](porting-minichip.md) + - [移植准备](porting-chip-prepare.md) + - [移植须知](oem_transplant_chip_prepare_knows.md) + - [编译构建适配流程](porting-chip-prepare-process.md) + - [内核移植](porting-chip-kernel.md) + - [移植概述](porting-chip-kernel-overview.md) + - [内核基础适配](porting-chip-kernel-adjustment.md) + - [内核移植验证](porting-chip-kernel-verify.md) + - [板级系统移植](porting-chip-board.md) + - [移植概述](porting-chip-board-overview.md) + - [板级驱动适配](porting-chip-board-driver.md) + - [HAL层实现](porting-chip-board-hal.md) + - [系统组件调用](porting-chip-board-component.md) + - [三方组件适配](porting-chip-board-bundle.md) + - [XTS认证](porting-chip-board-xts.md) + - [常见问题](porting-chip-faqs.md) +- [小型系统芯片移植指导](porting-smallchip.md) + - [移植准备](porting-smallchip-prepare.md) + - [移植须知](porting-smallchip-prepare-needs.md) + - [编译构建](porting-smallchip-prepare-building.md) + - [移植内核](porting-smallchip-kernel.md) + - [LiteOS-A内核](porting-smallchip-kernel-a.md) + - [Linux内核](porting-smallchip-kernel-linux.md) + - [驱动移植](porting-smallchip-driver.md) + - [移植概述](porting-smallchip-driver-overview.md) + - [平台驱动移植](porting-smallchip-driver-plat.md) + - [器件驱动移植](porting-smallchip-driver-oom.md) +- [标准系统移植指南](standard-system-porting-guide.md) + +# 三方库移植# + +- [概述](porting-thirdparty-overview.md) +- [CMake方式组织编译的库移植](porting-thirdparty-cmake.md) +- [Makefile方式组织编译的库移植](porting-thirdparty-makefile.md) \ No newline at end of file diff --git a/zh-cn/device-dev/porting/figure/HDF_WIFI.png b/zh-cn/device-dev/porting/figure/HDF_WIFI.png index c325922a5ee67edb81aa526de1547716fae1a04b..56e6ab3aee9a539c76afd3edac98f21bff0766d5 100644 Binary files a/zh-cn/device-dev/porting/figure/HDF_WIFI.png and b/zh-cn/device-dev/porting/figure/HDF_WIFI.png differ diff --git "a/zh-cn/device-dev/porting/figure/WLAN\350\212\257\347\211\207.png" "b/zh-cn/device-dev/porting/figure/WLAN\350\212\257\347\211\207.png" new file mode 100644 index 0000000000000000000000000000000000000000..c325922a5ee67edb81aa526de1547716fae1a04b Binary files /dev/null and "b/zh-cn/device-dev/porting/figure/WLAN\350\212\257\347\211\207.png" differ diff --git a/zh-cn/device-dev/porting/transplant-chip-prepare-knows.md b/zh-cn/device-dev/porting/oem_transplant_chip_prepare_knows.md similarity index 94% rename from zh-cn/device-dev/porting/transplant-chip-prepare-knows.md rename to zh-cn/device-dev/porting/oem_transplant_chip_prepare_knows.md index 6c0282c492baf353133e15ad5fb6c24da7a2e8d9..4de0e275eef061e53fa143d15c56cd7a61862ec4 100644 --- a/zh-cn/device-dev/porting/transplant-chip-prepare-knows.md +++ b/zh-cn/device-dev/porting/oem_transplant_chip_prepare_knows.md @@ -33,7 +33,7 @@ OpenHarmony整体工程较为复杂,目录及实现为系统本身功能,如

/device

板级相关实现,各个三方厂商按照OpenHarmony规范适配实现,device下具体目录结构及移植过程参见板级系统移植

+

板级相关实现,各个三方厂商按照OpenHarmony规范适配实现,device下具体目录结构及移植过程参见板级系统移植

/vendor

@@ -80,5 +80,5 @@ OpenHarmony的device目录是基础芯片的适配目录,如果在三方芯片 ## 移植规范 - 满足OpenHarmony[开源贡献基本规范和准则](https://gitee.com/openharmony/docs/blob/master/zh-cn/contribute/%E5%8F%82%E4%B8%8E%E8%B4%A1%E7%8C%AE.md)。 -- 三方芯片适配所需要贡献的代码主要在device、vendor和arch三个目录,参照[内核目录规范](transplant-chip-kernel-overview.md)和[板级目录规范](transplant-chip-board-overview.md#section6204129143013)满足基本目录命名和使用规范。 +- 三方芯片适配所需要贡献的代码主要在device、vendor和arch三个目录,参照[内核目录规范](porting-chip-kernel-overview.md)和[板级目录规范](porting-chip-board-overview.md#section6204129143013)满足基本目录命名和使用规范。 diff --git a/zh-cn/device-dev/porting/transplant-chip-board-bundle.md b/zh-cn/device-dev/porting/porting-chip-board-bundle.md similarity index 99% rename from zh-cn/device-dev/porting/transplant-chip-board-bundle.md rename to zh-cn/device-dev/porting/porting-chip-board-bundle.md index 8e235f7c54dd67da05510aa4f0e80a4e71e2c183..d29e4480efa8927c6f4d797e3b0cbd8a2af05f9e 100644 --- a/zh-cn/device-dev/porting/transplant-chip-board-bundle.md +++ b/zh-cn/device-dev/porting/porting-chip-board-bundle.md @@ -19,7 +19,6 @@ } ``` - 注意,上面的修改最好都新建一个config或者新建一个xxx\_alt.c文件来修改,不要直接在原先的代码中修改,侵入式的修改会导致后续版本升级出现大量零散冲突,增加升级维护成本。 2. 制作patch diff --git a/zh-cn/device-dev/porting/transplant-chip-board-component.md b/zh-cn/device-dev/porting/porting-chip-board-component.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-chip-board-component.md rename to zh-cn/device-dev/porting/porting-chip-board-component.md diff --git a/zh-cn/device-dev/porting/transplant-chip-board-drive.md b/zh-cn/device-dev/porting/porting-chip-board-driver.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-chip-board-drive.md rename to zh-cn/device-dev/porting/porting-chip-board-driver.md diff --git a/zh-cn/device-dev/porting/transplant-chip-board-hal.md b/zh-cn/device-dev/porting/porting-chip-board-hal.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-chip-board-hal.md rename to zh-cn/device-dev/porting/porting-chip-board-hal.md diff --git a/zh-cn/device-dev/porting/transplant-chip-board-overview.md b/zh-cn/device-dev/porting/porting-chip-board-overview.md similarity index 94% rename from zh-cn/device-dev/porting/transplant-chip-board-overview.md rename to zh-cn/device-dev/porting/porting-chip-board-overview.md index 732872af5b5e2558bf8b298f918872b2eec030b5..eada2b43da18f4f8371ab449a0b3570d27ce30c1 100644 --- a/zh-cn/device-dev/porting/transplant-chip-board-overview.md +++ b/zh-cn/device-dev/porting/porting-chip-board-overview.md @@ -17,7 +17,7 @@ ## 板级目录规范 -板级系统编译适配参考[编译系统介绍](transplant-chip-prepare-process.md),板级相关的驱动、SDK、目录、HAL实现存放在device目录,目录结构和具体描述如下: +板级系统编译适配参考[编译系统介绍](porting-chip-prepare-process.md),板级相关的驱动、SDK、目录、HAL实现存放在device目录,目录结构和具体描述如下: ``` . diff --git a/zh-cn/device-dev/porting/transplant-chip-board-xts.md b/zh-cn/device-dev/porting/porting-chip-board-xts.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-chip-board-xts.md rename to zh-cn/device-dev/porting/porting-chip-board-xts.md diff --git a/zh-cn/device-dev/porting/porting-chip-board.md b/zh-cn/device-dev/porting/porting-chip-board.md new file mode 100644 index 0000000000000000000000000000000000000000..2a5223401bcba6e6b8f28aee176d36289a362970 --- /dev/null +++ b/zh-cn/device-dev/porting/porting-chip-board.md @@ -0,0 +1,15 @@ +# 板级系统移植 + +- **[移植概述](porting-chip-board-overview.md)** + +- **[板级驱动适配](porting-chip-board-driver.md)** + +- **[HAL层实现](porting-chip-board-hal.md)** + +- **[系统组件调用](porting-chip-board-component.md)** + +- **[三方组件适配](porting-chip-board-bundle.md)** + +- **[XTS认证](porting-chip-board-xts.md)** + + diff --git a/zh-cn/device-dev/porting/transplant-chip-faqs.md b/zh-cn/device-dev/porting/porting-chip-faqs.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-chip-faqs.md rename to zh-cn/device-dev/porting/porting-chip-faqs.md diff --git a/zh-cn/device-dev/porting/transplant-chip-kernel-adjustment.md b/zh-cn/device-dev/porting/porting-chip-kernel-adjustment.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-chip-kernel-adjustment.md rename to zh-cn/device-dev/porting/porting-chip-kernel-adjustment.md diff --git a/zh-cn/device-dev/porting/transplant-chip-kernel-overview.md b/zh-cn/device-dev/porting/porting-chip-kernel-overview.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-chip-kernel-overview.md rename to zh-cn/device-dev/porting/porting-chip-kernel-overview.md diff --git a/zh-cn/device-dev/porting/transplant-chip-kernel-verify.md b/zh-cn/device-dev/porting/porting-chip-kernel-verify.md similarity index 95% rename from zh-cn/device-dev/porting/transplant-chip-kernel-verify.md rename to zh-cn/device-dev/porting/porting-chip-kernel-verify.md index fc16eeb224f18814ed2c114a8fe3f4a07fea59b3..1df4bdd6f7b3edf8737962336b39e9bf78c4d22b 100644 --- a/zh-cn/device-dev/porting/transplant-chip-kernel-verify.md +++ b/zh-cn/device-dev/porting/porting-chip-kernel-verify.md @@ -55,5 +55,5 @@ LITE_OS_SEC_TEXT_INIT int main(void) } ``` -第一个任务运行正常后,说明最小系统的核心流程基本OK;由于xts用例框架对外依赖较多,主要是utils、bootstrap的链接脚本和编译框架,暂时无法支撑内核单独跑xts;此处略过内核测试套的测试,可以通过[XTS测试套](transplant-chip-board-xts.md)来覆盖最小系统是否完整移植成功。 +第一个任务运行正常后,说明最小系统的核心流程基本OK;由于xts用例框架对外依赖较多,主要是utils、bootstrap的链接脚本和编译框架,暂时无法支撑内核单独跑xts;此处略过内核测试套的测试,可以通过[XTS测试套](porting-chip-board-xts.md)来覆盖最小系统是否完整移植成功。 diff --git a/zh-cn/device-dev/porting/porting-chip-kernel.md b/zh-cn/device-dev/porting/porting-chip-kernel.md new file mode 100644 index 0000000000000000000000000000000000000000..b488ca9132ba1421d84a15ee0a28182b3e431052 --- /dev/null +++ b/zh-cn/device-dev/porting/porting-chip-kernel.md @@ -0,0 +1,9 @@ +# 内核移植 + +- **[移植概述](porting-chip-kernel-overview.md)** + +- **[内核基础适配](porting-chip-kernel-adjustment.md)** + +- **[内核移植验证](porting-chip-kernel-verify.md)** + + diff --git a/zh-cn/device-dev/porting/transplant-chip-prepare-process.md b/zh-cn/device-dev/porting/porting-chip-prepare-process.md similarity index 99% rename from zh-cn/device-dev/porting/transplant-chip-prepare-process.md rename to zh-cn/device-dev/porting/porting-chip-prepare-process.md index f8128b4735c30e9c4d669c3cb8f302a3caf435ef..c9fe780d754e5142e3259f245f8f7d4bf14c18d6 100644 --- a/zh-cn/device-dev/porting/transplant-chip-prepare-process.md +++ b/zh-cn/device-dev/porting/porting-chip-prepare-process.md @@ -25,7 +25,6 @@ 编译构建会按产品的选择的开发板,加载对应的config.gni,该文件中变量对系统组件全局可见。 - 以芯片解决方案厂商realtek的“rtl8720“开发板为例,device/realtek/rtl8720/liteos\_m/config.gni的内容如下: ``` diff --git a/zh-cn/device-dev/porting/transplant-chip-prepare.md b/zh-cn/device-dev/porting/porting-chip-prepare.md similarity index 31% rename from zh-cn/device-dev/porting/transplant-chip-prepare.md rename to zh-cn/device-dev/porting/porting-chip-prepare.md index 358da845b74ef9ce278a3bff22ee09be59501cb2..64ee48b8940843e378cc2fd767f0206ae6a5d444 100644 --- a/zh-cn/device-dev/porting/transplant-chip-prepare.md +++ b/zh-cn/device-dev/porting/porting-chip-prepare.md @@ -1,7 +1,7 @@ # 移植准备 -- **[移植须知](transplant-chip-prepare-knows.md)** +- **[移植须知](oem_transplant_chip_prepare_knows.md)** -- **[编译构建适配流程](transplant-chip-prepare-process.md)** +- **[编译构建适配流程](porting-chip-prepare-process.md)** diff --git a/zh-cn/device-dev/porting/porting-minichip.md b/zh-cn/device-dev/porting/porting-minichip.md new file mode 100644 index 0000000000000000000000000000000000000000..cbd7bbcbda08bc96e2a9b18a8d628426544e38d9 --- /dev/null +++ b/zh-cn/device-dev/porting/porting-minichip.md @@ -0,0 +1,11 @@ +# 轻量系统芯片移植指导 + +- **[移植准备](porting-chip-prepare.md)** + +- **[内核移植](porting-chip-kernel.md)** + +- **[板级系统移植](porting-chip-board.md)** + +- **[常见问题](porting-chip-faqs.md)** + + diff --git a/zh-cn/device-dev/porting/transplant-smallchip-drive-oom.md b/zh-cn/device-dev/porting/porting-smallchip-driver-oom.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-smallchip-drive-oom.md rename to zh-cn/device-dev/porting/porting-smallchip-driver-oom.md diff --git a/zh-cn/device-dev/porting/transplant-smallchip-drive-des.md b/zh-cn/device-dev/porting/porting-smallchip-driver-overview.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-smallchip-drive-des.md rename to zh-cn/device-dev/porting/porting-smallchip-driver-overview.md diff --git a/zh-cn/device-dev/porting/transplant-smallchip-drive-plat.md b/zh-cn/device-dev/porting/porting-smallchip-driver-plat.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-smallchip-drive-plat.md rename to zh-cn/device-dev/porting/porting-smallchip-driver-plat.md diff --git a/zh-cn/device-dev/porting/porting-smallchip-driver.md b/zh-cn/device-dev/porting/porting-smallchip-driver.md new file mode 100644 index 0000000000000000000000000000000000000000..5b2a0921c904135c90d0decda6f55b96a8737b81 --- /dev/null +++ b/zh-cn/device-dev/porting/porting-smallchip-driver.md @@ -0,0 +1,9 @@ +# 驱动移植 + +- **[移植概述](porting-smallchip-driver-overview.md)** + +- **[平台驱动移植](porting-smallchip-driver-plat.md)** + +- **[器件驱动移植](porting-smallchip-driver-oom.md)** + + diff --git a/zh-cn/device-dev/porting/transplant-smallchip-kernel-a.md b/zh-cn/device-dev/porting/porting-smallchip-kernel-a.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-smallchip-kernel-a.md rename to zh-cn/device-dev/porting/porting-smallchip-kernel-a.md diff --git a/zh-cn/device-dev/porting/transplant-smallchip-kernel-linux.md b/zh-cn/device-dev/porting/porting-smallchip-kernel-linux.md similarity index 99% rename from zh-cn/device-dev/porting/transplant-smallchip-kernel-linux.md rename to zh-cn/device-dev/porting/porting-smallchip-kernel-linux.md index 911329dbd1b9971e422b9242171c031102a137b0..a467d3cdf26edadcd26a6f25da304bb265e852d7 100644 --- a/zh-cn/device-dev/porting/transplant-smallchip-kernel-linux.md +++ b/zh-cn/device-dev/porting/porting-smallchip-kernel-linux.md @@ -87,7 +87,6 @@ Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后 启动配置在vendor/\{company\}/\{product\}/init\_configs/etc目录下,包括fstab、rsS和Sxxx文件,请按开发板实际情况配置。 - 编译完成后,可通过检查产品编译输出目录下的rootfs内容,确认rootfs.img文件生成是否符合预期。 2. 调试init进程和shell。 diff --git a/zh-cn/device-dev/porting/transplant-smallchip-kernel.md b/zh-cn/device-dev/porting/porting-smallchip-kernel.md similarity index 33% rename from zh-cn/device-dev/porting/transplant-smallchip-kernel.md rename to zh-cn/device-dev/porting/porting-smallchip-kernel.md index a1adc2dde7e4c576f8fc9137c42217474a15311e..2d13c4839377e4a433c3efb6cd1a446e3f780074 100644 --- a/zh-cn/device-dev/porting/transplant-smallchip-kernel.md +++ b/zh-cn/device-dev/porting/porting-smallchip-kernel.md @@ -1,7 +1,7 @@ # 移植内核 -- **[LiteOS-A内核](transplant-smallchip-kernel-a.md)** +- **[LiteOS-A内核](porting-smallchip-kernel-a.md)** -- **[Linux内核](transplant-smallchip-kernel-linux.md)** +- **[Linux内核](porting-smallchip-kernel-linux.md)** diff --git a/zh-cn/device-dev/porting/transplant-smallchip-prepare-building.md b/zh-cn/device-dev/porting/porting-smallchip-prepare-building.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-smallchip-prepare-building.md rename to zh-cn/device-dev/porting/porting-smallchip-prepare-building.md diff --git a/zh-cn/device-dev/porting/transplant-smallchip-prepare-needs.md b/zh-cn/device-dev/porting/porting-smallchip-prepare-needs.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-smallchip-prepare-needs.md rename to zh-cn/device-dev/porting/porting-smallchip-prepare-needs.md diff --git a/zh-cn/device-dev/porting/transplant-smallchip-prepare.md b/zh-cn/device-dev/porting/porting-smallchip-prepare.md similarity index 32% rename from zh-cn/device-dev/porting/transplant-smallchip-prepare.md rename to zh-cn/device-dev/porting/porting-smallchip-prepare.md index 6ec4b45dff790140fe40830288b5c0bb961ceddb..b76d5afe44d24f5c0294e9d5f0a8c5c944e0b72c 100644 --- a/zh-cn/device-dev/porting/transplant-smallchip-prepare.md +++ b/zh-cn/device-dev/porting/porting-smallchip-prepare.md @@ -1,7 +1,7 @@ # 移植准备 -- **[移植须知](transplant-smallchip-prepare-needs.md)** +- **[移植须知](porting-smallchip-prepare-needs.md)** -- **[编译构建](transplant-smallchip-prepare-building.md)** +- **[编译构建](porting-smallchip-prepare-building.md)** diff --git a/zh-cn/device-dev/porting/porting-smallchip.md b/zh-cn/device-dev/porting/porting-smallchip.md new file mode 100644 index 0000000000000000000000000000000000000000..df2ce355915f58107c9f9e431a25d69a86d83351 --- /dev/null +++ b/zh-cn/device-dev/porting/porting-smallchip.md @@ -0,0 +1,9 @@ +# 小型系统芯片移植指导 + +- **[移植准备](porting-smallchip-prepare.md)** + +- **[移植内核](porting-smallchip-kernel.md)** + +- **[驱动移植](porting-smallchip-driver.md)** + + diff --git a/zh-cn/device-dev/porting/transplant-thirdparty-cmake.md b/zh-cn/device-dev/porting/porting-thirdparty-cmake.md similarity index 99% rename from zh-cn/device-dev/porting/transplant-thirdparty-cmake.md rename to zh-cn/device-dev/porting/porting-thirdparty-cmake.md index fb23041d28a62d9768390ecdf41c6cc3acd4c4e2..670acc13ba9d4cbd6884beb806e069d7705ba545 100644 --- a/zh-cn/device-dev/porting/transplant-thirdparty-cmake.md +++ b/zh-cn/device-dev/porting/porting-thirdparty-cmake.md @@ -227,7 +227,7 @@ CMake方式可通过指定工具链进行交叉编译,修改并编译该库, 1. 搭建OpenHarmony环境 - 以hi3518ev300为例,编译出OpenHarmony镜像,烧写到开发板,参考[开发Hi3518第一个示例程序](../quick-start/quickstart-lite-steps-board3518-running.md)。 + 以hi3518ev300为例,编译出OpenHarmony镜像,烧写到开发板,参考[开发Hi3518第一个示例程序](../quick-start/quickstart-lite-steps-hi3518-running.md)。 进入系统如下所示: diff --git a/zh-cn/device-dev/porting/transplant-thirdparty-makefile.md b/zh-cn/device-dev/porting/porting-thirdparty-makefile.md similarity index 97% rename from zh-cn/device-dev/porting/transplant-thirdparty-makefile.md rename to zh-cn/device-dev/porting/porting-thirdparty-makefile.md index ddabc1ef30ae29930bea14394ced65ec43e227a2..fc7d05814229acdaca26ca75d2f054653d834118 100644 --- a/zh-cn/device-dev/porting/transplant-thirdparty-makefile.md +++ b/zh-cn/device-dev/porting/porting-thirdparty-makefile.md @@ -148,7 +148,7 @@ ## 测试 -yxml库测试步骤与double-conversion库基本一致,可参考[CMake方式组织编译的库移植](transplant-thirdparty-cmake.md#section6686144293611)的测试过程,以下内容介绍yxml库测试用例的使用方法: +yxml库测试步骤与double-conversion库基本一致,可参考[CMake方式组织编译的库移植](porting-thirdparty-cmake.md#section6686144293611)的测试过程,以下内容介绍yxml库测试用例的使用方法: **表 3** 生成的test目录结构示意 @@ -236,7 +236,7 @@ echo "All tests completed successfully." ## 将该库编译添加到OpenHarmony工程中 -yxml库添加的过程除了适配文件build.gn和config.gni有些许变化外,其他和double-conversion库完全一致,参考[CMake方式组织编译的库移植](transplant-thirdparty-cmake.md#section1651053153715)的配置过程。要修改的适配文件及添加后的目录结构如下: +yxml库添加的过程除了适配文件build.gn和config.gni有些许变化外,其他和double-conversion库完全一致,参考[CMake方式组织编译的库移植](porting-thirdparty-cmake.md#section1651053153715)的配置过程。要修改的适配文件及添加后的目录结构如下: - yxml库新增的BUILD.gn实现如下: diff --git a/zh-cn/device-dev/porting/transplant-thirdparty-overview.md b/zh-cn/device-dev/porting/porting-thirdparty-overview.md similarity index 100% rename from zh-cn/device-dev/porting/transplant-thirdparty-overview.md rename to zh-cn/device-dev/porting/porting-thirdparty-overview.md diff --git a/zh-cn/device-dev/porting/porting-thirdparty.md b/zh-cn/device-dev/porting/porting-thirdparty.md new file mode 100644 index 0000000000000000000000000000000000000000..306476fd681c9d20af7a121166156e27402696be --- /dev/null +++ b/zh-cn/device-dev/porting/porting-thirdparty.md @@ -0,0 +1,9 @@ +# 三方库移植指导 + +- **[概述](porting-thirdparty-overview.md)** + +- **[CMake方式组织编译的库移植](porting-thirdparty-cmake.md)** + +- **[Makefile方式组织编译的库移植](porting-thirdparty-makefile.md)** + + diff --git a/zh-cn/device-dev/porting/porting.md b/zh-cn/device-dev/porting/porting.md new file mode 100644 index 0000000000000000000000000000000000000000..735393aaf20573cd471bd71ca0cbef732244b68b --- /dev/null +++ b/zh-cn/device-dev/porting/porting.md @@ -0,0 +1,11 @@ +# 移植 + +- **[三方库移植指导](porting-thirdparty.md)** + +- **[轻量系统芯片移植指导](porting-minichip.md)** + +- **[小型系统芯片移植指导](porting-smallchip.md)** + +- **[标准系统移植指南](standard-system-porting-guide.md)** + + diff --git a/zh-cn/device-dev/porting/standard-system-porting-guide.md b/zh-cn/device-dev/porting/standard-system-porting-guide.md index ff10fc3e43412044f8b7d59a7c5416dcae9617ac..b0013ba943a68b299159983804af5bc7cd5ee3cc 100644 --- a/zh-cn/device-dev/porting/standard-system-porting-guide.md +++ b/zh-cn/device-dev/porting/standard-system-porting-guide.md @@ -1,378 +1,510 @@ -# 标准系统移植指南 - - - - - -- [定义开发板](#定义开发板) - - [1. 定义SOC](#1-定义soc) - - [2. 定义产品](#2-定义产品) - - [3. 移植验证](#3-移植验证) -- [内核移植](#内核移植) - - [1. 为SOC添加内核构建的子系统](#1-为soc添加内核构建的子系统) - - [2. 编译内核](#2-编译内核) - - [3. 移植验证](#3-移植验证-1) -- [HDF驱动移植](#hdf驱动移植) - - [1. LCD](#1-lcd) - - [2. 触摸屏](#2-触摸屏) - - [3. WLAN](#3-wlan) - - - -本文描述了移植一块开发板的通用步骤,和具体芯片相关的详细移植过程无法在此一一列举。后续社区还会陆续放出开发板移植的实例供开发者参考。 - -## 定义开发板 - -本文以移植名为MyProduct的开发板为例讲解移植过程,假定MyProduct是MyProductVendor公司的开发板,使用MySoCVendor公司生产的MySOC芯片作为处理器。 - -### 1. 定义SOC - -在`//productdefine/common/device`目录下创建以SOC名字命名的json文件,并指定CPU的架构。 - -如要移植一个叫MySOC的SOC,这个SOC采用32位ARM内核。配置如下: - -`//productdefine/common/device/MySOC.json` -```json -{ - "target_os": "ohos", - "target_cpu": "arm" -} -``` -根据实际情况,这里的target_cpu也可能是arm64 、riscv、 x86等。当前仅支持arm作为target_cpu。 - -### 2. 定义产品 - -在`//productdefine/common/products`目录下创建以产品名命名的json文件。该文件用于描述产品所使用的SOC 以及 所需的子系统。 -配置如下 -`//productdefine/common/products/MyProduct.json` -```json -{ - "product_name": "MyProduct", - "product_company" : "MyProductVendor", - "product_device": "MySOC", - "version": "2.0", - "type": "standard", - "parts":{ - "ace:ace_engine_standard":{}, - "ace:napi":{}, - ... - "xts:phone_tests":{} - } -} - -``` -主要的配置内容包括: - -1. `product_device`:配置所使用的SOC -2. `type`: 配置系统的级别, 这里直接standard即可 -3. `parts`: 系统需要启用的子系统。子系统可以简单理解位一块独立构建的功能块。 - -已定义的子系统可以在`//build/subsystem_config.json`中找到。当然你也可以定制子系统。 - -这里建议先拷贝Hi3516DV300 开发板的配置文件,删除掉 hisilicon_products 这个子系统。这个子系统为Hi3516DV300 SOC编译内核,显然不适合MySOC。 - -### 3. 移植验证 - -至此,你可以使用如下命令,启动你产品的构建了: - -`./build.sh --product-name MyProduct ` - -构建完成后,可以在如下目录看到构建出来的OpenHarmony镜像文件: - -`//out/ohos-arm-release/packages/phone/images` - -## 内核移植 - -这一步需要移植Linux内核,让Linux内核可以成功运行起来。 - -### 1. 为SOC添加内核构建的子系统 - -修改文件 `//build/subsystem_config.json` 增加一个子系统. 配置如下: - -```json - "MySOCVendor_products": { - "project": "hmf/MySOCVendor_products", - "path": "device/MySOCVendor/MySOC/build", - "name": "MySOCVendor_products", - "dir": "device/MySOCVendor" - }, -``` - -接着需要修改定义产品的配置文件`//productdefine/common/products/MyProduct.json`。将刚刚定义的子系统加入到产品中。 - -### 2. 编译内核 - -在上一节定义subsystem的时候,定义了构建的路径path,即`//device/MySOCVendor/MySOC/build`。这一节会在这个目录创建构建脚本,告诉构建系统如何构建内核。 - -目前OpenHarmony源码中提供了Linux 4.19的内核,归档在`//kernel/linux-4.19`。请尽可能使用这个内核,如果芯片厂家未提供该版本的内核,请使用厂家提供的版本。 -每个SOC必然需要对内核做一些修改或扩展,建议采用补丁的方式。 - -建议的目录结构如下: -``` -├── build -│   ├── kernel -│   │ ├── linux -│   │ ├──standard_patch_for_4_19.patch -│   ├── BUILD.gn -│   ├── ohos.build -``` -BUILD.gn是subsystem构建的唯一入口。 - -期望的构建结果 - -| 文件 | 文件说明| -|------|------| -|$root_build_dir/packages/phone/images/uImage| 内核镜像| -|$root_build_dir/packages/phone/images/uboot | bootloader镜像| - -### 3. 移植验证 - -启动编译,验证预期的kernel镜像是否成功生成。 - -## HDF驱动移植 - -### 1. LCD -HDF为LCD设计了驱动模型。支持一块新的LCD,需要编写一个驱动,在驱动中生成模型的实例,并完成注册。 - -这些LCD的驱动被放置在`//drivers/framework/model/display/driver/panel`目录中。 - -- 创建Panel驱动 - -在驱动的Init方法中,需要调用RegisterPanel接口注册模型实例。如: -```C -int32_t XXXInit(struct HdfDeviceObject *object) -{ - struct PanelData *panel = CreateYourPanel(); - - // 注册 - if (RegisterPanel(panel) != HDF_SUCCESS) { - HDF_LOGE("%s: RegisterPanel failed", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -struct HdfDriverEntry g_xxxxDevEntry = { - .moduleVersion = 1, - .moduleName = "LCD_XXXX", - .Init = XXXInit, -}; - -HDF_INIT(g_xxxxDevEntry); -``` - -- 配置加载panel驱动 -产品的所有设备信息被定义在文件`//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs`中。修改该文件,在display的host中,名为device_lcd的device中增加配置。 -注意:moduleName 要与panel驱动中的moduleName相同。 - -```hcs -root { - ... - display :: host { - device_lcd :: device { - deviceN :: deviceNode { - policy = 0; - priority = 100; - preload = 2; - moduleName = "LCD_XXXX"; - } - } - } -} -``` - -更详细的驱动开发指导,请参考 [LCD](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/LCD.md)。 - -### 2. 触摸屏 -本节描述如何移植触摸屏驱动。触摸屏的驱动被放置在`//drivers/framework/model/input/driver/touchscreen`目录中。移植触摸屏驱动主要工作是向系统注册ChipDevice模型实例。 - -- 创建触摸屏器件驱动 - -在目录中创建名为`touch_ic_name.c`的文件。代码模板如下: -注意:请替换ic_name为你所适配芯片的名称。 - -```C -#include "hdf_touch.h" - -static int32_t HdfXXXXChipInit(struct HdfDeviceObject *device) -{ - ChipDevice *tpImpl = CreateXXXXTpImpl(); - if(RegisterChipDevice(tpImpl) != HDF_SUCCESS) { - ReleaseXXXXTpImpl(tpImpl); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -struct HdfDriverEntry g_touchXXXXChipEntry = { - .moduleVersion = 1, - .moduleName = "HDF_TOUCH_XXXX", - .Init = HdfXXXXChipInit, -}; - -HDF_INIT(g_touchXXXXChipEntry); -``` - -其中ChipDevice中要提供若干方法: -| 方法| 实现说明| -|------|------| -|int32_t (*Init)(ChipDevice *device)| 器件初始化| -|int32_t (*Detect)(ChipDevice *device)| 器件探测| -|int32_t (*Suspend)(ChipDevice *device)| 器件休眠| -|int32_t (*Resume)(ChipDevice *device)| 器件唤醒| -|int32_t (*DataHandle)(ChipDevice *device)| 从器件读取数据,将触摸点数据填写入device->driver->frameData中| -|int32_t (*UpdateFirmware)(ChipDevice *device)| 固件升级| - -- 配置产品,加载器件驱动 - -产品的所有设备信息被定义在文件`//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs`中。修改该文件,在名为input的host中,名为device_touch_chip的device中增加配置。 -注意:moduleName 要与触摸屏驱动中的moduleName相同。 - -```hcs - deviceN :: deviceNode { - policy = 0; - priority = 130; - preload = 0; - permission = 0660; - moduleName = "HDF_TOUCH_XXXX"; - deviceMatchAttr = "touch_XXXX_configs"; - } -``` - -更详细的驱动开发指导,请参考 [TOUCHSCREEN](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/TOUCHSCREEN.md)。 - - -### 3. WLAN - -Wi-Fi驱动分为两部分,一部分负责管理WLAN设备,另一个部分负责处理WLAN流量。`HDF WLAN`分别为这两部分做了抽象。目前支持SDIO接口的WLAN芯片。 - -Wi-Fi结构图 - -支持一款芯片的主要工作是实现一个ChipDriver驱动。实现HDF_WLAN_CORE和NetDevice提供的接口。主要需要实现的接口有: - -| 接口| 定义头文件| 说明| -|------|------|------| -| HdfChipDriverFactory| `//drivers/framework/include/wifi/hdf_wlan_chipdriver_manager.h`| ChipDriver的Factory,用于支持一个芯片多个Wi-Fi端口| -| HdfChipDriver | `//drivers/framework/include/wifi/wifi_module.h`| 每个WLAN端口对应一个HdfChipDriver,用来管理一个特定的WLAN端口| -|NetDeviceInterFace| `//drivers/framework/include/wifi/net_device.h`| 与协议栈之间的接口,如发送数据、设置网络接口状态等| - -建议适配按如下步骤操作: - -1. 创建HDF驱动 - -建议将代码放置在`//device/MySoCVendor/peripheral/wifi/chip_name/`。 -文件模板如下: - -```C -static int32_t HdfWlanHisiChipDriverInit(struct HdfDeviceObject *device) { - static struct HdfChipDriverFactory factory = CreateChipDriverFactory(); - struct HdfChipDriverManager *driverMgr = HdfWlanGetChipDriverMgr(); - if (driverMgr->RegChipDriver(&factory) != HDF_SUCCESS) { - HDF_LOGE("%s fail: driverMgr is NULL!", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -struct HdfDriverEntry g_hdfXXXChipEntry = { - .moduleVersion = 1, - .Init = HdfWlanXXXChipDriverInit, - .Release = HdfWlanXXXChipRelease, - .moduleName = "HDF_WIFI_CHIP_XXX" -}; - -HDF_INIT(g_hdfXXXChipEntry); -``` - -在CreateChipDriverFactory中需要创建一个HdfChipDriverFactory,接口如下: -| 接口| 说明| -|------|------| -|const char *driverName| 当前driverName | -|int32_t (*InitChip)(struct HdfWlanDevice *device)| 初始化芯片| -|int32_t (*DeinitChip)(struct HdfWlanDevice *device)| 去初始化芯片| -|void (*ReleaseFactory)(struct HdfChipDriverFactory *factory)| 释放HdfChipDriverFactory对象| -|struct HdfChipDriver *(*Build)(struct HdfWlanDevice *device, uint8_t ifIndex)|创建一个HdfChipDriver;输入参数中,device是设备信息,ifIndex是当前创建的接口在这个芯片中的序号| -|void (*Release)(struct HdfChipDriver *chipDriver)| 释放chipDriver -|uint8_t (*GetMaxIFCount)(struct HdfChipDriverFactory *factory)| 获取当前芯片支持的最大接口数| - -HdfChipDriver需要实现的接口有 - -|接口| 说明| -|------|------| -|int32_t (*init)(struct HdfChipDriver *chipDriver, NetDevice *netDev)| 初始化当前网络接口,这里需要向netDev提供接口NetDeviceInterFace| -|int32_t (*deinit)(struct HdfChipDriver *chipDriver, NetDevice *netDev)| 去初始化当前网络接口| -|struct HdfMac80211BaseOps *ops| WLAN基础能力接口集| -|struct HdfMac80211STAOps *staOps| 支持STA模式所需的接口集| -|struct HdfMac80211APOps *apOps| 支持AP模式所需要的接口集| - - - -2. 编写配置文件,描述驱动支持的设备 - -在产品配置目录下创建芯片的配置文件`//vendor/MyProductVendor/MyProduct/config/wifi/wlan_chip_chip_name.hcs`。 -注意: 路径中的vendor_name、product_name、chip_name请替换成实际名称。 -模板如下: -```hcs -root { - wlan_config { - chip_name :& chipList { - chip_name :: chipInst { - match_attr = "hdf_wlan_chips_chip_name"; /* 这是配置匹配属性,用于提供驱动的配置根 */ - driverName = "driverName"; /* 需要与HdfChipDriverFactory中的driverName相同*/ - sdio { - vendorId = 0x0296; - deviceId = [0x5347]; - } - } - } - } -} -``` - -3. 编写配置文件,加载驱动 - -产品的所有设备信息被定义在文件`//vendor/MyProductVendor/MyProduct/config/device_info/device_info.hcs`中。修改该文件,在名为network的host中,名为device_wlan_chips的device中增加配置。 -注意:moduleName 要与触摸屏驱动中的moduleName相同。 -模板如下: - -```hcs - deviceN :: deviceNode { - policy = 0; - preload = 2; - moduleName = "HDF_WLAN_CHIPS"; - deviceMatchAttr = "hdf_wlan_chips_chip_name"; - serviceName = "driverName"; - } -``` - -4. 构建驱动 - -- 创建内核菜单 -在 `//device/MySoCVendor/peripheral` 目录中创建Kconfig文件,内容模板如下: -``` -config DRIVERS_WLAN_XXX - bool "Enable XXX WLAN Host driver" - default n - depends on DRIVERS_HDF_WIFI - help - Answer Y to enable XXX Host driver. Support chip xxx -``` - -接着修改文件 `//drivers/adapter/khdf/linux/model/network/wifi/Kconfig`,在文件末尾加入如下代码将配置菜单加入内核中。如: -``` -source "../../../../../device/MySoCVendor/peripheral/Kconfig" -``` - -- 创建构建脚本 - -在`//drivers/adapter/khdf/linux/model/network/wifi/Makefile` 文件末尾增加配置,模板如下: - -``` -HDF_DEVICE_ROOT := $(HDF_DIR_PREFIX)/../device -obj-$(CONFIG_DRIVERS_WLAN_XXX) += $(HDF_DEVICE_ROOT)/MySoCVendor/peripheral/build/standard/ -``` - -当在内核中开启`DRIVERS_WLAN_XXX`开关时,会调用`//device/MySoCVendor/peripheral/build/standard/`中的makefile。 - - -更多详细的开发手册,请参考[WLAN开发](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/WLAN.md)。 \ No newline at end of file +# 标准系统移植指南 + +- [定义开发板](#section132mcpsimp) + - [定义SOC](#section135mcpsimp) + - [定义产品](#section145mcpsimp) + - [移植验证](#section163mcpsimp) + +- [内核移植](#section171mcpsimp) + - [1.为SOC添加内核构建的子系统](#section174mcpsimp) + - [2. 编译内核](#section182mcpsimp) + - [3. 移植验证](#section207mcpsimp) + +- [HDF驱动移植](#section210mcpsimp) + - [1. LCD](#section212mcpsimp) + - [2. 触摸屏](#section229mcpsimp) + - [3. WLAN](#section274mcpsimp) + + +## 定义开发板 + +本文以移植名为MyProduct的开发板为例讲解移植过程,假定MyProduct是MyProductVendor公司的开发板,使用MySoCVendor公司生产的MySOC芯片作为处理器。 + +### 定义SOC + +在“//productdefine/common/device”目录下创建以SOC名字命名的json文件,并指定CPU的架构。 + +如要移植一个叫MySOC的SOC,这个SOC采用32位ARM内核。配置如下: + +//productdefine/common/device/MySOC.json + +``` +{ + "target_os": "ohos", + "target_cpu": "arm" +} +``` + +根据实际情况,这里的target\_cpu也可能是arm64 、riscv、 x86等。当前仅支持arm作为target\_cpu。 + +### 定义产品 + +在“//productdefine/common/products”目录下创建以产品名命名的json文件。该文件用于描述产品所使用的SOC 以及 所需的子系统。配置如下 + +//productdefine/common/products/MyProduct.json + +``` +{ + "product_name": "MyProduct", + "product_company" : "MyProductVendor", + "product_device": "MySOC", + "version": "2.0", + "type": "standard", + "parts":{ + "ace:ace_engine_standard":{}, + "ace:napi":{}, + ... + "xts:phone_tests":{} + } +} + +``` + +主要的配置内容包括: + +1. product\_device:配置所使用的SOC +2. type:配置系统的级别, 这里直接standard即可 +3. parts:系统需要启用的子系统。子系统可以简单理解位一块独立构建的功能块。 + +已定义的子系统可以在“//build/subsystem\_config.json”中找到。当然你也可以定制子系统。 + +这里建议先拷贝Hi3516DV300 开发板的配置文件,删除掉 hisilicon\_products 这个子系统。这个子系统为Hi3516DV300 SOC编译内核,显然不适合MySOC。 + +### 移植验证 + +至此,你可以使用如下命令,启动你产品的构建了: + +``` +./build.sh --product-name MyProduct +``` + +构建完成后,可以在“//out/ohos-arm-release/packages/phone/images”目录下看到构建出来的HarmonyOSOpenHarmony镜像文件。 + +## 内核移植 + +这一步需要移植Linux内核,让Linux内核可以成功运行起来。 + +### 1.为SOC添加内核构建的子系统 + +修改文件 //build/subsystem\_config.json增加一个子系统. 配置如下: + +``` + "MySOCVendor_products": { + "project": "hmf/MySOCVendor_products", + "path": "device/MySOCVendor/MySOC/build", + "name": "MySOCVendor_products", + "dir": "device/MySOCVendor" + }, +``` + +接着需要修改定义产品的配置文件//productdefine/common/products/MyProduct.json。将刚刚定义的子系统加入到产品中 + +### 2. 编译内核 + +在上一节定义subsystem的时候,定义了构建的路径path,即//device/MySOCVendor/MySOC/build。这一节会在这个目录创建构建脚本,告诉构建系统如何构建内核。 + +目前OpenHarmony源码中提供了Linux 4.19的内核,归档在//kernel/linux-4.19。请尽可能使用这个内核。每个SOC必然需要对内核做一些修改或扩展,建议采用补丁的方式。 + +建议的目录结构 + +``` +├── build +│   ├── kernel +│   │ ├── linux +│   │ ├──standard_patch_for_4_19.patch +│   ├── BUILD.gn +│   ├── ohos.build +``` + +BUILD.gn是subsystem构建的唯一入口。 + +期望的构建结果 + + + + + + + + + + + + +

文件

+

文件说明

+

$root_build_dir/packages/phone/images/uImage

+

内核镜像

+

$root_build_dir/packages/phone/images/uboot

+

bootloader镜像

+
+ +### 3. 移植验证 + +启动编译,验证预期的kernel镜像是否成功生成。 + +## HDF驱动移植 + +### 1. LCD + +HDF为LCD设计了驱动模型。支持一块新的LCD,需要编写一个驱动,在驱动中生成模型的实例,并完成注册。 + +这些LCD的驱动被放置在//drivers/framework/model/display/driver/panel目录中。 + +- 创建Panel驱动 + +在驱动的Init方法中,需要调用RegisterPanel接口注册模型实例。如: + +``` +int32_t XXXInit(struct HdfDeviceObject *object) +{ + struct PanelData *panel = CreateYourPanel(); + + // 注册 + if (RegisterPanel(panel) != HDF_SUCCESS) { + HDF_LOGE("%s: RegisterPanel failed", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +struct HdfDriverEntry g_xxxxDevEntry = { + .moduleVersion = 1, + .moduleName = "LCD_XXXX", + .Init = XXXInit, +}; + +HDF_INIT(g_xxxxDevEntry); +``` + +- 配置加载panel驱动产品的所有设备信息被定义在文件//vendor/MyProductVendor/MyProduct/config/device\_info/device\_info.hcs中。修改该文件,在display的host中,名为device\_lcd的device中增加配置。注意:moduleName 要与panel驱动中的moduleName相同。 + +``` +root { + ... + display :: host { + device_lcd :: device { + deviceN :: deviceNode { + policy = 0; + priority = 100; + preload = 2; + moduleName = "LCD_XXXX"; + } + } + } +} +``` + +更详细的驱动开发指导,请参考 [LCD](../driver/driver-peripherals-lcd-des.md) + +### 2. 触摸屏 + +本节描述如何移植触摸屏驱动。触摸屏的驱动被放置在//drivers/framework/model/input/driver/touchscreen目录中。移植触摸屏驱动主要工作是向系统注册ChipDevice模型实例。 + +- 创建触摸屏器件驱动 + +在目录中创建名为 + +``` +touch_ic_name.c +``` + +的文件。代码模板如下:注意:请替换ic\_name为你所适配芯片的名称 + +``` +#include "hdf_touch.h" + +static int32_t HdfXXXXChipInit(struct HdfDeviceObject *device) +{ + ChipDevice *tpImpl = CreateXXXXTpImpl(); + if(RegisterChipDevice(tpImpl) != HDF_SUCCESS) { + ReleaseXXXXTpImpl(tpImpl); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +struct HdfDriverEntry g_touchXXXXChipEntry = { + .moduleVersion = 1, + .moduleName = "HDF_TOUCH_XXXX", + .Init = HdfXXXXChipInit, +}; + +HDF_INIT(g_touchXXXXChipEntry); +``` + +其中ChipDevice中要提供若干方法 + + + + + + + + + + + + + + + + + + + + + + + + +

方法

+

实现说明

+

int32_t (*Init)(ChipDevice *device)

+

器件初始化

+

int32_t (*Detect)(ChipDevice *device)

+

器件探测

+

int32_t (*Suspend)(ChipDevice *device)

+

器件休眠

+

int32_t (*Resume)(ChipDevice *device)

+

器件唤醒

+

int32_t (*DataHandle)(ChipDevice *device)

+

从器件读取数据,将触摸点数据填写入device->driver->frameData中

+

int32_t (*UpdateFirmware)(ChipDevice *device)

+

固件升级

+
+ +- 配置产品,加载器件驱动 + + 产品的所有设备信息被定义在文件//vendor/MyProductVendor/MyProduct/config/device\_info/device\_info.hcs中。修改该文件,在名为input的host中,名为device\_touch\_chip的device中增加配置。注意:moduleName 要与触摸屏驱动中的moduleName相同。 + + +``` + deviceN :: deviceNode { + policy = 0; + priority = 130; + preload = 0; + permission = 0660; + moduleName = "HDF_TOUCH_XXXX"; + deviceMatchAttr = "touch_XXXX_configs"; + } +``` + +更详细的驱动开发指导,请参考 [TOUCHSCREEN](../driver/driver-peripherals-touch-des.md) + +### 3. WLAN + +Wi-Fi驱动分为两部分,一部分负责管理WLAN设备,另一个部分负责处理WLAN流量。HDF WLAN分别为这两部分做了抽象。目前支持SDIO接口的WLAN芯片。 + +**图 1** WLAN芯片 +![](figure/WLAN芯片.png "WLAN芯片") + +支持一款芯片的主要工作是实现一个ChipDriver驱动。实现HDF\_WLAN\_CORE和NetDevice提供的接口。主要需要实现的接口有: + + + + + + + + + + + + + + + + + + + +

接口

+

定义头文件

+

说明

+

HdfChipDriverFactory

+
//drivers/framework/include/wifi/hdf_wlan_chipdriver_manager.h
+

ChipDriver的Factory,用于支持一个芯片多个Wi-Fi端口

+

HdfChipDriver

+
//drivers/framework/include/wifi/wifi_module.h
+

每个WLAN端口对应一个HdfChipDriver,用来管理一个特定的WLAN端口

+

NetDeviceInterFace

+
//drivers/framework/include/wifi/net_device.h
+

与协议栈之间的接口,如发送数据、设置网络接口状态等

+
+ +建议适配按如下步骤操作: + +1.创建HDF驱动建议将代码放置在//device/MySoCVendor/peripheral/wifi/chip\_name/ + +``` +static int32_t HdfWlanHisiChipDriverInit(struct HdfDeviceObject *device) { + static struct HdfChipDriverFactory factory = CreateChipDriverFactory(); + struct HdfChipDriverManager *driverMgr = HdfWlanGetChipDriverMgr(); + if (driverMgr->RegChipDriver(&factory) != HDF_SUCCESS) { + HDF_LOGE("%s fail: driverMgr is NULL!", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +struct HdfDriverEntry g_hdfXXXChipEntry = { + .moduleVersion = 1, + .Init = HdfWlanXXXChipDriverInit, + .Release = HdfWlanXXXChipRelease, + .moduleName = "HDF_WIFI_CHIP_XXX" +}; + +HDF_INIT(g_hdfXXXChipEntry); +``` + +在CreateChipDriverFactory中,需要创建一个HdfChipDriverFactory + + + + + + + + + + + + + + + + + + + + + + + + + + + +

接口

+

说明

+

const char *driverName

+

当前driverName

+

int32_t (*InitChip)(struct HdfWlanDevice *device)

+

初始化芯片

+

int32_t (*DeinitChip)(struct HdfWlanDevice *device)

+

去初始化芯片

+

void (_ReleaseFactory)(struct HdfChipDriverFactory _factory)

+

释放HdfChipDriverFactory对象

+

struct HdfChipDriver _(_Build)(struct HdfWlanDevice *device, uint8_t ifIndex)

+

创建一个HdfChipDriver;输入参数中,device是设备信息,ifIndex是当前创建的接口在这个芯片中的序号

+

void (_Release)(struct HdfChipDriver _chipDriver)

+

释放chipDriver

+

uint8_t (*GetMaxIFCount)(struct HdfChipDriverFactory *factory)

+

获取当前芯片支持的最大接口数

+
+ +HdfChipDriver需要实现的接口有 + + + + + + + + + + + + + + + + + + + + + +

接口

+

说明

+

int32_t (*init)(struct HdfChipDriver *chipDriver, NetDevice *netDev)

+

初始化当前网络接口,这里需要向netDev提供接口NetDeviceInterFace

+

int32_t (*deinit)(struct HdfChipDriver *chipDriver, NetDevice *netDev)

+

去初始化当前网络接口

+

struct HdfMac80211BaseOps *ops

+

WLAN基础能力接口集

+

struct HdfMac80211STAOps *staOps

+

支持STA模式所需的接口集

+

struct HdfMac80211APOps *apOps

+

支持AP模式所需要的接口集

+
+ +2.编写配置文件,描述驱动支持的设备 + +在产品配置目录下创建芯片的配置文件//vendor/MyProductVendor/MyProduct/config/wifi/wlan\_chip\_chip\_name.hcs + +注意: 路径中的vendor\_name、product\_name、chip\_name请替换成实际名称 + +``` +root { + wlan_config { + chip_name :& chipList { + chip_name :: chipInst { + match_attr = "hdf_wlan_chips_chip_name"; /* 这是配置匹配属性,用于提供驱动的配置根 */ + driverName = "driverName"; /* 需要与HdfChipDriverFactory中的driverName相同*/ + sdio { + vendorId = 0x0296; + deviceId = [0x5347]; + } + } + } + } +} +``` + +3.编写配置文件,加载驱动 + +产品的所有设备信息被定义在文件//vendor/MyProductVendor/MyProduct/config/device\_info/device\_info.hcs中。修改该文件,在名为network的host中,名为device\_wlan\_chips的device中增加配置。注意:moduleName 要与触摸屏驱动中的moduleName相同。 + +``` + deviceN :: deviceNode { + policy = 0; + preload = 2; + moduleName = "HDF_WLAN_CHIPS"; + deviceMatchAttr = "hdf_wlan_chips_chip_name"; + serviceName = "driverName"; + } +``` + +4.构建驱动 + +- 创建内核菜单在//device/MySoCVendor/peripheral目录中创建Kconfig文件,内容模板如下: + +``` +config DRIVERS_WLAN_XXX + bool "Enable XXX WLAN Host driver" + default n + depends on DRIVERS_HDF_WIFI + help + Answer Y to enable XXX Host driver. Support chip xxx +``` + +接着修改文件//drivers/adapter/khdf/linux/model/network/wifi/Kconfig,在文件末尾加入如下代码将配置菜单加入内核中。 + +``` +source "../../../../../device/MySoCVendor/peripheral/Kconfig" +``` + +- 创建构建脚本 + + 在//drivers/adapter/khdf/linux/model/network/wifi/Makefile文件末尾增加配置,模板如下 + + +``` +HDF_DEVICE_ROOT := $(HDF_DIR_PREFIX)/../device +obj-$(CONFIG_DRIVERS_WLAN_XXX) += $(HDF_DEVICE_ROOT)/MySoCVendor/peripheral/build/standard/ +``` + +当在内核中开启DRIVERS\_WLAN\_XXX开关时,会调用//device/MySoCVendor/peripheral/build/standard/中的makefile更多详细的开发手册,请参考[WLAN开发](../guide/oem_wifi_sdk_des.md)。 + diff --git a/zh-cn/device-dev/porting/transplant-chip-board.md b/zh-cn/device-dev/porting/transplant-chip-board.md deleted file mode 100644 index f5d7b754b53786192eec6ce7572833fa12329c8e..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/porting/transplant-chip-board.md +++ /dev/null @@ -1,15 +0,0 @@ -# 板级系统移植 - -- **[移植概述](transplant-chip-board-overview.md)** - -- **[板级驱动适配](transplant-chip-board-drive.md)** - -- **[HAL层实现](transplant-chip-board-hal.md)** - -- **[系统组件调用](transplant-chip-board-component.md)** - -- **[三方组件适配](transplant-chip-board-bundle.md)** - -- **[XTS认证](transplant-chip-board-xts.md)** - - diff --git a/zh-cn/device-dev/porting/transplant-chip-kernel.md b/zh-cn/device-dev/porting/transplant-chip-kernel.md deleted file mode 100644 index e27fea3d596d06af478a4b24eb46ddc8a6b81187..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/porting/transplant-chip-kernel.md +++ /dev/null @@ -1,9 +0,0 @@ -# 内核移植 - -- **[移植概述](transplant-chip-kernel-overview.md)** - -- **[内核基础适配](transplant-chip-kernel-adjustment.md)** - -- **[内核移植验证](transplant-chip-kernel-verify.md)** - - diff --git a/zh-cn/device-dev/porting/transplant-chip.md b/zh-cn/device-dev/porting/transplant-chip.md deleted file mode 100644 index d0fbee119dd00fe8fb475196714a9a253e676f2b..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/porting/transplant-chip.md +++ /dev/null @@ -1,11 +0,0 @@ -# 三方芯片移植指导 - -- **[移植准备](transplant-chip-prepare.md)** - -- **[内核移植](transplant-chip-kernel.md)** - -- **[板级系统移植](transplant-chip-board.md)** - -- **[常见问题](transplant-chip-faqs.md)** - - diff --git a/zh-cn/device-dev/porting/transplant-minichip.md b/zh-cn/device-dev/porting/transplant-minichip.md deleted file mode 100644 index 58bebe026e881c23d1d2aa1cd173cc6bc86ea777..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/porting/transplant-minichip.md +++ /dev/null @@ -1,11 +0,0 @@ -# 轻量系统芯片移植指导 - -- **[移植准备](transplant-chip-prepare.md)** - -- **[内核移植](transplant-chip-kernel.md)** - -- **[板级系统移植](transplant-chip-board.md)** - -- **[常见问题](transplant-chip-faqs.md)** - - diff --git a/zh-cn/device-dev/porting/transplant-smallchip-drive.md b/zh-cn/device-dev/porting/transplant-smallchip-drive.md deleted file mode 100644 index 8d265ae4d089593010d0ddd7ef6bcbc0ab327f99..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/porting/transplant-smallchip-drive.md +++ /dev/null @@ -1,9 +0,0 @@ -# 驱动移植 - -- **[移植概述](transplant-smallchip-drive-des.md)** - -- **[平台驱动移植](transplant-smallchip-drive-plat.md)** - -- **[器件驱动移植](transplant-smallchip-drive-oom.md)** - - diff --git a/zh-cn/device-dev/porting/transplant-smallchip.md b/zh-cn/device-dev/porting/transplant-smallchip.md deleted file mode 100644 index 4ba38ff4484d56d07681a0dce923d1839b80df87..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/porting/transplant-smallchip.md +++ /dev/null @@ -1,9 +0,0 @@ -# 小型系统芯片移植指导 - -- **[移植准备](../porting/transplant-smallchip-prepare.md)** - -- **[移植内核](../porting/transplant-smallchip-kernel.md)** - -- **[驱动移植](../porting/transplant-smallchip-drive.md)** - - diff --git a/zh-cn/device-dev/porting/transplant-thirdparty.md b/zh-cn/device-dev/porting/transplant-thirdparty.md deleted file mode 100644 index ca27b2d33989ef22f963d59881cc0d317a337b35..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/porting/transplant-thirdparty.md +++ /dev/null @@ -1,9 +0,0 @@ -# 三方库移植指导 - -- **[概述](transplant-thirdparty-overview.md)** - -- **[CMake方式组织编译的库移植](transplant-thirdparty-cmake.md)** - -- **[Makefile方式组织编译的库移植](transplant-thirdparty-makefile.md)** - - diff --git a/zh-cn/device-dev/porting/transplant.md b/zh-cn/device-dev/porting/transplant.md deleted file mode 100644 index bc8d8a3ad12bef77aaf9e3f74738efe311ecb464..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/porting/transplant.md +++ /dev/null @@ -1,9 +0,0 @@ -# 移植 - -- **[三方库移植指导](transplant-thirdparty.md)** - -- **[轻量系统芯片移植指导](transplant-minichip.md)** - -- **[小型系统芯片移植指导](transplant-smallchip.md)** - - diff --git a/zh-cn/device-dev/quick-start/Readme-CN.md b/zh-cn/device-dev/quick-start/Readme-CN.md index f85dd9b4ea17a9cb1764e9f54b7459e41c40868e..10f42afb642fecccc0cf1e4e67d175cbe14f7bf6 100644 --- a/zh-cn/device-dev/quick-start/Readme-CN.md +++ b/zh-cn/device-dev/quick-start/Readme-CN.md @@ -1,41 +1,36 @@ # 快速入门 -- [轻量和小型系统入门](quickstart-lite.md) - - [概述](quickstart-lite-overview.md) - - [了解开发板](quickstart-lite-introduction.md) - - [Hi3861开发板介绍](quickstart-lite-introduction-hi3861.md) - - [Hi3516开发板介绍](quickstart-lite-introduction-hi3516.md) - - [Hi3518开发板介绍](quickstart-lite-introduction-hi3518.md) - - - [搭建系统环境](quickstart-lite-env-setup.md) - - [概述](quickstart-lite-env-setup-des.md) - - [Windows开发环境准备](quickstart-lite-env-setup-win.md) - - [Ubuntu编译环境准备](quickstart-lite-env-setup-lin.md) - - [常见问题](quickstart-lite-env-setup-faqs.md) - - - [开发步骤](quickstart-lite-steps.md) - - [Hi3861开发板](quickstart-lite-steps-board3861.md) - - [安装开发板环境](quickstart-lite-steps-board3861-setting.md) - - [WLAN联网](quickstart-lite-steps-board3861-connection.md) - - [运行Hello World](quickstart-lite-steps-board3861-running.md) - - [常见问题](quickstart-lite-steps-board3861-faqs.md) - - - [Hi3516开发板](quickstart-lite-steps-board3516.md) - - [安装开发板环境](quickstart-lite-steps-board3516-setting.md) - - [运行Hello OHOS](quickstart-lite-steps-board3516-running.md) - - [驱动开发示例](quickstart-lite-steps-board3516-program.md) - - [常见问题](quickstart-lite-steps-board3516-faqs.md) - - - [Hi3518开发板](quickstart-lite-steps-board3518.md) - - [安装开发板环境](quickstart-lite-steps-board3518-setting.md) - - [运行Hello OHOS](quickstart-lite-steps-board3518-running.md) - - [常见问题](quickstart-lite-steps-board3518-faqs.md) - -- [标准系统入门](quickstart-standard.md) - - [入门介绍](quickstart-standard-description.md) - - [Windows开发环境准备](quickstart-standard-windows-environment.md) - - [搭建Ubuntu环境及编译(Docker方式)](quickstart-standard-docker-environment.md) - - [搭建Ubuntu环境及编译(安装包方式)](quickstart-standard-package-environment.md) - - [镜像烧录](quickstart-standard-burn.md) - - [常见问题](quickstart-standard-faq.md) +- [轻量和小型系统入门](quickstart-lite.md) + - [概述](quickstart-lite-overview.md) + - [入门介绍](quickstart-lite-introduction.md) + - [Hi3861开发板介绍](oem_minitinier_des_3861.md) + - [Hi3516开发板介绍](oem_minitinier_des_3516.md) + - [Hi3518开发板介绍](oem_minitinier_des_3518.md) + - [搭建系统环境](quickstart-lite-env-setup.md) + - [概述](quickstart-lite-env-setup-overview.md) + - [Windows开发环境准备](quickstart-lite-env-setup-windows.md) + - [获取源码及Ubuntu编译环境准备](quickstart-lite-env-setup-linux.md) + - [常见问题](quickstart-lite-env-setup-faqs.md) + - [开发步骤](quickstart-lite-steps.md) + - [Hi3861开发板](quickstart-lite-steps-hi3861.md) + - [安装开发板环境](quickstart-lite-steps-hi3861-setting.md) + - [WLAN联网(编译、烧录)](quickstart-lite-steps-hi3861-connection.md) + - [运行Hello World](quickstart-lite-steps-hi3861-running.md) + - [常见问题](quickstart-lite-steps-hi3861-faqs.md) + - [Hi3516开发板](quickstart-lite-steps-hi3516.md) + - [安装开发板环境](quickstart-lite-steps-hi3516-setting.md) + - [运行Hello OHOS(编译、烧录)](quickstart-lite-steps-hi3516-running.md) + - [驱动开发示例](quickstart-lite-steps-hi3516-program.md) + - [常见问题](quickstart-lite-steps-hi3516-faqs.md) + - [Hi3518开发板](quickstart-lite-steps-hi3518.md) + - [安装开发板环境](quickstart-lite-steps-hi3518-setting.md) + - [运行Hello OHOS(编译、烧录)](quickstart-lite-steps-hi3518-running.md) + - [常见问题](quickstart-lite-steps-hi3518-faqs.md) +- [标准系统入门](quickstart-standard.md) + - [入门介绍](quickstart-standard-overview.md) + - [搭建Windows开发环境](quickstart-standard-windows-environment.md) + - [搭建Ubuntu环境\(获取源码及编译,Docker方式\)](quickstart-standard-docker-environment.md) + - [搭建Ubuntu环境\(获取源码及编译,安装包方式\)](quickstart-standard-package-environment.md) + - [镜像烧录](quickstart-standard-burn.md) + - [常见问题](quickstart-standard-faqs.md) diff --git a/zh-cn/device-dev/quick-start/figure/2021-01-27_170334-16.png b/zh-cn/device-dev/quick-start/figure/2021-01-27_170334-17.png similarity index 100% rename from zh-cn/device-dev/quick-start/figure/2021-01-27_170334-16.png rename to zh-cn/device-dev/quick-start/figure/2021-01-27_170334-17.png diff --git "a/zh-cn/device-dev/quick-start/figure/3516\346\255\243\351\235\242-16.png" "b/zh-cn/device-dev/quick-start/figure/3516\346\255\243\351\235\242-16.png" new file mode 100644 index 0000000000000000000000000000000000000000..6975fb5fef92e35dec2de84b7e7035a39794bdf4 Binary files /dev/null and "b/zh-cn/device-dev/quick-start/figure/3516\346\255\243\351\235\242-16.png" differ diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001072468991.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001072468991.png deleted file mode 100644 index 43e43b52b677660cec4d049784b246aebe1a2434..0000000000000000000000000000000000000000 Binary files a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001072468991.png and /dev/null differ diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001130584312.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001130584312.png deleted file mode 100644 index 558d3299149a13c444966ef3e3260bf5b0956667..0000000000000000000000000000000000000000 Binary files a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001130584312.png and /dev/null differ diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270737.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001134641222.png similarity index 100% rename from zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001174270737.png rename to zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001134641222.png diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001137332702.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001137332702.png new file mode 100644 index 0000000000000000000000000000000000000000..261e75499a68f8e80a6a002dc0f57bf523c3c428 Binary files /dev/null and b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001137332702.png differ diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001176317561.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001138841358.png similarity index 85% rename from zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001176317561.png rename to zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001138841358.png index bf690379e676877036e375102155c3980f5dc29e..624db2266d404907bbf9b7038ef2a092c1837476 100644 Binary files a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001176317561.png and b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001138841358.png differ diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001138853234.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001138853234.png new file mode 100644 index 0000000000000000000000000000000000000000..56b0f47cb9948e49e4aef36c6e59bd631bee5b12 Binary files /dev/null and b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001138853234.png differ diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001141572584.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001141572584.png new file mode 100644 index 0000000000000000000000000000000000000000..114a8e1c31ab1a58ece6b0d1e00d673256b42b2b Binary files /dev/null and b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001141572584.png differ diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001142170150.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001142170150.png new file mode 100644 index 0000000000000000000000000000000000000000..43029fa093ce7cf1091da3c4a34373fc2402105d Binary files /dev/null and b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001142170150.png differ diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001142333672.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001142333672.png new file mode 100644 index 0000000000000000000000000000000000000000..40d487d33cf67ac3931474573cf6cf37357a3668 Binary files /dev/null and b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001142333672.png differ diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001184531449.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001184531449.png new file mode 100644 index 0000000000000000000000000000000000000000..dafdf66490bd36560ed6a0633ebda698b0b75dba Binary files /dev/null and b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001184531449.png differ diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001188253515.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001188253515.png new file mode 100644 index 0000000000000000000000000000000000000000..cc7a26dccc0598424c165e04ae33d9d6e774afd9 Binary files /dev/null and b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001188253515.png differ diff --git a/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001188373731.png b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001188373731.png new file mode 100644 index 0000000000000000000000000000000000000000..86e70686e85ec93b000209a21fd629a523f783f5 Binary files /dev/null and b/zh-cn/device-dev/quick-start/figure/zh-cn_image_0000001188373731.png differ diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-introduction-hi3516.md b/zh-cn/device-dev/quick-start/oem_minitinier_des_3516.md similarity index 100% rename from zh-cn/device-dev/quick-start/quickstart-lite-introduction-hi3516.md rename to zh-cn/device-dev/quick-start/oem_minitinier_des_3516.md diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-introduction-hi3518.md b/zh-cn/device-dev/quick-start/oem_minitinier_des_3518.md similarity index 100% rename from zh-cn/device-dev/quick-start/quickstart-lite-introduction-hi3518.md rename to zh-cn/device-dev/quick-start/oem_minitinier_des_3518.md diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-introduction-hi3861.md b/zh-cn/device-dev/quick-start/oem_minitinier_des_3861.md similarity index 100% rename from zh-cn/device-dev/quick-start/quickstart-lite-introduction-hi3861.md rename to zh-cn/device-dev/quick-start/oem_minitinier_des_3861.md diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-lin.md b/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-linux.md similarity index 98% rename from zh-cn/device-dev/quick-start/quickstart-lite-env-setup-lin.md rename to zh-cn/device-dev/quick-start/quickstart-lite-env-setup-linux.md index ddd8fd5f4fb8249098c4bf7d00ecb4d697e9cbaf..74c19466ff1add93dee4a3f6ab255ed454caccfb 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-lin.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-linux.md @@ -1,4 +1,4 @@ -# Ubuntu编译环境准备 +# 获取源码及Ubuntu编译环境准备 - [获取软件](#section1897711811517) - [获取源码](#section1545225464016) @@ -27,7 +27,7 @@ 6. 安装hb >![](../public_sys-resources/icon-notice.gif) **须知:** ->- 针对Ubuntu编译环境我们提供了对应的Docker,该Docker封装了相关编译工具,选择使用Docker的开发者可跳过此章节。Docker使用可参考[Docker方式获取编译环境](../get-code/gettools-acquire.md)。 +>- 针对Ubuntu编译环境我们提供了对应的Docker,该Docker封装了相关编译工具,选择使用Docker的开发者可跳过此章节。Docker使用可参考[Docker方式获取编译环境](../get-code/gettools-acquire.md#section107932281315)。 >- 通常系统默认安装samba、vim等常用软件,需要做适当适配以支持Linux服务器与Windows工作台之间的文件共享。 >- 想要详细了解OpenHarmony编译构建模块功能的开发者可参考[编译构建使用指南](../subsystems/subsys-build-mini-lite.md)。 @@ -160,7 +160,6 @@ Linux服务器通用环境配置需要的工具及其获取途径如下表所示 ``` - 3. 设置python和python3软链接为python3.8。 ``` diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-des.md b/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-overview.md similarity index 100% rename from zh-cn/device-dev/quick-start/quickstart-lite-env-setup-des.md rename to zh-cn/device-dev/quick-start/quickstart-lite-env-setup-overview.md diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-win.md b/zh-cn/device-dev/quick-start/quickstart-lite-env-setup-windows.md similarity index 100% rename from zh-cn/device-dev/quick-start/quickstart-lite-env-setup-win.md rename to zh-cn/device-dev/quick-start/quickstart-lite-env-setup-windows.md diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-env-setup.md b/zh-cn/device-dev/quick-start/quickstart-lite-env-setup.md index f5782f2a9f8bfcd10518821f6e700751928e9491..4c8c54dd2c1757e43f82a87decbf9fe9efd46e7f 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-env-setup.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-env-setup.md @@ -1,10 +1,10 @@ # 搭建系统环境 -- **[概述](quickstart-lite-env-setup-des.md)** +- **[概述](quickstart-lite-env-setup-overview.md)** -- **[Windows开发环境准备](quickstart-lite-env-setup-win.md)** +- **[Windows开发环境准备](quickstart-lite-env-setup-windows.md)** -- **[Ubuntu编译环境准备](quickstart-lite-env-setup-lin.md)** +- **[获取源码及Ubuntu编译环境准备](quickstart-lite-env-setup-linux.md)** - **[常见问题](quickstart-lite-env-setup-faqs.md)** diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-introduction.md b/zh-cn/device-dev/quick-start/quickstart-lite-introduction.md index 65e4fde55ca286b55fb1980a6cd7b67929cb9544..52c8b8e3a4644bb604175dae097fac4a3c6b23b9 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-introduction.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-introduction.md @@ -1,9 +1,9 @@ -# 了解开发板 +# 入门介绍 -- **[Hi3861开发板介绍](quickstart-lite-introduction-hi3861.md)** +- **[Hi3861开发板介绍](oem_minitinier_des_3861.md)** -- **[Hi3516开发板介绍](quickstart-lite-introduction-hi3516.md)** +- **[Hi3516开发板介绍](oem_minitinier_des_3516.md)** -- **[Hi3518开发板介绍](quickstart-lite-introduction-hi3518.md)** +- **[Hi3518开发板介绍](oem_minitinier_des_3518.md)** diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516.md deleted file mode 100644 index 397255079763931a2d53c5f10f472a2afd7a350b..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516.md +++ /dev/null @@ -1,11 +0,0 @@ -# Hi3516开发板 - -- **[安装开发板环境](quickstart-lite-steps-board3516-setting.md)** - -- **[运行Hello OHOS](quickstart-lite-steps-board3516-running.md)** - -- **[驱动开发示例](quickstart-lite-steps-board3516-program.md)** - -- **[常见问题](quickstart-lite-steps-board3516-faqs.md)** - - diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3518.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3518.md deleted file mode 100644 index d0f3f9a5873ef8da0b02460a5f6b9acdaa2247a1..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3518.md +++ /dev/null @@ -1,9 +0,0 @@ -# Hi3518开发板 - -- **[安装开发板环境](quickstart-lite-steps-board3518-setting.md)** - -- **[运行Hello OHOS](quickstart-lite-steps-board3518-running.md)** - -- **[常见问题](quickstart-lite-steps-board3518-faqs.md)** - - diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861.md deleted file mode 100644 index 8aca8589071142415783b378a6f932e3213722fa..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861.md +++ /dev/null @@ -1,11 +0,0 @@ -# Hi3861开发板 - -- **[安装开发板环境](quickstart-lite-steps-board3861-setting.md)** - -- **[WLAN联网](quickstart-lite-steps-board3861-connection.md)** - -- **[运行Hello World](quickstart-lite-steps-board3861-running.md)** - -- **[常见问题](quickstart-lite-steps-board3861-faqs.md)** - - diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516-faqs.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-faqs.md similarity index 98% rename from zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516-faqs.md rename to zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-faqs.md index ff748404f05d31f54d19fcd4744fa76fdc7febfe..fa1c0089688658c4bcb72dfe9ca736d354c9866c 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516-faqs.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-faqs.md @@ -106,7 +106,7 @@ - **解决办法** - 请按照[安装python](quickstart-lite-env-setup-lin.md)。 + 请按照[安装Python环境](quickstart-lite-env-setup-linux.md#section1238412211211)。 - **可能原因2** diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516-program.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-program.md similarity index 97% rename from zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516-program.md rename to zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-program.md index 7b43c52c82cf9e8f6c80568f1404af8521106edf..6e0a94db1c9ca4c1323d8fa3a3711ea8d59117d0 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516-program.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-program.md @@ -1,7 +1,7 @@ # 驱动开发示例 - [驱动程序介绍](#s8efc1952ebfe4d1ea717182e108c29bb) -- [编译和烧写](#section660016185110) +- [编译和烧录](#section660016185110) - [镜像运行](#section333215226219) - [下一步学习](#section9712145420182) @@ -421,16 +421,16 @@ >示例代码默认不参与编译,需要手动添加到编译脚本中。 -## 编译和烧写 +## 编译和烧录 -参考《运行Hello OHOS》进行编译和烧写:[编译](quickstart-lite-steps-board3516-running.md#section1077671315253)、[烧录](quickstart-lite-steps-board3516-running.md#section1347011412201) +参考《运行Hello OHOS》进行编译和烧录:[编译](quickstart-lite-steps-hi3516-running.md#section1077671315253)、[烧录](quickstart-lite-steps-hi3516-running.md#section1347011412201) ## 镜像运行 1. 连接串口。 >![](../public_sys-resources/icon-notice.gif) **须知:** - >若无法连接串口,请参考[常见问题](quickstart-lite-steps-board3516-faqs.md)进行排查。 + >若无法连接串口,请参考[常见问题](quickstart-lite-steps-hi3516-faqs.md#section14871149155911)进行排查。 **图 1** 连接串口图 @@ -439,7 +439,7 @@ 1. 单击**Monitor**打开串口。 2. 连续输入回车直到串口显示"hisilicon"。 - 3. 单板初次启动或修改启动参数,请进入[步骤2](quickstart-lite-steps-board3516-running.md#l5b42e79a33ea4d35982b78a22913b0b1),否则进入[步骤3](quickstart-lite-steps-board3516-running.md#ld26f18828aa44c36bfa36be150e60e49)。 + 3. 单板初次启动或修改启动参数,请进入[步骤2](quickstart-lite-steps-hi3516-running.md#l5b42e79a33ea4d35982b78a22913b0b1),否则进入[步骤3](quickstart-lite-steps-hi3516-running.md#ld26f18828aa44c36bfa36be150e60e49)。 2. (单板初次启动必选)修改U-boot的bootcmd及bootargs内容:该步骤为固化操作,若不修改参数只需执行一次。每次复位单板均会自动进入系统。 diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516-running.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-running.md similarity index 97% rename from zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516-running.md rename to zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-running.md index 336d979c20d2b4413af4c0f562bcb3621e337e6e..4e06cbfef760bd2b39b737cbf6732ed3019794cf 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516-running.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-running.md @@ -1,4 +1,4 @@ -# 运行Hello OHOS +# 运行Hello OHOS(编译、烧录) - [新建应用程序](#section204672145202) - [编译](#section1077671315253) @@ -129,7 +129,7 @@ ## 编译 -如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](../get-code/gettools-acquire.md)的编译操作。如果Linux编译环境通过软件包方式安装,请进入源码根目录,执行如下命令进行编译: +如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](../get-code/gettools-acquire.md#section107932281315)的编译操作。如果Linux编译环境通过软件包方式安装,请进入源码根目录,执行如下命令进行编译: ``` hb set(设置编译路径) @@ -150,7 +150,7 @@ hb build -f(执行编译) Hi3516开发板的代码烧录支持USB烧录、网口烧录和串口烧录三种方式。此处仅以网口烧录为例进行说明。 -1. 请连接好电脑和待烧录开发板,以Hi3516DV300为例,需要同时连接串口、网口和电源,具体可参考[Hi3516开发板介绍](quickstart-lite-introduction-hi3516.md)。 +1. 请连接好电脑和待烧录开发板,以Hi3516DV300为例,需要同时连接串口、网口和电源,具体可参考[Hi3516开发板介绍](oem_minitinier_des_3516.md)。 2. 打开电脑的设备管理器,查看并记录对应的串口号。 >![](../public_sys-resources/icon-note.gif) **说明:** @@ -200,7 +200,7 @@ Hi3516开发板的代码烧录支持USB烧录、网口烧录和串口烧录三 1. 连接串口。 >![](../public_sys-resources/icon-notice.gif) **须知:** - >若无法连接串口,请参考[常见问题](quickstart-lite-steps-board3516-faqs.md)进行排查。 + >若无法连接串口,请参考[常见问题](quickstart-lite-steps-hi3516-faqs.md)进行排查。 **图 2** 连接串口图 diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516-setting.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-setting.md similarity index 100% rename from zh-cn/device-dev/quick-start/quickstart-lite-steps-board3516-setting.md rename to zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516-setting.md diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516.md new file mode 100644 index 0000000000000000000000000000000000000000..fde5a6821164da636cb96020bd6c16a38fb347d3 --- /dev/null +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3516.md @@ -0,0 +1,11 @@ +# Hi3516开发板 + +- **[安装开发板环境](quickstart-lite-steps-hi3516-setting.md)** + +- **[运行Hello OHOS(编译、烧录)](quickstart-lite-steps-hi3516-running.md)** + +- **[驱动开发示例](quickstart-lite-steps-hi3516-program.md)** + +- **[常见问题](quickstart-lite-steps-hi3516-faqs.md)** + + diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3518-faqs.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518-faqs.md similarity index 97% rename from zh-cn/device-dev/quick-start/quickstart-lite-steps-board3518-faqs.md rename to zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518-faqs.md index dc71a35fb6a0e5fdac8d3f976d58066a474f2a97..f348a067242906036fa34659e8383eea1c4f6caa 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3518-faqs.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518-faqs.md @@ -106,7 +106,7 @@ - **解决办法** - 请按照[安装python](quickstart-lite-env-setup-lin.md)。 + 请按照[安装Python环境](quickstart-lite-env-setup-linux.md#section1238412211211)。 - **可能原因2** @@ -142,7 +142,7 @@ 修改串口号。 - 请查看设备管理器,确认连接单板的串口与终端中连接串口是否一致,若不一致,请按镜像运行内[步骤1](quickstart-lite-steps-board3518-running.md)修改串口号。 + 请查看设备管理器,确认连接单板的串口与终端中连接串口是否一致,若不一致,请按镜像运行内[步骤1](#section1498892119619)修改串口号。 - **可能原因2** diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3518-running.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518-running.md similarity index 96% rename from zh-cn/device-dev/quick-start/quickstart-lite-steps-board3518-running.md rename to zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518-running.md index 2b5a833cfc380fb2762fda0d333c8a20c8cb4239..a531fd40b4d5453d90441df5bb8c74c116fa7e2d 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3518-running.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518-running.md @@ -1,4 +1,4 @@ -# 运行Hello OHOS +# 运行Hello OHOS(编译、烧录) - [新建应用程序](#section1550972416485) - [编译](#section234175193114) @@ -128,7 +128,7 @@ ## 编译 -如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](../get-code/gettools-acquire.md)的编译操作。如果Linux编译环境通过软件包方式安装,进入源码根目录,执行如下命令进行编译: +如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](../get-code/gettools-acquire.md#section107932281315)的编译操作。如果Linux编译环境通过软件包方式安装,进入源码根目录,执行如下命令进行编译: ``` hb set(设置编译路径) @@ -149,7 +149,7 @@ hb build -f(执行编译) Hi3518开发板的代码烧录仅支持USB烧录方式。 -1. 请连接好电脑和待烧录开发板,以Hi3518EV300为例,需要同时连接串口和USB口,具体可参考[Hi3518开发板介绍](quickstart-lite-introduction-hi3518.md)。 +1. 请连接好电脑和待烧录开发板,以Hi3518EV300为例,需要同时连接串口和USB口,具体可参考[Hi3518开发板介绍](oem_minitinier_des_3518.md)。 2. 打开电脑的设备管理器,查看并记录对应的串口号。 >![](../public_sys-resources/icon-note.gif) **说明:** @@ -197,7 +197,7 @@ Hi3518开发板的代码烧录仅支持USB烧录方式。 1. 连接串口。 >![](../public_sys-resources/icon-notice.gif) **须知:** - >若无法连接串口,请参考[常见问题](quickstart-lite-steps-board3518-faqs.md)进行排查。 + >若无法连接串口,请参考[常见问题](quickstart-lite-steps-hi3518-faqs.md#zh-cn_topic_0000001053466255_section14871149155911)进行排查。 **图 2** 连接串口图 diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3518-setting.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518-setting.md similarity index 100% rename from zh-cn/device-dev/quick-start/quickstart-lite-steps-board3518-setting.md rename to zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518-setting.md diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518.md new file mode 100644 index 0000000000000000000000000000000000000000..fae0c09e037ef43de9cb99083e8ae440eef91e83 --- /dev/null +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3518.md @@ -0,0 +1,9 @@ +# Hi3518开发板 + +- **[安装开发板环境](quickstart-lite-steps-hi3518-setting.md)** + +- **[运行Hello OHOS(编译、烧录)](quickstart-lite-steps-hi3518-running.md)** + +- **[常见问题](quickstart-lite-steps-hi3518-faqs.md)** + + diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-connection.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-connection.md similarity index 92% rename from zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-connection.md rename to zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-connection.md index fe69412c06e34eae1058d50523d5dd37c2956063..f4bc8fd8a9216d0a03dd501274036b13809c5f9c 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-connection.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-connection.md @@ -1,16 +1,16 @@ -# WLAN联网 +# WLAN联网(编译、烧录) -- [源码编译](#section191121332125319) +- [编译](#section191121332125319) - [镜像烧录](#section19458165166) - [WLAN模组联网](#section194671619167) 本示例将演示如何通过AT命令完成WLAN模组与网关联网。 -## 源码编译 +## 编译 本节描述如何在Linux服务器上进行WLAN模组版本的编译。 -如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](../get-code/sourcecode-acquire.md)的编译操作。如果Linux编译环境通过软件包方式安装,请参考如下步骤。 +如果Linux编译环境通过Docker方式安装,具体编译过程请参见[Docker方式获取编译环境](../get-code/gettools-acquire.md#section107932281315)的编译操作。如果Linux编译环境通过软件包方式安装,请参考如下步骤。 1. 打开DevEco Device Tool工具,点击“View \> Terminal”,进入终端界面。 @@ -63,7 +63,7 @@ Hi3861 WLAN模组的镜像烧录可以通过OpenHarmony IDE工具DevEco完成,工具的基本使用请参考[DevEco Device Tool使用指南](https://device.harmonyos.com/cn/docs/ide/user-guides/service_introduction-0000001050166905),烧录过程包含如下步骤。 -1. 请连接好电脑和待烧录开发板,需要连接USB口,具体可参考[Hi3861开发板介绍](quickstart-lite-introduction-hi3861.md)。 +1. 请连接好电脑和待烧录开发板,需要连接USB口,具体可参考[Hi3861开发板介绍](oem_minitinier_des_3861.md)。 2. 打开电脑的设备管理器,查看并记录对应的串口号。 >![](../public_sys-resources/icon-note.gif) **说明:** diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-faqs.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-faqs.md similarity index 98% rename from zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-faqs.md rename to zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-faqs.md index b0dbbae1b366bc12e6e97c8d365476b2168a5217..6e2a41e5d904ea14a067f619875517f355a1b2e8 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-faqs.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-faqs.md @@ -249,7 +249,7 @@ - **解决办法** - 请按照 [安装Python环境](quickstart-lite-env-setup-lin.md) + 请按照[安装Python环境](quickstart-lite-env-setup-linux.md#section1238412211211) - **可能原因2** diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-running.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-running.md similarity index 94% rename from zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-running.md rename to zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-running.md index 547aa5affc7e6d2081e39bc482a1d2168043840d..afb05fbff25c8ddb49473ae447e4e99a59bfe07c 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-running.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-running.md @@ -2,8 +2,9 @@ - [修改源码](#section79601457101015) - [调测验证](#section1621064881419) -- [printf打印](#section1246911301217) -- [根据asm文件进行问题定位](#section199621957141014) + - [printf打印](#section5204547123316) + - [根据asm文件进行问题定位](#section15919111423416) + - [运行结果](#section18115713118) - [下一步学习](#section9712145420182) @@ -92,7 +93,7 @@ bugfix和新增业务两种情况,涉及源码修改。下面以新增业务 由于本示例业务简单,采用printf打印日志的调试方式即可。下面开始介绍这两种调试手段的使用方法。 -## printf打印 +### printf打印 代码中增加printf维测,信息会直接打印到串口上。开发者可在业务关键路径或业务异常位置增加日志打印,如下所示。 @@ -103,7 +104,7 @@ void HelloWorld(void) } ``` -## 根据asm文件进行问题定位 +### 根据asm文件进行问题定位 系统异常退出时,会在串口上打印异常退出原因调用栈信息,如下文所示。通过解析异常栈信息可以定位异常位置。 @@ -137,7 +138,7 @@ Call Stack 6 -- 3f5e24 addr:f78fc 3. 根据以上调用栈信息,可以定位WadRecvCB函数中出现了异常。 - ![](figure/zh-cn_image_0000001174270737.png) + ![](figure/zh-cn_image_0000001134641222.png) 4. 完成代码排查及修改。 @@ -154,5 +155,5 @@ wifi init success! ## 下一步学习 -恭喜,您已完成Hi3861 WLAN模组快速上手!建议您下一步进入[WLAN产品开发](../guide/device-wifi.md)的学习 。 +恭喜,您已完成Hi3861 WLAN模组快速上手!建议您下一步进入[WLAN产品开发](../guide/device-wlan.md)的学习 。 diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-setting.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-setting.md similarity index 99% rename from zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-setting.md rename to zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-setting.md index 90998c5acf0e5b6ee722fdcb6030a34e8a83b5fb..bb42ece33d7589af139d4aa5cd26e3fd65c8f11f 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps-board3861-setting.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861-setting.md @@ -142,13 +142,11 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev sudo pip3 install kconfiglib ``` - - **安装包方式:** 1. 下载.whl文件(例如:kconfiglib-13.2.0-py2.py3-none-any.whl)。 下载路径:“[https://pypi.org/project/kconfiglib\#files](https://pypi.org/project/kconfiglib#files)” - 1. 运行如下命令,安装.whl文件。 ``` @@ -156,7 +154,6 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev ``` - 3. 安装pycryptodome,任选如下一种方式。 安装升级文件签名依赖的Python组件包,包括:pycryptodome、six、ecdsa。安装ecdsa依赖six,请先安装six,再安装ecdsa。 @@ -172,7 +169,6 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev 下载路径:“[https://pypi.org/project/pycryptodome/\#files](https://pypi.org/project/pycryptodome/#files)”。 - 1. 运行如下命令,安装.whl文件。 ``` @@ -180,7 +176,6 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev ``` - 4. 安装six,任选如下一种方式。 - **命令行方式:** @@ -188,13 +183,11 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev sudo pip3 install six --upgrade --ignore-installed six ``` - - **安装包方式:** 1. 下载.whl文件(例如:six-1.12.0-py2.py3-none-any.whl)。 下载路径:“[https://pypi.org/project/six/\#files](https://pypi.org/project/six/#files)” - 1. 运行如下命令,安装.whl文件。 ``` @@ -202,7 +195,6 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev ``` - 5. 安装ecdsa,任选如下一种方式。 - **命令行方式:** @@ -215,7 +207,6 @@ sudo apt-get install build-essential gcc g++ make zlib* libffi-dev 下载路径:“[https://pypi.org/project/ecdsa/\#files](https://pypi.org/project/ecdsa/#files)” - 1. 运行如下命令,安装.whl文件。 ``` diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861.md new file mode 100644 index 0000000000000000000000000000000000000000..e746563d9f13f1a76050f7417a7ce308eef4ff47 --- /dev/null +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps-hi3861.md @@ -0,0 +1,11 @@ +# Hi3861开发板 + +- **[安装开发板环境](quickstart-lite-steps-hi3861-setting.md)** + +- **[WLAN联网(编译、烧录)](quickstart-lite-steps-hi3861-connection.md)** + +- **[运行Hello World](quickstart-lite-steps-hi3861-running.md)** + +- **[常见问题](quickstart-lite-steps-hi3861-faqs.md)** + + diff --git a/zh-cn/device-dev/quick-start/quickstart-lite-steps.md b/zh-cn/device-dev/quick-start/quickstart-lite-steps.md index 49545483c62cc3790af97196c58f3e29ce9c00b5..73a0910af66ad866ae70c5cc2865fc07c855c364 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite-steps.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite-steps.md @@ -1,9 +1,9 @@ # 开发步骤 -- **[Hi3861开发板](quickstart-lite-steps-board3861.md)** +- **[Hi3861开发板](quickstart-lite-steps-hi3861.md)** -- **[Hi3516开发板](quickstart-lite-steps-board3516.md)** +- **[Hi3516开发板](quickstart-lite-steps-hi3516.md)** -- **[Hi3518开发板](quickstart-lite-steps-board3518.md)** +- **[Hi3518开发板](quickstart-lite-steps-hi3518.md)** diff --git a/zh-cn/device-dev/quick-start/quickstart-lite.md b/zh-cn/device-dev/quick-start/quickstart-lite.md index 47a4ec111d5d343ef0f1abe4321730c8a201249a..97277619cee5967b91636f6db4ba6b89c0083994 100644 --- a/zh-cn/device-dev/quick-start/quickstart-lite.md +++ b/zh-cn/device-dev/quick-start/quickstart-lite.md @@ -2,7 +2,7 @@ - **[概述](quickstart-lite-overview.md)** -- **[了解开发板](quickstart-lite-introduction.md)** +- **[入门介绍](quickstart-lite-introduction.md)** - **[搭建系统环境](quickstart-lite-env-setup.md)** diff --git a/zh-cn/device-dev/quick-start/quickstart-standard-burn.md b/zh-cn/device-dev/quick-start/quickstart-standard-burn.md index be86e001d66decb04ed2382d2b8158351437b267..cc229bfea2c0dac7ea9fe138bb252d3479f55d79 100644 --- a/zh-cn/device-dev/quick-start/quickstart-standard-burn.md +++ b/zh-cn/device-dev/quick-start/quickstart-standard-burn.md @@ -1,12 +1,20 @@ # 镜像烧录 +- [标准系统镜像烧录](#section105761398576) + - [前提条件](#section1458192114718) + - [使用网口烧录](#section13755191035815) + - [下一步](#section5600113114323) +## 标准系统镜像烧录 + +注;:此版本是引用的 + 标准系统烧录,在V2.2 Beta1及以上版本支持。 Hi3516DV300支持烧录标准系统,其烧录方式包括网口烧录和串口烧录三种方式,其中: -- **Windows系统:支持网口烧录和串口烧录** +- **Windows系统:支持USB烧录、网口烧录和串口烧录** - **Linux系统:支持串口烧录和网口烧录。** 同一种烧录方式(如网口烧录),在Windows和Linux环境下的烧录操作完全一致,区别仅在于DevEco Device Tool环境搭建不同。 @@ -16,13 +24,15 @@ Hi3516DV300支持烧录标准系统,其烧录方式包括网口烧录和串口 ### 前提条件 -在DevEco Device Tool中[打开一个工程](https://device.harmonyos.com/cn/docs/ide/user-guides/open_project-0000001071680043),该工程文件夹选择待烧录文件所在文件夹即可。其中开发板类型固定选择Hi3516DV300,Framework选择“Hb”。 +在DevEco Device Tool中,选择**Import Project**打开待烧录文件所在文件夹,其中MCU选择**HiSilicon\_Arm\_Linux**下的Hi3516DV300,Framework选择“Hb”。 -### 使用网口烧录 +![](figure/zh-cn_image_0000001141572584.png) + +### 使用网口烧录 Hi3516DV300开发板使用网口录方式,支持Windows和Linux系统。 -1. 请连接好电脑和待烧录开发板,需要同时连接串口、网口和电源,具体可参考[Hi3516DV300开发板介绍](https://device.harmonyos.com/cn/docs/start/introduce/oem_minitinier_des_3516-0000001152041033)。 +1. 请连接好电脑和待烧录开发板,需要同时连接串口、网口和电源,具体可参考[Hi3516DV300开发板介绍](https://device.harmonyos.com/cn/docs/start/introduce/quickstart-lite-introduction-hi3516-0000001152041033)。 2. 打开电脑的设备管理器,查看并记录对应的串口号。 >![](../public_sys-resources/icon-note.gif) **说明:** @@ -32,151 +42,18 @@ Hi3516DV300开发板使用网口录方式,支持Windows和Linux系统。 3. 打开DevEco Device Tool,在Projects中,点击**Settings**打开工程配置界面。 - ![](figure/2021-01-27_170334-16.png) - -4. 在**Partition Configuration**页签中,按照下表内容填写烧录文件信息,包括: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Name

-

Binary

-

Memory

-

System

-

Address

-

Length

-

Board

-

Type

-

fastboot

-

选择“u-boot-hi3516dv300_emmc.bin”

-

emmc

-

none

-

0x000000

-

0x100000

-

固定选择“hi3516dv300”

-

NA

-

boot

-

选择“uImage”

-

emmc

-

none

-

0x100000

-

0xf00000

-

NA

-

updater

-

选择“updater.img”

-

emmc

-

ext3/4

-

0x1000000

-

0x1400000

-

NA

-

misc

-

空白,不用选择

-

emmc

-

none

-

0x2400000

-

0x100000

-

NA

-

system

-

选择“system.img”

-

emmc

-

ext3/4

-

0x2500000

-

0xceb00000

-

NA

-

vendor

-

选择“vendor.img”

-

emmc

-

ext3/4

-

0xd1000000

-

0x10000000

-

NA

-

userdata

-

选择“userdata.img”

-

emmc

-

ext3/4

-

0xe1000000

-

0x5b800000

-

NA

-
- - ![](figure/zh-cn_image_0000001130584312.png) - -5. 在“hi3516dv300”页签,设置烧录选项,包括upload\_port、upload\_partitions和upload\_protocol。 + ![](figure/2021-01-27_170334-17.png) + +4. 在“hi3516dv300”页签,设置烧录选项,包括upload\_port、upload\_partitions和upload\_protocol。 - upload\_port:选择步骤[2](#zh-cn_topic_0000001056443961_li1050616379507)中查询的串口号。 - upload\_protocol:选择烧录协议,固定选择“hiburn-net”。 - - upload\_partitions:选择待烧录的文件,包括fastboot、boot、updater、misc、system、vendor和userdata。 + - upload\_partitions:选择待烧录的文件,默认情况下会同时烧录fastboot、boot、updater、misc、system、vendor和userdata。 ![](figure/zh-cn_image_0000001117621400.png) -6. 检查和设置连接开发板后的网络适配器的IP地址信息,设置方法请参考[设置Hi3516DV300网口烧录的IP地址信息](https://device.harmonyos.com/cn/docs/ide/user-guides/set_ipaddress-0000001141825075)。 -7. 设置网口烧录的IP地址信息,设置如下选项: +5. 检查和设置连接开发板后的网络适配器的IP地址信息,设置方法请参考[设置Hi3516DV300网口烧录的IP地址信息](https://device.harmonyos.com/cn/docs/ide/user-guides/set_ipaddress-0000001141825075)。 +6. 设置网口烧录的IP地址信息,设置如下选项: - upload\_net\_server\_ip:选择步骤6中设置的IP地址信息。例如192.168.1.2 - upload\_net\_client\_mask:设置开发板的子网掩码,工具会自动根据选择的upload\_net\_server\_ip进行设置。例如255.255.255.0 @@ -185,12 +62,12 @@ Hi3516DV300开发板使用网口录方式,支持Windows和Linux系统。 ![](figure/zh-cn_image_0000001117463460.png) -8. 所有的配置都修改完成后,在工程配置页签的顶部,点击**Save**进行保存。 -9. 启动烧录后,显示如下提示信息时,请重启开发板(下电再上电)。 +7. 所有的配置都修改完成后,在工程配置页签的顶部,点击**Save**进行保存。 +8. 启动烧录后,显示如下提示信息时,请重启开发板(下电再上电)。 ![](figure/zh-cn_image_0000001114129432.png) -10. 重新上电后,启动烧录,界面提示如下信息时,表示烧录成功。 +9. 重新上电后,启动烧录,界面提示如下信息时,表示烧录成功。 ![](figure/zh-cn_image_0000001113969542.png) diff --git a/zh-cn/device-dev/quick-start/quickstart-standard-docker-environment.md b/zh-cn/device-dev/quick-start/quickstart-standard-docker-environment.md index 48348a5bd26aa2bbb34b45b568f03a3bceb2076c..91cdce605894bf3ab232d0b702d950af12118896 100644 --- a/zh-cn/device-dev/quick-start/quickstart-standard-docker-environment.md +++ b/zh-cn/device-dev/quick-start/quickstart-standard-docker-environment.md @@ -1,4 +1,4 @@ -# 搭建Ubuntu环境及编译(Docker方式) +# 搭建Ubuntu环境\(获取源码及编译,Docker方式\) - [获取标准系统源码](#section8761819202511) - [前提条件](#section102871547153314) diff --git a/zh-cn/device-dev/quick-start/quickstart-standard-faq.md b/zh-cn/device-dev/quick-start/quickstart-standard-faqs.md similarity index 100% rename from zh-cn/device-dev/quick-start/quickstart-standard-faq.md rename to zh-cn/device-dev/quick-start/quickstart-standard-faqs.md diff --git a/zh-cn/device-dev/quick-start/quickstart-standard-image.md b/zh-cn/device-dev/quick-start/quickstart-standard-image.md new file mode 100644 index 0000000000000000000000000000000000000000..21dd0fcd4359b441c0e732c509d882183c359529 --- /dev/null +++ b/zh-cn/device-dev/quick-start/quickstart-standard-image.md @@ -0,0 +1,25 @@ +# 镜像运行 + +烧录完成后通过以下步骤运行系统: + +1. 点击Monitor,打开串口工具 + + ![](figure/zh-cn_image_0000001142170150.png) + +2. 重启开发板,在倒数及时结束前,按任意键进入到海思系统 + + ![](figure/zh-cn_image_0000001188253515.png) + + ![](figure/zh-cn_image_0000001142333672.png) + +3. 设置启动参数,等待开发板启动 + + ![](figure/zh-cn_image_0000001188373731.png) + + ``` + setenv bootargs 'mem=640M console=ttyAMA0,115200 mmz=anonymous,0,0xA8000000,384M clk_ignore_unused androidboot.selinux=permissive skip_initramfs rootdelay=5 init=/init root=/dev/mmcblk0p5 rootfstype=ext4 rw blkdevparts=mmcblk0:1M(boot),15M(kernel),20M(updater),1M(misc),3307M(system),256M(vendor),-(userdata)' + save + reset + ``` + + diff --git a/zh-cn/device-dev/quick-start/quickstart-standard-description.md b/zh-cn/device-dev/quick-start/quickstart-standard-overview.md similarity index 99% rename from zh-cn/device-dev/quick-start/quickstart-standard-description.md rename to zh-cn/device-dev/quick-start/quickstart-standard-overview.md index 20f133bca4fc7cbace60eca8d9a6de8b79e7965a..e52757cbebaebcdceec7f56d089c0f3c4d88a65e 100644 --- a/zh-cn/device-dev/quick-start/quickstart-standard-description.md +++ b/zh-cn/device-dev/quick-start/quickstart-standard-overview.md @@ -22,7 +22,7 @@ Hi3516DV300作为新一代行业专用Smart HD IP摄像机SOC,集成新一代I **图 2** Hi3516单板正面外观图 -![](figure/3516正面.png) +![](figure/3516正面-16.png) ## 开发板规格 diff --git a/zh-cn/device-dev/quick-start/quickstart-standard-package-environment.md b/zh-cn/device-dev/quick-start/quickstart-standard-package-environment.md index 774c73693c4a9ab78f7ee7dc10cd81b535b55f14..f675c28cdb54e358d3cfbcf84c7b19ccdf766e02 100644 --- a/zh-cn/device-dev/quick-start/quickstart-standard-package-environment.md +++ b/zh-cn/device-dev/quick-start/quickstart-standard-package-environment.md @@ -1,4 +1,4 @@ -# 搭建Ubuntu环境及编译(安装包方式) +# 搭建Ubuntu环境\(获取源码及编译,安装包方式\) - [安装依赖工具](#section18431165519244) - [获取标准系统源码](#section113751052102517) diff --git a/zh-cn/device-dev/quick-start/quickstart-standard-windows-environment.md b/zh-cn/device-dev/quick-start/quickstart-standard-windows-environment.md index bf45ab1684dce5b497d0685d1cc05e3f20e43ac3..403201d52c1c575bd8702d1456b333c9a33778a9 100644 --- a/zh-cn/device-dev/quick-start/quickstart-standard-windows-environment.md +++ b/zh-cn/device-dev/quick-start/quickstart-standard-windows-environment.md @@ -1,4 +1,4 @@ -# Windows开发环境准备 +# 搭建Windows开发环境 - [获取软件](#zh-cn_topic_0000001058091994_section1483143015558) - [安装Visual Studio Code](#zh-cn_topic_0000001058091994_section71401018163318) @@ -34,7 +34,7 @@ DevEco Device Tool以插件方式提供,基于Visual Studio Code进行扩展

代码编辑工具

V1.53及以上 64位版本。

+

V1.53及以上64位版本。

https://code.visualstudio.com/Download

编译构建工具

V3.7.4~V3.8.x 64位版本

+

V3.8及以上64位版本

https://www.python.org/downloads/

提供npm环境

v12.0.0及以上 64位版本

+

v12.0.0及以上64位版本

https://nodejs.org/zh-cn/download/

OpenHarmony源码的编译、烧录、调试插件工具

v2.2 Beta1

+

v2.2 Beta2

https://device.harmonyos.com/cn/ide#download

下载前,请使用华为开发者帐号登录,如未注册,请先注册华为开发者帐号

@@ -92,12 +92,9 @@ DevEco Device Tool以插件方式提供,基于Visual Studio Code进行扩展 ## 安装Python ->![](../public_sys-resources/icon-note.gif) **说明:** ->请注意,Python版本要求为V3.7.4\~V3.8.x 64位版本。 - 1. 双击Python安装包进行安装,勾选“**Add Python 3.8 to PATH**”,然后点击**Install Now**开始安装。 - ![](figure/zh-cn_image_0000001176317561.png) + ![](figure/zh-cn_image_0000001138841358.png) 2. 等待安装完成后,点击**Close**。 @@ -164,12 +161,22 @@ DevEco Device Tool正常运行需要依赖于C/C++和CodeLLDB插件,在安装 >安装DevEco Device Tool时,请先关闭Visual Studio Code。 1. 解压DevEco Device Tool插件压缩包,双击安装包程序进行安装。 -2. 安装过程中,会自动安装DevEco Device Tool所需的依赖文件(如C/C++和CodeLLDB插件)和执行程序。 +2. DevEco Device Tool会检测安装依赖的工具包是否符合要求。如果不符合要求,请按照本章节前面的内容进行安装。 + + >![](../public_sys-resources/icon-note.gif) **说明:** + >如果已经安装Visual Studio Code,但依然检测不到,可重启电脑解决。 + + ![](figure/zh-cn_image_0000001184531449.png) + +3. 点击**Install**进行安装。 + + ![](figure/zh-cn_image_0000001137332702.png) + +4. 等待安装完成后,点击Close关闭安装界面。 - ![](figure/zh-cn_image_0000001072468991.png) + ![](figure/zh-cn_image_0000001138853234.png) -3. 安装完成后,会自动关闭命令行工具窗口。 -4. 启动Visual Studio Code,点击左侧的![](figure/zh-cn_image_0000001072757874.png)按钮,检查INSTALLED中,是否已成功安装C/C++、CodeLLDB和DevEco Device Tool。 +5. 启动Visual Studio Code,会自动安装DevEco Device Tool依赖的C/C++、CodeLLDB插件。等待安装完成后,点击Visual Studio Code左侧的![](figure/zh-cn_image_0000001072757874.png)按钮,检查INSTALLED中,是否已成功安装C/C++、CodeLLDB和DevEco Device Tool。 >![](../public_sys-resources/icon-note.gif) **说明:** >如果C/C++和CodeLLDB插件安装不成功,则DevEco Device Tool不能正常运行,解决方法,详细请参考:[离线安装C/C++和CodeLLDB插件](https://device.harmonyos.com/cn/docs/ide/user-guides/offline_plugin_install-0000001074376846)。 diff --git a/zh-cn/device-dev/quick-start/quickstart-standard.md b/zh-cn/device-dev/quick-start/quickstart-standard.md index 8d2bc8cb313e357a743b62556b44b97c927bb0f2..6f3dbe36f7eef6b2544d78c9cdefe90e9ce7991f 100644 --- a/zh-cn/device-dev/quick-start/quickstart-standard.md +++ b/zh-cn/device-dev/quick-start/quickstart-standard.md @@ -1,15 +1,17 @@ # 标准系统入门 -- **[入门介绍](quickstart-standard-description.md)** +- **[入门介绍](quickstart-standard-overview.md)** -- **[Windows开发环境准备](quickstart-standard-windows-environment.md)** +- **[搭建Windows开发环境](quickstart-standard-windows-environment.md)** -- **[搭建Ubuntu环境及编译(Docker方式)](quickstart-standard-docker-environment.md)** +- **[搭建Ubuntu环境\(获取源码及编译,Docker方式\)](quickstart-standard-docker-environment.md)** -- **[搭建Ubuntu环境及编译(安装包方式)](quickstart-standard-package-environment.md)** +- **[搭建Ubuntu环境\(获取源码及编译,安装包方式\)](quickstart-standard-package-environment.md)** - **[镜像烧录](quickstart-standard-burn.md)** -- **[常见问题](quickstart-standard-faq.md)** +- **[镜像运行](quickstart-standard-image.md)** + +- **[常见问题](quickstart-standard-faqs.md)** diff --git a/zh-cn/device-dev/security/Readme-CN.md b/zh-cn/device-dev/security/Readme-CN.md index 9a8e221f7fe6561d044900efa29dfec7d0d82af0..7551c2b1c206417d58f87cfa8cbf418d4f201b6d 100755 --- a/zh-cn/device-dev/security/Readme-CN.md +++ b/zh-cn/device-dev/security/Readme-CN.md @@ -1,5 +1,5 @@ -# 隐私与安全 +# 隐私与安全 -- [隐私保护](safety-protection-privacyguide.md) -- [安全指南](safety-safeguide-security.md) +- [隐私保护](security-privacy-protection.md) +- [安全指南](security-guidelines-overall.md) diff --git a/zh-cn/device-dev/security/safety-safeguide-security.md b/zh-cn/device-dev/security/security-guidelines-overall.md similarity index 100% rename from zh-cn/device-dev/security/safety-safeguide-security.md rename to zh-cn/device-dev/security/security-guidelines-overall.md diff --git a/zh-cn/device-dev/security/safety-protection-privacyguide.md b/zh-cn/device-dev/security/security-privacy-protection.md similarity index 98% rename from zh-cn/device-dev/security/safety-protection-privacyguide.md rename to zh-cn/device-dev/security/security-privacy-protection.md index 95e5eccca8ac113c4ac92f908bb5701109b0e842..ae8f6bcae405462488b73f4bb68a746d391dd5ad 100644 --- a/zh-cn/device-dev/security/safety-protection-privacyguide.md +++ b/zh-cn/device-dev/security/security-privacy-protection.md @@ -195,9 +195,9 @@ 从技术上保证数据处理活动的安全性,包括个人数据的加密存储、安全传输等安全机制,系统应默认开启或采取安全保护措施。 -- 对于个人数据的访问需要有保护机制,主要包括身份认证和访问控制。身份认证(如用户名、密码)限定只有经过认证的用户才能访问数据,可应用于多用户场景;访问控制(如[权限控制](safety-safeguide-security.md#li201725506375))可应用于对应用程序的限制。 +- 对于个人数据的访问需要有保护机制,主要包括身份认证和访问控制。身份认证(如用户名、密码)限定只有经过认证的用户才能访问数据,可应用于多用户场景;访问控制(如[权限控制](security-guidelines-overall.md#li201725506375))可应用于对应用程序的限制。 - 分布式设备个人数据安全存储要满足密钥管理和存储服务(HUKS:Huawei Universal Keystore)的要求,包括:密钥安全存储、数据安全存储。 -- 个人数据在分布式设备间传输要满足设备间的信任绑定关系和数据传输通道的安全性要求。详细信息可以参考[设备互联安全](safety-safeguide-security.md#section26153183616)。 +- 个人数据在分布式设备间传输要满足设备间的信任绑定关系和数据传输通道的安全性要求。详细信息可以参考[设备互联安全](security-guidelines-overall.md#section26153183616)。 - 认证凭证数据(密码、口令、指纹等)须加密存储。 **本地化处理** diff --git a/zh-cn/device-dev/security/safety.md b/zh-cn/device-dev/security/security.md similarity index 36% rename from zh-cn/device-dev/security/safety.md rename to zh-cn/device-dev/security/security.md index 72bbe83ac0cf5052a2b1b53ce27b380ef390b963..1d9db4c8610e88ab991a455bc8be6fc56db2e36c 100644 --- a/zh-cn/device-dev/security/safety.md +++ b/zh-cn/device-dev/security/security.md @@ -1,7 +1,7 @@ # 隐私与安全 -- **[隐私保护](safety-protection-privacyguide.md)** +- **[隐私保护](security-privacy-protection.md)** -- **[安全指南](safety-safeguide-security.md)** +- **[安全指南](security-guidelines-overall.md)** diff --git a/zh-cn/device-dev/subsystems/Readme-CN.md b/zh-cn/device-dev/subsystems/Readme-CN.md index 843563ec81e16ad3c87a21e020cc28bca5b3a5fb..dcbcbd6ffaed61052f9440ae472a98ce5abcbc9a 100755 --- a/zh-cn/device-dev/subsystems/Readme-CN.md +++ b/zh-cn/device-dev/subsystems/Readme-CN.md @@ -1,78 +1,75 @@ # 子系统开发指南 -- [编译构建](subsys-build.md) - - [轻量和小型系统编译构建指导](subsys-build-mini-lite.md) - - [标准系统编译构建指导](subsys-build-standard-large.md) -- [分布式远程启动](subsys-remote-start.md) -- [图形图像](subsys-graphics.md) - - [图形图像概述](subsys-graphics-overview.md) - - [容器类组件开发指导](subsys-graphics-bundle-guide1.md) - - [布局容器类组件开发指导](subsys-graphics-bundle-guide2.md) - - [普通组件开发指导](subsys-graphics-bundle-guide3.md) - - [动画开发指导](subsys-graphics-animation-guide.md) -- [媒体](subsys-multimedia.md) - - [相机](subsys-multimedia-camera.md) - - [相机开发概述](subsys-multimedia-camera-overview.md) - - [拍照开发指导](subsys-multimedia-camera-photo-guide.md) - - [录像开发指导](subsys-multimedia-camera-record-guide.md) - - [预览开发指导](subsys-multimedia-camera-preview-guide.md) - - - [音视频](subsys-multimedia-video.md) - - [音视频开发概述](subsys-multimedia-video-overview.md) - - [音视频播放开发指导](subsys-multimedia-video-play-guide.md) - - [音视频录制开发指导](subsys-multimedia-video-record-guide.md) -- [公共基础](subsys-utils.md) - - [公共基础库概述](subsys-utils-overview.md) - - [公共基础库开发指导](subsys-utils-guide.md) - - [公共基础库常见问题](subsys-utils-faqs.md) -- [AI框架](subsys-aiframework.md) - - [AI引擎框架开发指南](subsys-aiframework-guide.md) - - [搭建环境](subsys-aiframework-envbuild.md) - - [技术规范](subsys-aiframework-tech.md) - - [代码管理规范](subsys-aiframework-tech-codemanage.md) - - [命名规范](subsys-aiframework-tech-name.md) - - [接口开发规范](subsys-aiframework-tech-interface.md) - - - [开发指导](subsys-aiframework-devguide.md) - - [SDK开发过程](subsys-aiframework-devguide-sdk.md) - - [插件的开发过程](subsys-aiframework-devguide-plugin.md) - - [配置文件的开发过程](subsys-aiframework-devguide-conf.md) - - - [开发示例](subsys-aiframework-demo.md) - - [唤醒词识别SDK的开发示例](subsys-aiframework-demo-sdk.md) - - [唤醒词识别插件的开发示例](subsys-aiframework-demo-plugin.md) - - [唤醒词识别配置文件的开发示例](subsys-aiframework-demo-conf.md) -- [Sensor服务](subsys-sensor.md) - - [Sensor服务子系概述](subsys-sensor-overview.md) - - [Sensor服务子系使用指导](subsys-sensor-guide.md) - - [Sensor服务子系使用实例](subsys-sensor-demo.md) -- [用户程序框架](subsys-application-framework.md) - - [概述](subsys-application-framework-overview.md) - - [搭建环境](subsys-application-framework-builden.md) - - [开发指导](subsys-application-framework-guide.md) - - [开发实例](subsys-application-framework-demo.md) -- [OTA升级](subsys-ota-guide.md) -- [安全](subsys-security.md) - - [概述](subsys-security-overview.md) - - [应用验签开发指导](subsys-security-sigverify.md) - - [应用权限管理开发指导](subsys-security-rightmanagement.md) - - [IPC通信鉴权开发指导](subsys-security-communicationverify.md) -- [启动恢复](subsys-boot.md) - - [启动恢复子系统概述](subsys-boot-overview.md) - - [init启动引导组件](subsys-boot-init.md) - - [appspawn应用孵化组件](subsys-boot-appspawn.md) - - [bootstrap服务启动组件](subsys-boot-bootstrap.md) - - [syspara系统属性组件](subsys-boot-syspara.md) - - [常见问题](subsys-boot-faqs.md) - - [参考](subsys-boot-ref.md) -- [测试](subsys-testguide-test.md) -- [DFX](subsys-dfx.md) - - [DFX概述](subsys-dfx-overview.md) - - [HiLog开发指导](subsys-dfx-hilog-rich.md) - - [HiLog\_Lite开发指导](subsys-dfx-hilog-lite.md) - - [HiSysEvent开发指导](subsys-dfx-hisysevent.md) -- [研发工具链](subsys-toolchain.md) - - [bytrace使用指导](subsys-toolchain-bytrace-guide.md) - - [hdc\_std 使用指导](subsys-toolchain-hdc-guide.md) -- [XTS认证子系统开发指南](subsys-xts-guide.md) +- [编译构建](subsys-build.md) + - [轻量和小型系统编译构建指导](subsys-build-mini-lite.md) + - [标准系统编译构建指导](subsys-build-standard-large.md) +- [分布式远程启动](subsys-remote-start.md) +- [图形图像](subsys-graphics.md) + - [图形图像概述](subsys-graphics-overview.md) + - [容器类组件开发指导](subsys-graphics-container-guide.md) + - [布局容器类组件开发指导](subsys-graphics-layout-guide.md) + - [普通组件开发指导](subsys-graphics-common-guide.md) + - [动画开发指导](subsys-graphics-animation-guide.md) +- [媒体](subsys-multimedia.md) + - [相机](subsys-multimedia-camera.md) + - [相机开发概述](subsys-multimedia-camera-overview.md) + - [拍照开发指导](subsys-multimedia-camera-photo-guide.md) + - [录像开发指导](subsys-multimedia-camera-record-guide.md) + - [预览开发指导](subsys-multimedia-camera-preview-guide.md) + - [音视频](subsys-multimedia-video.md) + - [音视频开发概述](subsys-multimedia-video-overview.md) + - [音视频播放开发指导](subsys-multimedia-video-play-guide.md) + - [音视频录制开发指导](subsys-multimedia-video-record-guide.md) +- [公共基础](subsys-utils.md) + - [公共基础库概述](subsys-utils-overview.md) + - [公共基础库开发指导](subsys-utils-guide.md) + - [公共基础库常见问题](subsys-utils-faqs.md) +- [AI框架](subsys-aiframework.md) + - [AI引擎框架开发指南](subsys-aiframework-guide.md) + - [搭建环境](subsys-aiframework-envbuild.md) + - [技术规范](subsys-aiframework-tech.md) + - [代码管理规范](subsys-aiframework-tech-codemanage.md) + - [命名规范](subsys-aiframework-tech-name.md) + - [接口开发规范](subsys-aiframework-tech-interface.md) + - [开发指导](subsys-aiframework-devguide.md) + - [SDK开发过程](subsys-aiframework-devguide-sdk.md) + - [插件的开发过程](subsys-aiframework-devguide-plugin.md) + - [配置文件的开发过程](subsys-aiframework-devguide-conf.md) + - [开发示例](subsys-aiframework-demo.md) + - [唤醒词识别SDK的开发示例](subsys-aiframework-demo-sdk.md) + - [唤醒词识别插件的开发示例](subsys-aiframework-demo-plugin.md) + - [唤醒词识别配置文件的开发示例](subsys-aiframework-demo-conf.md) +- [Sensor服务](subsys-densor.md) + - [Sensor服务子系概述](subsys-densor-overview.md) + - [Sensor服务子系使用指导](subsys-densor-guide.md) + - [Sensor服务子系使用实例](subsys-densor-demo.md) +- [用户程序框架](subsys-application-framework.md) + - [概述](subsys-application-framework-overview.md) + - [搭建环境](subsys-application-framework-envbuild.md) + - [开发指导](subsys-application-framework-guide.md) + - [开发实例](subsys-application-framework-demo.md) +- [OTA升级](subsys-ota-guide.md) +- [安全](subsys-security.md) + - [概述](subsys-security-overview.md) + - [应用验签开发指导](subsys-security-sigverify.md) + - [应用权限管理开发指导](subsys-security-rightmanagement.md) + - [IPC通信鉴权开发指导](subsys-security-communicationverify.md) +- [启动恢复](subsys-boot.md) + - [启动恢复子系统概述](subsys-boot-overview.md) + - [init启动引导组件](subsys-boot-init.md) + - [appspawn应用孵化组件](subsys-boot-appspawn.md) + - [bootstrap服务启动组件](subsys-boot-bootstrap.md) + - [syspara系统属性组件](subsys-boot-syspara.md) + - [常见问题](subsys-boot-faqs.md) + - [参考](subsys-boot-ref.md) +- [测试用例开发指导](subsys-testguide-test.md) +- [DFX](subsys-dfx.md) + - [DFX概述](subsys-dfx-overview.md) + - [HiLog开发指导](subsys-dfx-hilog-rich.md) + - [HiLog\_Lite开发指导](subsys-dfx-hilog-lite.md) + - [HiSysEvent开发指导](subsys-dfx-hisysevent.md) +- [研发工具链](subsys-toolchain.md) + - [bytrace使用指导](subsys-toolchain-bytrace-guide.md) + - [hdc\_std 使用指导](subsys-toolchain-hdc-guide.md) +- [XTS认证用例开发指导](subsys-xts-guide.md) diff --git a/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001181934155.png b/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001181934155.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3b4daf5fdd4d78948488046bc404bc9ffedbbd Binary files /dev/null and b/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001181934155.png differ diff --git "a/zh-cn/device-dev/subsystems/figure/\345\256\211\345\205\250\345\255\220\347\263\273\347\273\237.png" "b/zh-cn/device-dev/subsystems/figure/\345\256\211\345\205\250\345\255\220\347\263\273\347\273\237.png" deleted file mode 100644 index 68b98482855637206e94bbd373623dc182a04474..0000000000000000000000000000000000000000 Binary files "a/zh-cn/device-dev/subsystems/figure/\345\256\211\345\205\250\345\255\220\347\263\273\347\273\237.png" and /dev/null differ diff --git a/zh-cn/device-dev/subsystems/subsys-application-framework-builden.md b/zh-cn/device-dev/subsystems/subsys-application-framework-envbuild.md similarity index 100% rename from zh-cn/device-dev/subsystems/subsys-application-framework-builden.md rename to zh-cn/device-dev/subsystems/subsys-application-framework-envbuild.md diff --git a/zh-cn/device-dev/subsystems/subsys-application-framework-guide.md b/zh-cn/device-dev/subsystems/subsys-application-framework-guide.md index b132c23b9381bc71ac04a83359bad84395061fc8..630bf13450e9532d0ef94901bf39539a09a983e6 100644 --- a/zh-cn/device-dev/subsystems/subsys-application-framework-guide.md +++ b/zh-cn/device-dev/subsystems/subsys-application-framework-guide.md @@ -334,7 +334,6 @@ 在Service销毁时调用。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。 - 4. 重写消息处理方法。 MsgHandle是Service用来处理客户端消息的方法。其中funcId是客户端传过来的消息类型,request是客户端传过来的序列化请求参数。如果用户在处理完成之后想要把结果传回去,需要把结果序列化后写入reply中。 @@ -392,7 +391,6 @@ Service一旦创建就会一直保持在后台运行,开发者可以通过调用StopAbility\(\)来停止Service。 - 7. 连接Service。 - 如果Service需要与Page Ability或其他应用组件中的Service进行交互,则应创建用于连接的Service。Service支持其他Ability通过ConnectAbility\(\)与其进行连接,ConnectAbility\(\)需要传入目标Service的Want,以及IAbilityConnection的实例来处理回调。IAbilityConnection提供了两个方法供用户实现,OnAbilityConnectDone\(\)用来处理连接的回调,OnAbilityDisconnectDone\(\)用来处理断开连接的回调。 diff --git a/zh-cn/device-dev/subsystems/subsys-application-framework-overview.md b/zh-cn/device-dev/subsystems/subsys-application-framework-overview.md index a0ab8c2d1bbeb2118c32fee4eda946747445c5eb..7809336cf531540a1d15a3bbccda105dfa58f2fc 100644 --- a/zh-cn/device-dev/subsystems/subsys-application-framework-overview.md +++ b/zh-cn/device-dev/subsystems/subsys-application-framework-overview.md @@ -129,7 +129,6 @@ Ability管理服务和包管理服务启动后,就可以安装OpenHarmony应 - ROM: \> 300K (包含JS应用开发框架,UIKit及引擎等强相关子系统) - - Cortex-A RAM/ROM: - RAM:建议大于2M diff --git a/zh-cn/device-dev/subsystems/subsys-application-framework.md b/zh-cn/device-dev/subsystems/subsys-application-framework.md index 99997047ffcf4648b1b4e7fe5eb8ce2db5c6d66c..178c2f17a9cae8229098822c0f98158a0dfeed9f 100644 --- a/zh-cn/device-dev/subsystems/subsys-application-framework.md +++ b/zh-cn/device-dev/subsystems/subsys-application-framework.md @@ -2,7 +2,7 @@ - **[概述](subsys-application-framework-overview.md)** -- **[搭建环境](subsys-application-framework-builden.md)** +- **[搭建环境](subsys-application-framework-envbuild.md)** - **[开发指导](subsys-application-framework-guide.md)** diff --git a/zh-cn/device-dev/subsystems/subsys-build-mini-lite.md b/zh-cn/device-dev/subsystems/subsys-build-mini-lite.md index dc07da91d5c8c7967965ba91ae1ed276279eb8f7..858b9424b862f5442361b9ef7c3dec524dccf02f 100644 --- a/zh-cn/device-dev/subsystems/subsys-build-mini-lite.md +++ b/zh-cn/device-dev/subsystems/subsys-build-mini-lite.md @@ -396,7 +396,6 @@ vendor - $\{root\_path\} - $\{fs\_dir\_name\} - >![](../public_sys-resources/icon-note.gif) **说明:** >fs.yml是可选的,对于没有文件系统的设备可不配置。 @@ -616,7 +615,7 @@ optional arguments: 1. 创建芯片解决方案目录。 - 按照[芯片解决方案配置规则](#section1625463413327)创建目录,以芯片厂商realtek的“rtl8720“开发板为例, 在代码根目录执行: + 按照[芯片解决方案配置规则](#section2345183962710)创建目录,以芯片厂商realtek的“rtl8720“开发板为例, 在代码根目录执行: ``` mkdir -p device/realtek/rtl8720 @@ -683,7 +682,7 @@ optional arguments: 1. 创建产品目录 - 按照[产品解决方案配置规则](#section1625463413327)创建产品目录,以基于“rtl8720“开发板的wifiiot模组为例,在代码根目录执行: + 按照[产品解决方案配置规则](#section2345183962710)创建产品目录,以基于“rtl8720“开发板的wifiiot模组为例,在代码根目录执行: ``` mkdir -p vendor/my_company/wifiiot diff --git a/zh-cn/device-dev/subsystems/subsys-build-mini.md b/zh-cn/device-dev/subsystems/subsys-build-mini.md deleted file mode 100644 index df6e2e0c54c21c72fbecedb3c1c6dbf7132c87ed..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/subsystems/subsys-build-mini.md +++ /dev/null @@ -1,5 +0,0 @@ -# 轻量和小型系统编译构建指导 - -- **[编译构建子系统—轻量和小型系统](subsys-build-mini-lite.md)** - - diff --git a/zh-cn/device-dev/subsystems/subsys-build-standard.md b/zh-cn/device-dev/subsystems/subsys-build-standard.md deleted file mode 100644 index d5d5ce6278bf65d44db5da6b8b7734e22463b486..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/subsystems/subsys-build-standard.md +++ /dev/null @@ -1,5 +0,0 @@ -# 标准系统编译构建指导 - -- **[编译构建子系统—标准系统](subsys-build-standard-large.md)** - - diff --git a/zh-cn/device-dev/subsystems/subsys-sensor-demo.md b/zh-cn/device-dev/subsystems/subsys-densor-demo.md similarity index 100% rename from zh-cn/device-dev/subsystems/subsys-sensor-demo.md rename to zh-cn/device-dev/subsystems/subsys-densor-demo.md diff --git a/zh-cn/device-dev/subsystems/subsys-sensor-guide.md b/zh-cn/device-dev/subsystems/subsys-densor-guide.md similarity index 100% rename from zh-cn/device-dev/subsystems/subsys-sensor-guide.md rename to zh-cn/device-dev/subsystems/subsys-densor-guide.md diff --git a/zh-cn/device-dev/subsystems/subsys-sensor-overview.md b/zh-cn/device-dev/subsystems/subsys-densor-overview.md similarity index 100% rename from zh-cn/device-dev/subsystems/subsys-sensor-overview.md rename to zh-cn/device-dev/subsystems/subsys-densor-overview.md diff --git a/zh-cn/device-dev/subsystems/subsys-densor.md b/zh-cn/device-dev/subsystems/subsys-densor.md new file mode 100644 index 0000000000000000000000000000000000000000..2c5ea0dbbeeab7689d3120089e1f91e994cac8bb --- /dev/null +++ b/zh-cn/device-dev/subsystems/subsys-densor.md @@ -0,0 +1,9 @@ +# Sensor服务 + +- **[Sensor服务子系概述](subsys-densor-overview.md)** + +- **[Sensor服务子系使用指导](subsys-densor-guide.md)** + +- **[Sensor服务子系使用实例](subsys-densor-demo.md)** + + diff --git a/zh-cn/device-dev/subsystems/subsys-dfx-hisyseventread.md b/zh-cn/device-dev/subsystems/subsys-dfx-hisyseventread.md deleted file mode 100644 index 333dd112b45fe83e91673798d6fd125db71747e3..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/subsystems/subsys-dfx-hisyseventread.md +++ /dev/null @@ -1,103 +0,0 @@ -# HiSysEvent订阅指导 - -- [概述](#section315316685112) -- [接口说明](#section0342191810519) -- [开发实例](#section123181432175110) - -## 概述 - -HiSysEvent提供了跨进程订阅机制,用户可以通过注册订阅接口。 - -## 接口说明 - -**表 1** HiSysEvent订阅接口 - - - - - - - - - - - - - -

接口名

-

描述

-

int ISysEventService::AddListener(in SysEventRule[] rules, in ISysEventCallback callback)

-

接口功能:订阅HiSysEvent事件。

-

输入参数:

-
  • rules:事件订阅规则
  • callback:订阅回调对象
-

返回值:

-
  • 0:订阅成功,重复订阅
  • 1:订阅成功,初次订阅
  • 其他返回值:订阅失败
-

void ISysEventCallback::Handle(in String domain, in String eventName, in int eventType, in String eventDetail)

-

接口功能:订阅事件的回调接口。

-

输入参数:

-
  • domain:事件所属领域
  • eventName:事件的名称
  • eventType:事件类型
  • eventDetail:包含事件相关信息的字符串,以json的形式体现
-

返回值:无。

-
- -**表 2** SysEventRule订阅规则对象 - - - - - - - - - - - - - - - - -

属性名称

-

描述

-

uint32_t ruleType

-

规则类型(匹配范围包括domain以及eventName):

-
  • 1:全字符匹配
  • 2:前缀匹配
  • 3:正则表达式匹配
  • 其他值:无效的匹配方式
-

std::string domain;

-
  • domain:事件所属领域,如果传入的是空字符串,则默认事件领域字段匹配成功
-

std::string eventName

-
  • eventName:事件的名称,如果传入的是空字符串,则默认事件名称字段匹配成功
-
- -## 开发实例 - -1. 源代码开发: - - 引入对应的aidl文件,包括:ISysEventService.aidl、SysEventRule.aidl、ISysEventCallback.aidl。 - - 在相应的业务逻辑里面调用ISysEventService::AddListener\(in SysEventRule\[\] rules, in ISysEventCallback callback\)接口。 - - 实现对应的回调对象: - - ISysEventCallback::Handle\(in String domain, in String eventName, in int eventType, in String eventDetail\) - - -1. 源代码开发: - - 引入对应的aidl文件,包括:ISysEventService.aidl、SysEventRule.aidl、ISysEventCallback.aidl。 - - 在相应的业务逻辑里面调用ISysEventService::AddListener\(in SysEventRule\[\] rules, in ISysEventCallback callback\)接口。 - - 实现对应的回调对象: - - ISysEventCallback::Handle\(in String domain, in String eventName, in int eventType, in String eventDetail\) - -2. 编译设置: - -在编译子系统里面,需要依赖libbinder模块 - -aosp\_deps = \[ "shared\_library:libbinder", \] - -- **[bytrace使用指导](subsys-toolchain-bytrace-guide.md)** - -- **[hdc\_std 使用指导](subsys-toolchain-hdc-guide.md)** - - diff --git a/zh-cn/device-dev/subsystems/subsys-graphics-bundle-guide3.md b/zh-cn/device-dev/subsystems/subsys-graphics-common-guide.md similarity index 100% rename from zh-cn/device-dev/subsystems/subsys-graphics-bundle-guide3.md rename to zh-cn/device-dev/subsystems/subsys-graphics-common-guide.md diff --git a/zh-cn/device-dev/subsystems/subsys-graphics-bundle-guide1.md b/zh-cn/device-dev/subsystems/subsys-graphics-container-guide.md similarity index 100% rename from zh-cn/device-dev/subsystems/subsys-graphics-bundle-guide1.md rename to zh-cn/device-dev/subsystems/subsys-graphics-container-guide.md diff --git a/zh-cn/device-dev/subsystems/subsys-graphics-bundle-guide2.md b/zh-cn/device-dev/subsystems/subsys-graphics-layout-guide.md similarity index 100% rename from zh-cn/device-dev/subsystems/subsys-graphics-bundle-guide2.md rename to zh-cn/device-dev/subsystems/subsys-graphics-layout-guide.md diff --git a/zh-cn/device-dev/subsystems/subsys-graphics.md b/zh-cn/device-dev/subsystems/subsys-graphics.md index bb255fa159a9823a6ddbfc724ba7b9ba4c5ac9cd..27feed54e9015bfebd8d33c9bbe1c90176937c85 100644 --- a/zh-cn/device-dev/subsystems/subsys-graphics.md +++ b/zh-cn/device-dev/subsystems/subsys-graphics.md @@ -2,11 +2,11 @@ - **[图形图像概述](subsys-graphics-overview.md)** -- **[容器类组件开发指导](subsys-graphics-bundle-guide1.md)** +- **[容器类组件开发指导](subsys-graphics-container-guide.md)** -- **[布局容器类组件开发指导](subsys-graphics-bundle-guide2.md)** +- **[布局容器类组件开发指导](subsys-graphics-layout-guide.md)** -- **[普通组件开发指导](subsys-graphics-bundle-guide3.md)** +- **[普通组件开发指导](subsys-graphics-common-guide.md)** - **[动画开发指导](subsys-graphics-animation-guide.md)** diff --git a/zh-cn/device-dev/subsystems/subsys-multimedia-camera-overview.md b/zh-cn/device-dev/subsystems/subsys-multimedia-camera-overview.md index 75b2033e9c72cb5541ed32a6d7a8e098e748a526..824d3461ea0f803b8e568fedc442c45c86592eee 100644 --- a/zh-cn/device-dev/subsystems/subsys-multimedia-camera-overview.md +++ b/zh-cn/device-dev/subsystems/subsys-multimedia-camera-overview.md @@ -102,7 +102,6 @@ ![](figure/zh-cn_image_0000001054101094.png) - 1. Camera录像/预览流程 开发者首先通过CameraKit创建Camera,然后FrameConfig类对录像或者预览帧属性进行配置。录像/预览时序如下: diff --git a/zh-cn/device-dev/subsystems/subsys-security-communicationverify.md b/zh-cn/device-dev/subsystems/subsys-security-communicationverify.md index a0c52fc9c75746a7a9da6e4d5d862354f94f30dd..7b6da780217233b210aec73f2f177e3eddf7c795 100644 --- a/zh-cn/device-dev/subsystems/subsys-security-communicationverify.md +++ b/zh-cn/device-dev/subsystems/subsys-security-communicationverify.md @@ -41,7 +41,7 @@ IPC通信鉴权提供的API,仅供Samgr调用,开发者在开发服务时需 本部分以BMS服务通过IPC通信方式对外开放接口为例,讲解如何通过IPC通信鉴权组件配置对应接口的访问策略。这里BMS在Samgr中注册的service为bundlems,为开放的接口注册的Feature为BmsFeature。 -1. 在源码路径下的头文件base/security/permission/services/permission\_lite/ipc\_auth/include/policy\_preset.h中配置相应的访问策略,访问策略主要有三种类型: +1. 鸿蒙侧在源码路径下的头文件base/security/permission/services/permission\_lite/ipc\_auth/include/policy\_preset.h中配置相应的访问策略,产品侧独有的在vendor/hisilicon/产品名称/hals/security/permission\_lite/ipc\_auth/include/policy\_preset\_product.h中配置相应的访问策略,配置策略后将头文件中的宏POLICY\_PRODUCT 配置为1;访问策略主要有三种类型: (1)type为RANGE类型:允许某个特定范围UID的进程访问,需要指定uidMin和uidMax; diff --git a/zh-cn/device-dev/subsystems/subsys-security-overview.md b/zh-cn/device-dev/subsystems/subsys-security-overview.md index 5c47b308081819cc88c581f359cca3b4dc8cdd8f..5ce4e86cbcb0fe8b2a4ffb6a0018735372eb309d 100644 --- a/zh-cn/device-dev/subsystems/subsys-security-overview.md +++ b/zh-cn/device-dev/subsystems/subsys-security-overview.md @@ -13,10 +13,6 @@ OpenHarmony安全子系统目前提供给开发者的安全能力主要包含应 应用权限是管理应用访问系统资源和使用系统能力的一种通用方式,应用在开发阶段需要在profile.json中指明此应用在运行过程中可能会调用哪些权限,其中静态权限表示只需要在安装阶段注册就可以,而动态权限一般表示涉及到敏感信息,所以需要用户进行动态授权。 -- IPC通信鉴权 - - 系统服务通过IPC暴露接口给其他进程访问,这些接口需要配置相应的访问策略,当其他进程访问这些接口时,将会触发IPC通信鉴权机制校验访问进程是否拥有权限访问该接口,若无权限,则拒绝访问该接口。 - - 可信设备群组管理 提供基于群组概念的同华为账号群组、点对点群组(如二维码、碰一碰等)的设备安全可信关系的创建和查询,分布式应用可基于该能力进行设备间的可信认证,然后向分布式软总线请求设备间安全会话。 @@ -36,41 +32,28 @@ OpenHarmony安全子系统目前提供给开发者的安全能力主要包含应 BMS\(Bundle Manager Service\)包管理管理,在OpenHarmony上主要负责应用的安装、卸载和数据管理。 -- 描述文件 - - 本文中的描述文件,指HarmonyAppProvision,简称profile。HarmonyAppProvision采用json文件格式进行描述。 - +- 授权文件 -- 叶子证书 - - 最终用于为整包或profile签名的证书称为叶子证书,位于数字证书链的最末端。 + 本文中的授权文件,指HarmonyAppProvision,简称profile。HarmonyAppProvision采用json文件格式进行描述。 - 调试应用 - 指开发者从应用市场申请调试证书与调试描述文件,并以此签名的hap包。 - - -- 待上架应用 - - 指开发者从应用市场申请发布证书与发布描述文件,以此签名,未通过应用市场正式发布的hap包。 + 指开发者从应用市场申请调试证书与调试授权文件,并以此签名的hap包。 - 发布应用 - 指开发者从应用市场申请发布证书与发布描述文件,以此签名的hap包,上传至应用市场,并由应用市场正式发布的hap包。 + 指开发者从应用市场申请发布证书与发布授权文件,以此签名的hap包,上传至应用市场,并由应用市场正式发布的hap包。 -- OpenHarmony自签名应用 +- OpenHarmony签名应用 - 当开发者自行编译OpenHarmony系统应用后,采用原应用描述文件,以及公开的OpenHarmony公私钥对和证书进行自签名产生的hap包。 + OpenHarmony开源了一个根CA的证书和密钥,以此根CA签发的签名证书和授权文件签名的应用。 ## 约束与限制 -- 仅支持以下三类应用的验签:应用市场调试应用、应用市场发布应用、OpenHarmony自签名应用的验签。 -- 若对应用市场调试应用验签,则本机UDID需要在描述文件包含的UDID列表中。 -- 待上架应用无法验签通过。 -- 验签组件提供的接口都位于security\_interfaces\_innerkits\_app\_verify仓[app\_verify\_pub.h](https://gitee.com/fork_ohos_wj/security_interfaces_innerkits_app_verify/blob/master/app_verify_pub.h)中,仅支持系统应用开发者调用。 -- 可信设备群组管理接口,目前只对系统签名权限才可以使用。 +- 仅支持以下三类应用的验签:应用市场调试应用、应用市场发布应用、OpenHarmony签名应用。 +- 若对应用市场调试应用验签,则本机UDID需要在授权文件授权调试的UDID列表中。 diff --git a/zh-cn/device-dev/subsystems/subsys-security-sigverify.md b/zh-cn/device-dev/subsystems/subsys-security-sigverify.md index a7e2f85b64ec50c09ad516a117b157d71907c11f..7c46ac23f5d5892104ed36a6b7b357fb5b3d8f8d 100644 --- a/zh-cn/device-dev/subsystems/subsys-security-sigverify.md +++ b/zh-cn/device-dev/subsystems/subsys-security-sigverify.md @@ -3,57 +3,47 @@ - [场景介绍](#section18502174174019) - [验签流程](#section554632717226) - [接口说明](#section1633115419401) -- [开发步骤(场景一)](#section4207112818418) - - [验签指导](#section11470123816297) - - [生成OpenHarmony自签名应用](#section167151429133312) - - [开发示例](#section174318361353) +- [开发步骤](#section4207112818418) + - [生成OpenHarmony签名应用](#section167151429133312) -- [开发步骤(场景二)](#section81272563427) - - [验签指导](#section07028210442) - - [开发示例](#section1930711345445) - -- [调测验证](#section427316292411) ## 场景介绍 -当需要验证调试应用、发布应用,OpenHarmony自签名应用的完整性是否被破坏时,可以调用验签组件的接口进行验证。如有需要还可通过验签接口获取部分描述文件信息,如appid。对于调试应用,还可通过验签接口验证应用和设备的UDID是否匹配,确保应用安装在了正确的设备上。 +为了确保应用的完整性和来源可靠,OpenHarmony需要对应用进行签名和验签。 + +- 应用开发阶段:开发者完成开发并生成安装包后,需要开发者对安装包进行签名,以证明安装包发布到设备的过程中没有被篡改。OpenHarmony的应用完整性校验模块提供了签名工具、签名证书生成规范,以及签名所需的公钥证书等完整的机制,支撑开发者对应用安装包签名。为了方便开源社区开发者,版本中预置了公钥证书和对应的私钥,为开源社区提供离线签名和校验能力;在OpenHarmony商用版本中应替换此公钥证书和对应的私钥。 +- 应用安装阶段:OpenHarmony用户程序框架子系统负责应用的安装。在接收到应用安装包之后,应用程序框架子系统需要解析安装包的签名数据,然后使用应用完整性校验模块的API对签名进行验证,只有校验成功之后才允许安装此应用. 应用完整性校验模块在校验安装包签名数据时,会使用系统预置的公钥证书进行验签。 ## 验签流程 未经签名的Hap包的压缩方式是ZIP格式,简单分为文件块,中心目录(Central directory)块,中心目录结尾(EOCD,End of central directory record)块。 -经过签名的Hap包,在文件块,和中心目录块之间,插入了签名块。签名块由文件签名数据块(data sign block)、描述文件签名数据块(profile sign block)和签名头(sign head)组成,如下图所示。 +经过签名的Hap包,在文件块,和中心目录块之间,插入了签名块。签名块由整包签名数据块(data sign block)、授权文件签名数据块(profile sign block)和签名头(sign head)组成,如下图所示。 **图 1** 经过签名的Hap包结构 -![](figure/安全子系统.png) +![](figure/zh-cn_image_0000001181934155.png) -整个验签流程,主要分为三部分:整包验签、描述文件签名块验签,以及描述文件内容校验。 +整个验签流程,主要分为三部分:整包验签、授权文件验签,以及授权文件内容校验。 **整包验签** -用设备的预置根证书,通过证书链来证明叶子证书本身是可信的,然后用叶子证书的公钥解密出的摘要证明整包是未篡改的。 - -具体操作步骤如下: - -1. 对文件签名数据块中的证书链进行校验,确定其叶子证书是可信的。 -2. 用叶子证书中的公钥对文件签名块进行验签,证明其未被篡改。 -3. 计算并合并文件块,中心目录块和中心目录结尾块的摘要。然后将计算结果,再与签名块中的描述文件签名块的摘要合并,将最终合并的摘要与文件签名块中包含的摘要对比,如果两者相等,则整包验签通过。 +整包签名数据块是一个PKCS7格式的签名块(signed data),验签过程包括PKSC7签名验证、哈希比较、证书链验证以及证书链与设备预置根证书的匹配校验。 -**描述文件签名块验签** +**授权文件验签** -首先判断文件签名的签发单位,如果是应用市场签发的发布应用,则无需对描述文件进行验签,直接信任,否则要对其验签。先取出整个描述文件签名块,然后验证证书链,最后用叶子证书对描述文件数据块验签,证明其未被篡改。 +授权文件数据块是一个PKCS7格式的签名块(signed data),其中PKCS7签名块的内容信息\(contentinfo\)是授权文件的内容。验签过程包括:PKCS7签名验证、哈希比较、证书链验证以及签发授权文件证书的合法性校验。 -**描述文件内容校验** +**授权文件内容校验** -取出描述文件,并对其内容进行合法性检查。其中若hap包为调试应用,则会比对本机UDID与描述文件中包含的UDID列表,如果本机UDID在描述文件的UDID列表中包含,则验证通过。比较描述文件中包含的证书(如果是应用市场发布应用或OpenHarmony自签名则无需比较),和整包校验时使用的叶子证书,如果相同,认为整个验签流程完成。 +验签模块将对授权文件内容进行合法性检查。如果授权文件是调试类型,则会比对本机UDID是否在授权文件授权调试的UDID列表中,如果本机UDID在授权文件授权调试的UDID列表中,则会进一步比较授权文件中的调试证书和整包签名使用的证书是否相同,如果相同,则验证通过。 ## 接口说明 验签组件当前提供innerkits接口,仅供系统应用调用,相关接口及功能描述如下: -**表 1** 验签组件API接口功能介绍 +**表 1** 轻量级系统验签组件API接口功能介绍

接口名

@@ -81,192 +71,26 @@
-## 开发步骤(场景一) - -### 验签指导 - -对应用市场发布应用、基于应用市场调试证书签发的调试应用、OpenHarmony自签名应用的校验。 - -1. 定义出参结构体变量VerifyResult; - - ``` - VerifyResult verifyResult = {0}; - ``` - -2. 以文件路径及VerifyResult为入参,调用APPVERI\_AppVerify进行文件校验; - - ``` - int32_t ret = APPVERI_AppVerify(hapFilepath.c_str(), &verifyResult); - ``` - -3. 判断返回结果,如果校验通过的话,获取VerifyResult中的数据,进行业务处理; - - ``` - signatureInfo.appId = verifyResult.profile.appid; - signatureInfo.provisionBundleName = verifyResult.profile.bundleInfo.bundleName; - ``` - -4. 调用APPVERI\_FreeVerifyRst,释放VerifyResult中申请的内存。 - - ``` - APPVERI_FreeVerifyRst(&verifyResult); - ``` - - -### 生成OpenHarmony自签名应用 - -如果是OpenHarmony自签名应用的校验,开发者可通过以下方式生成OpenHarmony自签名应用。 - -1. 材料备齐。 - - 生成自签名应用需要的材料有:签名工具、系统应用hap包、系统应用profile文件\(\*.p7b\)、签名证书\(\*.cer\)、签名公私钥对\(\*.jks\)。 - -2. 将所有材料放在同一个目录下,打开shell。 -3. 根据应用、描述文件的实际名称修改指令,并在shell中输入,完成签名。 - - ``` - java -jar hapsigntoolv2.jar sign -mode localjks -privatekey "OpenHarmony Software Signature" -inputFile camera.hap -outputFile signed_camera.hap -signAlg SHA256withECDSA -keystore OpenHarmony.jks -keystorepasswd 123456 -keyaliaspasswd 123456 -profile camera_release.p7b -certpath OpenHarmony.cer -profileSigned 1 - ``` - - 关键字段说明: - - -jar:签名工具,[hapsigntool](https://repo.huaweicloud.com/harmonyos/develop_tools/hapsigntoolv2.jar) - - -mode:本地签名标记位,固定为localjks - - -privatekey:密钥对别名,签名公私钥对的别名为OpenHarmony Software Signature - - -inputFile:待签名应用,通过编译产生 - - -outputFile:签名后应用,最终输出 - - -signAlg:签名算法,当前固定为SHA256withECDSA +**表 2** 标准系统验签组件API接口功能介绍 - -keystore:公私钥对,使用签名公私钥对,位于开源库security\_services\_app\_verify仓中OpenHarmonyCer目录下,[OpenHarmony.jks](https://gitee.com/openharmony/security_appverify/blob/master/interfaces/innerkits/appverify_lite/OpenHarmonyCer/OpenHarmony.jks)。默认密码为123456 ,用户可采用工具\(例如keytool\)更改默认密码 - - -keystorepasswd:公私钥对密码,默认签名公私钥对密码为123456 - - -keyaliaspasswd:公私钥对别名密码,默认签名公私钥对别名密码为123456 - - -profile:描述文件,应用的描述文件位于对应源代码目录中 - - -certpath:使用签名证书,位于开源库security\_services\_app\_verify仓中OpenHarmonyCer目录下,[OpenHarmony.cer](https://gitee.com/openharmony/security_appverify/blob/master/interfaces/innerkits/appverify_lite/OpenHarmonyCer/OpenHarmony.cer) - - -profileSigned:签名块中是否包含描述文件\(profile\)。固定为1(包含) - - -### 开发示例 - -以应用管理框架组件在应用安装时进行验签的实际调用为例: - -``` -uint8_t HapSignVerify::VerifySignature(const std::string &hapFilepath, SignatureInfo &signatureInfo) -{ - bool mode = ManagerService::GetInstance().IsDebugMode(); - HILOG_INFO(HILOG_MODULE_APP, "current mode is %d!", mode); - // 定义结果结构体 - VerifyResult verifyResult = {0}; - // 输入待验签文件路径进行验签 - int32_t ret = APPVERI_AppVerify(hapFilepath.c_str(), &verifyResult); - uint8_t errorCode = SwitchErrorCode(ret); - if (errorCode != ERR_OK) { - return errorCode; - } - // 从结果结构体中获取appid - signatureInfo.appId = verifyResult.profile.appid; - // 从结果结构体中获取描述文件中书写的应用名 - signatureInfo.provisionBundleName = verifyResult.profile.bundleInfo.bundleName; - int32_t restricNum = verifyResult.profile.permission.restricNum; - for (int32_t i = 0; i < restricNum; i++) { - signatureInfo.restrictedPermissions.emplace_back((verifyResult.profile.permission.restricPermission)[i]); - } - // 释放结果结构体中申请的内存 - APPVERI_FreeVerifyRst(&verifyResult); - return ERR_OK; -} -``` - -## 开发步骤(场景二) - -### 验签指导 - -对采用基于测试根密钥证书签名的应用的校验。 - -1. 调用APPVERI\_SetDebugMode\(true\)开启测试模式; - - ``` - ManagerService::SetDebugMode(true); - ... - uint8_t ManagerService::SetDebugMode(bool enable) - { - int32_t ret = APPVERI_SetDebugMode(enable); - if (ret < 0) { - HILOG_ERROR(HILOG_MODULE_APP, "set signature debug mode failed"); - return ERR_APPEXECFWK_SET_DEBUG_MODE_ERROR; - } - isDebugMode_ = enable; - HILOG_INFO(HILOG_MODULE_APP, "current sign debug mode is %d", isDebugMode_); - return ERR_OK; - } - ``` - -2. 同场景一中步骤一至四,定义结构体,校验、释放结构体; -3. 调用APPVERI\_SetDebugMode\(false\)关闭测试模式。 - - ``` - ManagerService::SetDebugMode(false); - ``` - - -### 开发示例 - -完整开发示例如下(在场景一代码示例的基础上进行补充): + + + + + + + + + +

接口名

+

描述

+

nt HapVerify(const std::string& filePath, HapVerifyResult& hapVerifyResult)

+

校验应用完整性,识别应用来源。

+
-``` -uint8_t ManagerService::SetDebugMode(bool enable) -{ - int32_t ret = APPVERI_SetDebugMode(enable); - if (ret < 0) { - HILOG_ERROR(HILOG_MODULE_APP, "set signature debug mode failed"); - return ERR_APPEXECFWK_SET_DEBUG_MODE_ERROR; - } - isDebugMode_ = enable; - HILOG_INFO(HILOG_MODULE_APP, "current sign debug mode is %d", isDebugMode_); - return ERR_OK; -} -uint8_t HapSignVerify::VerifySignature(const std::string &hapFilepath, SignatureInfo &signatureInfo) -{ - // 开启支持测试服务器签名应用验证 - ManagerService::SetDebugMode(true); - bool mode = ManagerService::GetInstance().IsDebugMode(); - HILOG_INFO(HILOG_MODULE_APP, "current mode is %d!", mode); - // 定义结果结构体 - VerifyResult verifyResult = {0}; - // 输入待验签文件路径进行验签 - int32_t ret = APPVERI_AppVerify(hapFilepath.c_str(), &verifyResult); - uint8_t errorCode = SwitchErrorCode(ret); - if (errorCode != ERR_OK) { - return errorCode; - } - // 从结果结构体中获取appid - signatureInfo.appId = verifyResult.profile.appid; - // 从结果结构体中获取描述文件中书写的应用名 - signatureInfo.provisionBundleName = verifyResult.profile.bundleInfo.bundleName; - int32_t restricNum = verifyResult.profile.permission.restricNum; - for (int32_t i = 0; i < restricNum; i++) { - signatureInfo.restrictedPermissions.emplace_back((verifyResult.profile.permission.restricPermission)[i]); - } - // 释放结果结构体中申请的内存 - APPVERI_FreeVerifyRst(&verifyResult); - // 关闭支持测试服务器签名应用验证 - ManagerService::SetDebugMode(false); - return ERR_OK; -} -``` +## 开发步骤 -## 调测验证 +### 生成OpenHarmony签名应用 -1. 选取一个在OpenHarmony上能够正常安装的应用A。 -2. 根据开发指导开发。 -3. 对应用A,采用自开发程序进行验签,验签通过,能获取到appid。即为开发成功。 +参考文档:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/%E9%85%8D%E7%BD%AEOpenHarmony%E5%BA%94%E7%94%A8%E7%AD%BE%E5%90%8D%E4%BF%A1%E6%81%AF.md diff --git a/zh-cn/device-dev/subsystems/subsys-sensor.md b/zh-cn/device-dev/subsystems/subsys-sensor.md deleted file mode 100644 index 415eec2bde7a96ccb8ee88e7c27d41872654b843..0000000000000000000000000000000000000000 --- a/zh-cn/device-dev/subsystems/subsys-sensor.md +++ /dev/null @@ -1,9 +0,0 @@ -# Sensor服务 - -- **[Sensor服务子系概述](subsys-sensor-overview.md)** - -- **[Sensor服务子系使用指导](subsys-sensor-guide.md)** - -- **[Sensor服务子系使用实例](subsys-sensor-demo.md)** - - diff --git a/zh-cn/device-dev/subsystems/subsys-testguide-test.md b/zh-cn/device-dev/subsystems/subsys-testguide-test.md index 2403929934b2c2860c3e2dd2200e9a9046930e64..1797e29f6a3ef77e96481d8b862f553815555593 100644 --- a/zh-cn/device-dev/subsystems/subsys-testguide-test.md +++ b/zh-cn/device-dev/subsystems/subsys-testguide-test.md @@ -1,4 +1,4 @@ -# 测试 +# 测试用例开发指导 - [概述](#section12403172115920) - [基本概念](#section53632272090) @@ -237,7 +237,7 @@ ### 场景介绍 -针对对开发的业务代码进行白盒测试验证。 +针对开发的业务代码进行白盒测试验证。 ### 接口说明 @@ -466,7 +466,6 @@ } ``` - 6. 编写测试用例资源配置,当测试用例需要使用静态测试资源文件时使用该配置。 1. 在部件或者模块的test目录下创建resource目录。 2. 在resource目录下创建形态目录,如phone。 @@ -620,7 +619,6 @@ ``` - 3. (可选)修改developertest组件配置。如果测试用例已完成编译,可以直接指定测试用例的编译输出路径,测试平台执行用例时即不会重新编译测试用例。 配置文件:config/user\_config.xml @@ -642,7 +640,6 @@ ``` - 4. (可选)测试环境准备。当被测设备仅支持串口时,需要检查。 - 系统镜像与文件系统已烧录进开发板,开发板上系统正常运行,在系统模式下,如使用shell登录时,设备提示符是“OHOS\#”。 - 开发主机和开发板串口连接正常,网口连接正常。 @@ -663,7 +660,6 @@ ./start.sh ``` - - 设备形态选择。 根据实际的开发板选择,设备形态配置:developertest/config/framework\_config.xml。 @@ -704,7 +700,6 @@ -tl TESTLEVEL, --testlevel TESTLEVEL Specify test level ``` - - 测试框架帮助。 帮助指令,用于查询测试平台支持哪些测试指令,如下: @@ -721,7 +716,6 @@ quit ``` - 6. (必选)查看测试结果与日志,通过在测试平台中执行测试指令,即可在developertest/reports目录下生成测试日志和测试报告。 - 测试用例的结果会直接显示在控制台上,执行一次的测试结果根路径如下: @@ -753,7 +747,6 @@ details_report.html ``` - - 测试平台日志目录如下: ``` diff --git a/zh-cn/device-dev/subsystems/subsys-toolchain-hdc-guide.md b/zh-cn/device-dev/subsystems/subsys-toolchain-hdc-guide.md index 93b765389398c04173ff43ab84aa32cf4eff038c..1f57ac737f3ce1e4cf6eea3f49aaf7e27147a529 100644 --- a/zh-cn/device-dev/subsystems/subsys-toolchain-hdc-guide.md +++ b/zh-cn/device-dev/subsystems/subsys-toolchain-hdc-guide.md @@ -22,7 +22,7 @@ hdc\_std(OpenHarmony Device Connector)是OpenHarmony为开发人员提供的 **hdc\_std 工具获取方式:** -从开源仓developtools\_hdc\_standard中获取,具体位置在该开源仓的prebuilt目录。 +从开源仓developtools\_hdc\_standard中获取,具体位置在该开源仓的prebuilt目录,开源仓链接如下:https://gitee.com/openharmony/developtools\_hdc\_standard **使用举例:** diff --git a/zh-cn/device-dev/subsystems/subsys-toolchain.md b/zh-cn/device-dev/subsystems/subsys-toolchain.md index fcf4e3ed14c0ce6975b04b70d0e9a0bd9c21f06e..9f71a36d323e436abf32db47ac858973a0ef3c8b 100644 --- a/zh-cn/device-dev/subsystems/subsys-toolchain.md +++ b/zh-cn/device-dev/subsystems/subsys-toolchain.md @@ -1,6 +1,7 @@ -# 研发工具链 +# 研发工具链 -- [bytrace使用指导](subsys-toolchain-bytrace-guide.md) -- [hdc\_std 使用指导](subsys-toolchain-hdc-guide.md) +- **[bytrace使用指导](subsys-toolchain-bytrace-guide.md)** + +- **[hdc\_std 使用指导](subsys-toolchain-hdc-guide.md)** diff --git a/zh-cn/device-dev/subsystems/subsys-utils-guide.md b/zh-cn/device-dev/subsystems/subsys-utils-guide.md index 1cabae57341e29c31a2ebf0b47e670e438f27444..98866eec08eed9f7693172402a20e0ae81e6e557 100644 --- a/zh-cn/device-dev/subsystems/subsys-utils-guide.md +++ b/zh-cn/device-dev/subsystems/subsys-utils-guide.md @@ -237,7 +237,6 @@ printf("UtilsDeleteValue delete ret = %d\n", ret); } ``` - - 生成hap包。 - 按照如下目录结构存放文件,res/drawable下面放置资源文件: @@ -246,7 +245,6 @@ printf("UtilsDeleteValue delete ret = %d\n", ret); - 将上述文件打包生成zip包,修改后缀为.hap,例如Launcher.hap - 2. 连接单板,通过串口向单板发送安装KV存储native应用的命令。 ``` diff --git a/zh-cn/device-dev/subsystems/subsys-xts-guide.md b/zh-cn/device-dev/subsystems/subsys-xts-guide.md index 1240c60b9d64b230d4415ddf74c37477f57b27ed..896f7db9e7df9e927330e8e7e94c2e1946c378ae 100644 --- a/zh-cn/device-dev/subsystems/subsys-xts-guide.md +++ b/zh-cn/device-dev/subsystems/subsys-xts-guide.md @@ -1,4 +1,4 @@ -# XTS认证子系统开发指南 +# XTS认证用例开发指导 - [简介](#section465982318513) - [系统类型](#section125090457443) @@ -12,7 +12,6 @@ - [C++语言用例执行指导(适用于小型系统、标准系统用例开发)](#section128222336544) - [JS语言用例开发指导(适用于标准系统)](#section159801435165220) - [JS语言用例编译打包指导(适用于标准系统)](#section445519106559) - - [\#ZH-CN\_TOPIC\_0000001126156429/section191521423950](#section191521423950) - [全量编译指导(适用于标准系统)](#section1519992743415) - [全量用例执行指导(适用于小型系统、标准系统)](#section118149111426) @@ -695,7 +694,6 @@ Windows工作台下安装python3.7及以上版本,确保工作台和测试设 ![](figure/zh-cn_image_0000001119924146.gif) - - 模块执行\(具体模块可以查看\\acts\\testcases\\\) ``` @@ -704,7 +702,6 @@ Windows工作台下安装python3.7及以上版本,确保工作台和测试设 ![](figure/zh-cn_image_0000001166643927.jpg) - 等待执行完成。 diff --git a/zh-cn/device-dev/subsystems/subsys.md b/zh-cn/device-dev/subsystems/subsys.md index b301414e122da41764db79ca418a5d7a84c838a8..b36d4325c6d4389ad8fe7e5c3168fec7f323292f 100644 --- a/zh-cn/device-dev/subsystems/subsys.md +++ b/zh-cn/device-dev/subsystems/subsys.md @@ -1,4 +1,4 @@ -# 子系统开发指南 +# 子系统 - **[编译构建](subsys-build.md)** @@ -12,7 +12,7 @@ - **[AI框架](subsys-aiframework.md)** -- **[Sensor服务](subsys-sensor.md)** +- **[Sensor服务](subsys-densor.md)** - **[用户程序框架](subsys-application-framework.md)** @@ -22,12 +22,12 @@ - **[启动恢复](subsys-boot.md)** -- **[测试](subsys-testguide-test.md)** +- **[测试用例开发指导](subsys-testguide-test.md)** - **[DFX](subsys-dfx.md)** -- **[HiSysEvent订阅指导](subsys-dfx-hisyseventread.md)** +- **[研发工具链](subsys-toolchain.md)** -- **[XTS认证子系统开发指南](subsys-xts-guide.md)** +- **[XTS认证用例开发指导](subsys-xts-guide.md)** diff --git a/zh-cn/readme.md b/zh-cn/readme.md index 2a36c625149eb2db13381b7c18672a417005eb0c..19976780436280548c7f22cae3d0f7bc513cb115 100644 --- a/zh-cn/readme.md +++ b/zh-cn/readme.md @@ -10,23 +10,24 @@ - overview:[设备开发导读](device-dev/Readme-CN.md) - quick-start:[快速入门](device-dev/quick-start/Readme-CN.md)(搭建环境、获取源码、编译、烧录等) - Basic Capability:开发基础能力 - - Kernel:[轻量和小型系统内核](device-dev/kernel/kernel.md) + - Kernel:[轻量系统内核](device-dev/kernel/kernel-mini.md) + - Kernel:[小型系统内核](device-dev/kernel/kernel-small.md) - Drivers:[驱动](device-dev/driver/Readme-CN.md) - Subsystems:[子系统](device-dev/subsystems/Readme-CN.md)(编译构建、图形图像、DFX、XTS等子系统) - Security:[隐私与安全](device-dev/security/Readme-CN.md) - guide:开发示例 - - [WLAN连接类产品](device-dev/guide/device-wifi.md)(LED外设控制、集成三方SDK) + - [WLAN连接类产品](device-dev/guide/device-wlan.md)(LED外设控制、集成三方SDK) - [无屏摄像头类产品](device-dev/guide/device-iotcamera-control.md)(摄像头控制) - [带屏摄像头类产品](device-dev/guide/device-camera.md)(屏幕和摄像头控制、视觉应用开发) - porting:移植适配 - - [三方库移植指导](device-dev/porting/transplant-thirdparty.md) - - [轻量系统芯片移植指导](device-dev/porting/transplant-minichip.md) - - [小型系统芯片移植指导](device-dev/porting/transplant-smallchip.md) + - [三方库移植指导](device-dev/porting/porting-thirdparty.md) + - [轻量系统芯片移植指导](device-dev/porting/porting-minichip.md) + - [小型系统芯片移植指导](device-dev/porting/porting-smallchip.md) - bundles:组件开发 - - [组件开发规范](device-dev/bundles/bundles-standard-rules.md) + - [组件开发规范](device-dev/bundles/oem_bundle_standard_des.md) - [组件开发指南](device-dev/bundles/bundles-guide.md) - [组件开发示例](device-dev/bundles/bundles-demo.md) @@ -44,10 +45,10 @@ - [平台驱动](device-dev/guide/device-driver-demo.md) - [外设驱动](device-dev/guide/device-outerdriver-demo.md) - porting:移植适配 - - [三方库移植指导](device-dev/porting/transplant-thirdparty.md) + - [三方库移植指导](device-dev/porting/porting-thirdparty.md) - [标准系统芯片移植指导](device-dev/porting/standard-system-porting-guide.md) - bundles:组件开发 - - [组件开发规范](device-dev/bundles/bundles-standard-rules.md) + - [组件开发规范](device-dev/bundles/oem_bundle_standard_des.md) - [组件开发指南](device-dev/bundles/bundles-guide.md) - [组件开发示例](device-dev/bundles/bundles-demo.md) diff --git "a/zh-cn/readme/\344\272\213\344\273\266\351\200\232\347\237\245\345\255\220\347\263\273\347\273\237.md" "b/zh-cn/readme/\344\272\213\344\273\266\351\200\232\347\237\245\345\255\220\347\263\273\347\273\237.md" index 1a5d7443cde7eff1fc7ed84c056fa2c37a597334..2cef7c53672423418e1beaa7b733a186410a43b2 100755 --- "a/zh-cn/readme/\344\272\213\344\273\266\351\200\232\347\237\245\345\255\220\347\263\273\347\273\237.md" +++ "b/zh-cn/readme/\344\272\213\344\273\266\351\200\232\347\237\245\345\255\220\347\263\273\347\273\237.md" @@ -20,17 +20,17 @@ OpenHarmony通过CES(Common Event Service,公共事件服务)为应用程 ``` /base/notification/ces_standard/ -│── frameworks # 组件目录 -│ |── common/log # 日志组件目录 -│ |── core # 组件native接口内部实现 -│ ├── native # 组件native接口实现 -│── interface # 对外接口目录 -| |── innerkits # 组件native接口定义 -| |── kits/napi # 组件napi实现 -├── sa_profile # 组件服务配置 -├── services # 组件服务实现 -├── tools # 组件工具实现 -│── ohos.build # 组件编译脚本 +│── cesfwk # 组件目录 +│ ├── innerkits # 对内接口目录 +│ ├── kits # 对外接口目录 +│ ├── sa_profile # 组件服务配置 +│ ├── services # 组件服务实现 +│ ├── tools # 组件工具实现 +|── common +| |──log # 日志组件目录 +|── interfaces +| |── kits # typescript描述文件 +│── ohos.build # 组件编译脚本 ``` diff --git a/zh-cn/release-notes/OpenHarmony-Release-Notes.md b/zh-cn/release-notes/OpenHarmony-Release-Notes.md index 67168274d8f0036199d0b3244c633b7a6bfab4c7..b6c4cce1eab78b7fdf4423c63649d90a510d8536 100755 --- a/zh-cn/release-notes/OpenHarmony-Release-Notes.md +++ b/zh-cn/release-notes/OpenHarmony-Release-Notes.md @@ -1,6 +1,5 @@ # OpenHarmony Release Notes ## OpenHarmony 2.x Releases -- [OpenHarmony v2.2 Beta2 (2021-08-04)](OpenHarmony-v2.2-beta2.md) - [OpenHarmony 2.0 Canary (2021-06-02)](OpenHarmony-2-0-Canary.md) ## OpenHarmony 1.x Releases - [OpenHarmony 1.1.1 LTS (2021-06-22)](OpenHarmony-1-1-1-LTS.md) diff --git a/zh-cn/release-notes/OpenHarmony-v2.2-beta2.md b/zh-cn/release-notes/OpenHarmony-v2.2-beta2.md deleted file mode 100644 index 9092c1921d5e30a2bf259f0b67fc33dff5bbbae0..0000000000000000000000000000000000000000 --- a/zh-cn/release-notes/OpenHarmony-v2.2-beta2.md +++ /dev/null @@ -1,370 +0,0 @@ -# OpenHarmony v2.2 Beta2 - -- [版本概述](#section1677664815431) -- [配套关系](#section13201781528) -- [源码获取](#section1350215462116) -- [更新说明](#section11256141314463) -- [修复缺陷列表](#section3442123281619) - -## 版本概述 - -当前版本在OpenHarmony 2.0 Canary的基础上,针对轻量系统、小型系统和标准系统都有增加新的特性: - -标准系统新增特性功能如下: - -- 新增分布式远程拉起能力端到端的构建。 -- 新增系统基础应用的拖拽能力和新增若干Sample应用。 -- 新增媒体三大服务能力,提供更好的媒体系统功能。 - -轻量和小型系统新增特性功能如下: - -- 新增轻量级linux版本构建能力。 -- 新增轻量级内核能力增强,包括文件系统增强、内核调试工具增强支持、内核模块支持可配置、三方芯片适配支持、支持ARM9架构等。 -- 轻量级图形能力增强支持,包括支持多语言字体对齐、支持显示控件轮廓、支持点阵字体、供统一多后端框架支持多芯片平台等。 -- DFX能力增强支持,包括HiLog功能增强、HiEvent功能增强,提供轻量级系统信息dump工具、提供重启维侧框架等。 -- AI能力增强支持,包括新增linux内核适配支持、AI引擎支持基于共享内存的数据传输。 - -## 配套关系 - -**表 1** 版本软件和工具配套关系 - - - - - - - - - - - - - - - - - - - - -

软件

-

版本

-

备注

-

OpenHarmony

-

2.2 Beta2

-

NA

-

HUAWEI DevEco Studio(可选)

-

DevEco Studio 2.2 Beta1

-

OpenHarmony应用开发推荐使用。

-

HUAWEI DevEco Device Tool(可选)

-

Deveco DeviceTool 2.2 Beta1

-

OpenHarmony智能设备集成开发环境推荐使用。

-
- -## 源码获取 - -**方式一(推荐)** - -通过repo + ssh 下载(需注册公钥,请参考[码云帮助中心](https://gitee.com/help/articles/4191))。 - -``` -repo init -u git@gitee.com:openharmony/manifest.git -b refs/tags/OpenHarmony-v2.2-Beta2 --no-repo-verify -repo sync -c -repo forall -c 'git lfs pull' -``` - -**方式二** - -通过repo + https 下载。 - -``` -repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v2.2-Beta2 --no-repo-verify -repo sync -c -repo forall -c 'git lfs pull' -``` - -## 更新说明 - -本版本在继承了OpenHarmony 2.0 Canary的基础上有如下变更。 - -### 特性变更 - -**表 2** 版本新增特性表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

子系统名称

-

标准系统

-

轻量、小型系统

-

分布式文件

-

提供本地system.file异步文件操作JS API,包括文件读写、目录访问、增删等接口。

-

NA

-

驱动

-

3QE85:新增Audio、Camera、USB、马达、ADC驱动模型。

-

LiteOS-M支持HDF框架。

-

电源管理服务

-

新增系统电源状态机、休眠运行锁、休眠唤醒功能。

-
  • 新增充放电状态查询接口、电量查询接口。
  • 提供低功耗模式支持,并提供低功耗模式统一API支持。
-

升级服务

-

新增恢复出厂功能。

-

NA

-

媒体

-
  • 新增音频服务,提供音频基础控制能力。
  • 新增相机服务,提供预览、拍照等基础功能力。
  • 新增媒体服务,提供音频、视频播放能力。
-

NA

-

JS UI框架

-

支持使用JS与C/C++混合开发JS API。

-

NA

-

事件通知

-

支持应用本地发送、取消多行文本通知能力。

-

NA

-

分布式软总线

-

新增软总线自组网功能,可信设备接入到局域网中(ETH\WiFi)后可自发现、无感知的接入到软总线。

-

NA

-

分布式数据管理

-
  • 新增分布式数据管理能力,支持分布式数据库在本地加密存储
  • 支持轻量级偏好数据库
-
  • 提供数据库内容的删除能力。
  • 提供统一的HAL文件系统操作函数实现。
  • 提供相关数据存储的原子操作能力。
  • 提供二进制Value的写入读取能力。
-

系统应用

-

桌面:

-
  • 桌面设置界面UX优化。
  • 新增桌面图标拖拽特性。
-

设置:

-
  • 新增Wlan设置功能。
-

SystemUI:

-
  • 新增卡信号图标显示功能。
-

图库:

-
  • 新增图片、视频资源的查看、移动、复制、删除、重命名等功能。
-

NA

-

全球化子系统

-
  • 完善时间日期格式化能力。
  • 支持时间段的格式化。
  • 新增数字格式化能力。
-
  • 新增构建自定义数据编译能力。
  • 新增构建星期、单复数、数字开关国际化能力。
  • 新增构建应用资源解析和加载机制。
  • 新增构建资源回溯机制。
-

Sample应用

-
  • 计算器中新增分布式功能,组网后支持拉起另一台组网设备上的计算器,两台设备可协同计算,计算数据实时同步。
  • 新增音频播放器应用,支持本地音频播放,组网后可将音乐播放接续至其他组网设备上。
-

NA

-

分布式设备管理

-

新增设备管理系统服务,提供分布式设备账号无关的认证组网能力。

-

NA

-

DFX

-

NA

-
  • 提供LiteOS内核系统信息dump工具。
  • 提供LiteOS内核死机重启维测框架。
  • 新增数字格式化能力。
  • HiLog功能增强。
  • HiEvent功能增强。
-

内核

-

NA

-
  • 支持轻量级Linux版本。
  • proc文件系统增强。
  • 新增mksh命令解析器。
  • 文件系统维测增强。
  • LiteOS-A內核模块支持可配置。
  • 支持LiteOS-A小系统三方芯片适配。
  • LiteOS-M支持三方组件Mbedtls编译。
  • LiteOS-M支持三方组件curl编译。
  • 支持轻量级shell框架和常用调测命令。
  • LiteOS-M支持ARM9架构。
  • 支持基于NOR Flash的littlefs文件系统。
  • LiteOS-M对外提供统一的文件系统操作接口。
  • 新增Namecache模块、Vnode管理、Lookup模块。
-

图形图像

-

NA

-
  • 支持A4\A8、LUT8、TSC图片格式作为输入。
  • 支持多语言字体对齐。
  • UIKit支持显示控件轮廓。
  • ScrollView/List支持通过弧形进度条展示滑动进度。
  • 支持开关按钮/复选框/单选按钮动效。
  • UIKit支持点阵字体产品化解耦。
  • UI框架提供统一多后端框架支持多芯片平台。
  • UIKit组件支持margin/padding。
  • 圆形/胶囊按钮支持缩放和白色蒙层动效。
-

编译构建

-

NA

-

支持开源软件的通用patch框架。

-

启动恢复

-

NA

-

支持恢复出厂设置支持多语言字体对齐。

-

分布式调度

-

NA

-

支持轻量设备启动富设备上的Ability。

-

AI

-

NA

-
  • AI子系统添加Linux内核适配,编译选项支持。
  • AI引擎支持基于共享内存的数据传输。
-
- -### API变更 - -API变更请参考: - -[JS API 差异报告](api-change/v2.2-beta2/native-apidiff-v2.2-beta2.md) - -[Native API 差异报告](api-change/v2.2-beta2/native-apidiff-v2.2-beta2.md) - -## 修复缺陷列表 - -**表 3** **解决的缺陷ISSUE列表** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ISSUE单号

-

问题描述

-

I3I31W

-

ActsNFSTest.bin会引起内核crash

-

I3D49E

-

uboot的路径不对

-

I3D71U

-

【驱动子系统】反复reset,启动到hmac_main_init SUCCESSULLY后,高概率出现系统挂死

-

I3DGZW

-

【应用程序框架子系统】HI3516开源板进入屏保后 ,点击触摸屏,出现蓝屏问题

-

I3DHIL

-

【系统问题】HI3518开源板剩余空间不足,导致ACTS用例大量失败

-

I3DU36

-

【应用程序框架子系统】ipcamera bm 查询命令失效

-

I3EALU

-

【媒体子系统】cameraActs 用例执行时,找不到相机配置文件,初始失败

-

I3EGUX

-

【可靠性问题】反复reset,出现一次KIdle进程crash,系统挂死无法启动

-

I3EH4E

-

【流水线问题】高概率出现:uname无响应,然后执行reset也无响应

-

I3EQJA

-

【文件系统】cat /proc/mounts功能不可用

-

I3EQRC

-

磁盘文件映射延迟测试:并发3个测试进程,系统crash

-

I3HVL0

-

3861编译失败,报错[OHOS ERROR] Fatal error: invalid -march= option:rv32imac

-

I3TS1Y

-

压力场景下文件相关Vnode资源耗尽

-

I3TXT8

-

孤儿进程无法回收,压力场景下TCB资源耗尽

-

I3UWXI

-

libwap.so 存在已知一般漏洞: CVE-2021-30004,CVSS:5.3;漏洞发布日期:2021-04-02,不符合产品发布要求,需要解决。

-

I3SWY2

-

高概率出现KProcess进程挂死,质量不达标

-

I3YJRO

-

liteos-a內核模块可配置编译失败

-

I3YNWM

-

文件系统维测增强功能在该版本有问题

-

I3VEOG

-

bin目录下没有mksh和toybox,导致已转测的toybox命令集无法测试

-
- diff --git a/zh-cn/release-notes/api-change/template/changelog-x-x.md b/zh-cn/release-notes/api-change/template/changelog-x-x.md deleted file mode 100644 index abf59c77cba59f171efbb6121e24f238516ad50e..0000000000000000000000000000000000000000 --- a/zh-cn/release-notes/api-change/template/changelog-x-x.md +++ /dev/null @@ -1,30 +0,0 @@ -# ChangeLog -## xxx子系统(该段落为示例,请不要修改或删除) -已经release的版本发生了影响契约兼容性(契约兼容:也称语义兼容,指版本演进后,开发者原有程序行为不发生变化)的变更(包括不限于接口名、参数、返回值、所需要的权限、调用顺序、枚举值、配置参数、路径等),则需要在ChangeLog中对变更进行阐述。 -### cl.subsystemname.x xxx功能变更, 例:DeviceType属性变更、相机权限变更(尽量概括,不要超过15个字) -每个变更标题前需要附加编号:cl.subsystemname.x。cl为ChangeLog首字母缩写,subsystemname请填写子系统英文标准名称,x表示变更序号(从低到高逐位增加)。 -以功能维度对变更点进行概括描述。例如:xxx功能的xxx、xxx等发生了xxx变化,开发者需要根据以下说明对应用进行适配。 -如果有此变更有对应的需求或设计文档,可以在描述中附上对应的设计文档编号。 - -**变更影响** - -是否影响已release的接口或者接口行为发生变更等;影响的是JS接口、Java接口还是Native接口。 - -**关键的接口/组件变更** - -列举此功能变更涉及的接口/组件变更。 - -**适配指导(可选,不涉及则可以删除)** - -(前面空一行)提供指导,帮助开发者针对相关变更进行适配,使应用可以与新版本兼容。例: -在xxx文件中将xxx参数修改为xxx。 -``` -sample code -``` -### cl.subsystemname.x xxx功能变更 -每个功能变更点在自己的子系统章节内新增一个功能变更章节。 - -## xxx子系统 -每个子系统有且只能有一个子系统章节。 - - diff --git a/zh-cn/release-notes/api-change/template/js-apidiff-x-x.md b/zh-cn/release-notes/api-change/template/js-apidiff-x-x.md deleted file mode 100644 index f512798ef3264f737fb86afb9fd5bc0b629ccc54..0000000000000000000000000000000000000000 --- a/zh-cn/release-notes/api-change/template/js-apidiff-x-x.md +++ /dev/null @@ -1,13 +0,0 @@ -# JS API Diff -## 组件 - -| 组件类型 | 组件名称 | 变更类型 | 变更类型 | -| -------- | -------- | -------- | -------- | -| 描述组件的类型,例如:容器组件、基础组件、媒体组件等 | 描述组件名称,例如:div、button等 | 描述变更的类型,包含新增、删除、废弃、修改 | 如果为废弃,则需要描述替换的组件;如果为修改,则需要描述变化点,例如:新增xxx参数、xxx参数的默认值由xxx变更为xxx;其他情况可以使用 - 符号 | - -## 接口变更 - -| 模块名称 | 接口名称 | 变更类型 | 变更说明 | -| -------- | -------- | -------- | -------- | -| 描述接口所属的模块,例如:数据存储、文件存储等 | 描述接口名称,例如:storage.get(OBJECT)。如果整个模块新增,则可以使用 - 符号 | 描述变更的类型,包含新增、删除、废弃、修改 | 如果为废弃,则需要描述替换的接口;如果为修改,则需要描述变化点,例如:新增xxx参数、xxx参数的默认值由xxx变更为xxx;其他情况可以使用 - 符号 | - diff --git a/zh-cn/release-notes/api-change/template/native-apidiff-x-x.md b/zh-cn/release-notes/api-change/template/native-apidiff-x-x.md deleted file mode 100644 index 3aa44ad73f8083916414526022c22f16abf7214b..0000000000000000000000000000000000000000 --- a/zh-cn/release-notes/api-change/template/native-apidiff-x-x.md +++ /dev/null @@ -1,5 +0,0 @@ -# Native API Diff - -| 模块名称 | 接口名称 | 变更类型 | 变更类型 | -| -------- | -------- | -------- | -------- | -| 描述模块的名称,例如:Native_layer、Image、Media等 | 描述变更元素的名称,包含结构体、类型定义、枚举、函数等,例如:结构体NativeLayerBuffer、类型定义NativeLayer、函数GetNativeLayer (JNIEnv *env, jobject surface)等。如果整个模块新增,则可以使用 - 符号 | 描述变更的类型,包含新增、删除、废弃、修改 | 如果为废弃,则需要描述替换的组件;如果为修改,则需要描述变化点,例如:新增xxx参数、xxx参数的默认值由xxx变更为xxx;其他情况可以使用 - 符号 | \ No newline at end of file diff --git a/zh-cn/release-notes/api-change/v2.2-beta2/js-apidiff-v2.2-beta2.md b/zh-cn/release-notes/api-change/v2.2-beta2/js-apidiff-v2.2-beta2.md deleted file mode 100644 index a5b51592d530ff1552e6dc4d926825340ade4ba2..0000000000000000000000000000000000000000 --- a/zh-cn/release-notes/api-change/v2.2-beta2/js-apidiff-v2.2-beta2.md +++ /dev/null @@ -1,234 +0,0 @@ -# JS API 差异报告 -OpenHarmony 2.2 Beta2相较于OpenHarmony 2.0 Canary版本的API变更如下: -## 标准系统接口变更 - -| 模块名称 | 接口名称 | 变更类型 | 变更说明 | -| -------- | -------- | -------- | -------- | - | 时间日期数字模块-Locale | constructor(locale: string, options?:options) | 新增 | - | - | 时间日期数字模块-Locale | toString(): string | 新增 | - | - | 时间日期数字模块-Locale | maximize(): Locale | 新增 | - | - | 时间日期数字模块-Locale | minimize(): Locale | 新增 | - | - | 时间日期数字模块-Locale | calendar | 新增 | - | - | 时间日期数字模块-Locale | caseFirst | 新增 | - | - | 时间日期数字模块-Locale | collation | 新增 | - | - | 时间日期数字模块-Locale | hourCycle | 新增 | - | - | 时间日期数字模块-Locale | numberingSystem | 新增 | - | - | 时间日期数字模块-Locale | numeric | 新增 | - | - | 时间日期数字模块-Locale | language | 新增 | - | - | 时间日期数字模块-Locale | script | 新增 | - | - | 时间日期数字模块-Locale | region | 新增 | - | - | 时间日期数字模块-Locale | baseName | 新增 | - | - | 时间日期数字模块-DateTimeFormat | constructor(locale: string, options?:options) | 新增 | - | - | 时间日期数字模块-DateTimeFormat | constructor(locale: string[], options?:options) | 新增 | - | - | 时间日期数字模块-DateTimeFormat | resolvedOptions(): DateTimeOptions | 新增 | - | - | 时间日期数字模块-DateTimeFormat | format(date: Date): string; | 新增 | - | - | 时间日期数字模块-DateTimeFormat | formatRange(fromDate: Date, toDate: Date): string; | 新增 | - | - | 时间日期数字模块-NumberFormat | constructor(locale: string, options?:options) | 新增 | - | - | 时间日期数字模块-NumberFormat | constructor(locale: string[], options?:options) | 新增 | - | - | 时间日期数字模块-NumberFormat | resolvedOptions(): NumberOptions | 新增 | - | - | 时间日期数字模块-NumberFormat | format(number: number): string; | 新增 | - | - | 时间日期数字模块-DateTimeOptions | locale | 新增 | - | - | 时间日期数字模块-DateTimeOptions | dateStyle | 新增 | - | - | 时间日期数字模块-DateTimeOptions | timeStyle | 新增 | - | - | 时间日期数字模块-DateTimeOptions | calendar | 新增 | - | - | 时间日期数字模块-DateTimeOptions | dayPeriod | 新增 | - | - | 时间日期数字模块-DateTimeOptions | numberingSystem | 新增 | - | - | 时间日期数字模块-DateTimeOptions | localeMatcher | 新增 | - | - | 时间日期数字模块-DateTimeOptions | timeZone | 新增 | - | - | 时间日期数字模块-DateTimeOptions | hour12 | 新增 | - | - | 时间日期数字模块-DateTimeOptions | hourCycle | 新增 | - | - | 时间日期数字模块-DateTimeOptions | formatMatcher | 新增 | - | - | 时间日期数字模块-DateTimeOptions | weekday | 新增 | - | - | 时间日期数字模块-DateTimeOptions | era | 新增 | - | - | 时间日期数字模块-DateTimeOptions | year | 新增 | - | - | 时间日期数字模块-DateTimeOptions | month | 新增 | - | - | 时间日期数字模块-DateTimeOptions | day | 新增 | - | - | 时间日期数字模块-DateTimeOptions | hour | 新增 | - | - | 时间日期数字模块-DateTimeOptions | minute | 新增 | - | - | 时间日期数字模块-DateTimeOptions | second | 新增 | - | - | 时间日期数字模块-DateTimeOptions | timeZoneName | 新增 | - | - | 时间日期数字模块-NumberOptions | locale | 新增 | - | - | 时间日期数字模块-NumberOptions | compactDisplay | 新增 | - | - | 时间日期数字模块-NumberOptions | currency | 新增 | - | - | 时间日期数字模块-NumberOptions | currencyDisplay | 新增 | - | - | 时间日期数字模块-NumberOptions | currencySign | 新增 | - | - | 时间日期数字模块-NumberOptions | localeMatcher | 新增 | - | - | 时间日期数字模块-NumberOptions | notation | 新增 | - | - | 时间日期数字模块-NumberOptions | numberingSystem | 新增 | - | - | 时间日期数字模块-NumberOptions | signDisplay | 新增 | - | - | 时间日期数字模块-NumberOptions | style | 新增 | - | - | 时间日期数字模块-NumberOptions | unit | 新增 | - | - | 时间日期数字模块-NumberOptions | unitDisplay | 新增 | - | - | 时间日期数字模块-NumberOptions | useGrouping | 新增 | - | - | 时间日期数字模块-NumberOptions | minimumIntegerDigits | 新增 | - | - | 时间日期数字模块-NumberOptions | minimumFractionDigits | 新增 | - | - | 时间日期数字模块-NumberOptions | maximumFractionDigits | 新增 | - | - | 时间日期数字模块-NumberOptions | minimumSignificantDigits | 新增 | - | - | 时间日期数字模块-NumberOptions | maximumSignificantDigits | 新增 | - | -|文件存储- system.file|mkdir|新增|-| -|文件存储- system.file|rmdir|新增|-| -|文件存储- system.file|get|新增|-| -|文件存储- system.file|list|新增|-| -|文件存储- system.file|copy|新增|-| -|文件存储- system.file|move|新增|-| -|文件存储- system.file|delete|新增|-| -|文件存储- system.file|access|新增|-| -|文件存储- system.file|writeText|新增|-| -|文件存储- system.file|writeArrayBuffer|新增|-| -|文件存储- system.file|readText|新增|-| -|文件存储- system.file|readArrayBuffer|新增|-| -|文件存储- fileio|Dir.readSync|新增|-| -|文件存储- fileio|Dir.closeSync|新增|-| -|文件存储- fileio|dirent.name|新增|-| -|文件存储- fileio|dirent.isBlockDevice()|新增|-| -|文件存储- fileio|dirent.isCharacterDevice()|新增|-| -|文件存储- fileio|dirent.isDirectory()|新增|-| -|文件存储- fileio|dirent.isFIFO()|新增|-| -|文件存储- fileio|dirent.isFile()|新增|-| -|文件存储- fileio|dirent.isSocket()|新增|-| -|文件存储- fileio|dirent.isSymbolicLink()|新增|-| -|文件存储- fileio|stat.dev|新增|-| -|文件存储- fileio|stat.ino|新增|-| -|文件存储- fileio|stat.mode|新增|-| -|文件存储- fileio|stat.nlink|新增|-| -|文件存储- fileio|stat.uid|新增|-| -|文件存储- fileio|stat.gid|新增|-| -|文件存储- fileio|stat.rdev|新增|-| -|文件存储- fileio|stat.size|新增|-| -|文件存储- fileio|stat.blocks|新增|-| -|文件存储- fileio|stat.atime|新增|-| -|文件存储- fileio|stat.mtime|新增|-| -|文件存储- fileio|stat.ctime|新增|-| -|文件存储- fileio|stat.isBlockDevice()|新增|-| -|文件存储- fileio|stat.isCharacterDevice()|新增|-| -|文件存储- fileio|stat.isDirectory()|新增|-| -|文件存储- fileio|stat.isFIFO()|新增|-| -|文件存储- fileio|stat.isFile()|新增|-| -|文件存储- fileio|stat.isSocket()|新增|-| -|文件存储- fileio|stat.isSymbolicLink()|新增|-| -|文件存储- fileio|Stream.flushSync()|新增|-| -|文件存储- fileio|Stream.writeSync()|新增|-| -|文件存储- fileio|Stream.readSync()|新增|-| -|文件存储- fileio|Stream.closeSync()|新增|-| -|文件存储- fileio|fileio.accessSync()|新增|-| -|文件存储- fileio|fileio.chmodSync()|新增|-| -|文件存储- fileio|fileio.chownSync()|新增|-| -|文件存储- fileio|fileio.closeSync()|新增|-| -|文件存储- fileio|fileio.copyFileSync()|新增|-| -|文件存储- fileio|fileio.createStreamSync()|新增|-| -|文件存储- fileio|fileio.fchmodSync()|新增|-| -|文件存储- fileio|fileio.fchownSync()|新增|-| -|文件存储- fileio|fileio.fdopenStreamSync()|新增|-| -|文件存储- fileio|fileio.fstatSync()|新增|-| -|文件存储- fileio|fileio.fsyncSync()|新增|-| -|文件存储- fileio|fileio.ftruncateSync()|新增|-| -|文件存储- fileio|fileio.mkdirSync()|新增|-| -|文件存储- fileio|fileio.openSync()|新增|-| -|文件存储- fileio|fileio.opendirSync()|新增|-| -|文件存储- fileio|fileio.readSync()|新增|-| -|文件存储- fileio|fileio.renameSync()|新增|-| -|文件存储- fileio|fileio.rmdirSync()|新增|-| -|文件存储- fileio|fileio.statSync()|新增|-| -|文件存储- fileio|fileio.truncateSync()|新增|-| -|文件存储- fileio|fileio.unlinkSync()|新增|-| -|文件存储- fileio|fileio.writeSync()|新增|-| -|设备管理-DeviceManager|DeviceInfo|新增|-| -|设备管理-DeviceManager|DeviceType|新增|-| -|设备管理-DeviceManager|DeviceStateChangeAction|新增|-| -|设备管理-DeviceManager|SubscribeInfo|新增|-| -|设备管理-DeviceManager|DiscoverMode|新增|-| -|设备管理-DeviceManager|ExchangeMedium|新增|-| -|设备管理-DeviceManager|ExchangeFreq|新增|-| -|设备管理-DeviceManager|SubscribeCap|新增|-| -|设备管理-DeviceManager|createDeviceManager(bundleName: string, callback: AsyncCallback): void|新增|-| -|设备管理-DeviceManager|release(): void|新增|-| -|设备管理-DeviceManager|getTrustedDeviceListSync(): Array|新增|-| -|设备管理-DeviceManager|startDeviceDiscovery(subscribeInfo: SubscribeInfo): void|新增|-| -|设备管理-DeviceManager|stopDeviceDiscovery(subscribeId: number): void|新增|-| -|设备管理-DeviceManager|authenticateDevice(deviceInfo: DeviceInfo): void|新增|-| -|设备管理-DeviceManager|on(type: 'deviceStateChange', callback: Callback<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void|新增|-| -|设备管理-DeviceManager|off(type: 'deviceStateChange', callback?: Callback<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void|新增|-| -|设备管理-DeviceManager|on(type: 'deviceFound', callback: Callback<{ subscribeId: number, device: DeviceInfo }>): void|新增|-| -|设备管理-DeviceManager|off(type: 'deviceFound', callback?: Callback<{ subscribeId: number, device: DeviceInfo }>): void|新增|-| -|设备管理-DeviceManager|on(type: 'discoverFail', callback: Callback<{ subscribeId: number, reason: number }>): void|新增|-| -|设备管理-DeviceManager|off(type: 'discoverFail', callback?: Callback<{ subscribeId: number, reason: number }>): void|新增|-| -|设备管理-DeviceManager|on(type: 'authResult', callback: Callback<{ deviceId: string, status: number, reason: number }>): void|新增|-| -|设备管理-DeviceManager|off(type: 'authResult', callback?: Callback<{ deviceId: string, status: number, reason: number }>): void|新增|-| -|设备管理-DeviceManager|on(type: 'serviceDie', callback: () => void): void|新增|-| -|设备管理-DeviceManager|off(type: 'serviceDie', callback?: () => void): void|新增|-| -|播放录制|createAudioPlayer(): AudioPlayer|新增|-| -|播放录制|AudioState|新增|-| -|播放录制|play(): void|新增|-| -|播放录制|pause(): void|新增|-| -|播放录制|stop(): void|新增|-| -|播放录制|seek(timeMs: number): void|新增|-| -|播放录制|setVolume(vol: number): void|新增|-| -|播放录制|reset(): void|新增|-| -|播放录制|release(): void|新增|-| -|播放录制|src: string|新增|-| -|播放录制|loop: boolean|新增|-| -|播放录制|readonly currentTime: number|新增|-| -|播放录制|readonly duration: number|新增|-| -|播放录制|readonly state: AudioState|新增|-| -|播放录制|on(type: 'play' / 'pause' / 'stop' / 'reset' / 'dataLoad' / 'finish' / 'volumeChange', callback: () => void): void|新增|-| -|播放录制|on(type: 'timeUpdate', callback: Callback): void|新增|-| -|播放录制|on(type: 'error', callback: ErrorCallback): void|新增|-| -|音频管理|getAudioManager(): AudioManager|新增|-| -|音频管理|AudioVolumeType|新增|-| -|音频管理|MEDIA|新增|-| -|音频管理|RINGTONE|新增|-| -|音频管理|DeviceFlag|新增|-| -|音频管理|OUTPUT_DEVICES_FLAG|新增|-| -|音频管理|INPUT_DEVICES_FLAG |新增|-| -|音频管理|ALL_DEVICES_FLAG |新增|-| -|音频管理|DeviceRole |新增|-| -|音频管理|INPUT_DEVICE |新增|-| -|音频管理|OUTPUT_DEVICE |新增|-| -|音频管理|DeviceType |新增|-| -|音频管理|INVALID |新增|-| -|音频管理|SPEAKER |新增|-| -|音频管理|WIRED_HEADSET |新增|-| -|音频管理|BLUETOOTH_SCO |新增|-| -|音频管理|BLUETOOTH_A2DP |新增|-| -|音频管理|MIC|新增|-| -|音频管理|AudioRingMode |新增|-| -|音频管理|RINGER_MODE_NORMAL |新增|-| -|音频管理|RINGER_MODE_SILENT|新增|-| -|音频管理|RINGER_MODE_VIBRATE |新增|-| -|音频管理|setVolume(audioType: AudioVolumeType, volume: number,callback: AsyncCallback): void|新增|-| -|音频管理|setVolume(audioType: AudioVolumeType, volume: number): Promise|新增|-| -|音频管理|getVolume(audioType: AudioVolumeType, callback: AsyncCallback): void|新增|-| -|音频管理|getVolume(audioType: AudioVolumeType): Promise|新增|-| -|音频管理|getMinVolume(audioType: AudioVolumeType, callback: AsyncCallback): void|新增|-| -|音频管理|getMinVolume(audioType: AudioVolumeType): Promise|新增|-| -|音频管理|getMaxVolume(audioType: AudioVolumeType, callback: AsyncCallback): void|新增|-| -|音频管理|getMaxVolume(audioType: AudioVolumeType): Promise|新增|-| -|音频管理|getDevices(deviceFlag: DeviceFlag, callback: AsyncCallback): void|新增|-| -|音频管理|getDevices(deviceFlag: DeviceFlag): Promise|新增|-| -|音频管理|getRingerMode(callback: AsyncCallback): void|新增|-| -|音频管理|getRingerMode(): Promise|新增|-| -|音频管理|setRingerMode(mode: AudioRingMode, callback: AsyncCallback): void|新增|-| -|音频管理|setRingerMode(mode: AudioRingMode): Promise|新增|-| -|音频管理|isMute(volumeType: AudioVolumeType, callback: AsyncCallback): void|新增|-| -|音频管理|isMute(volumeType: AudioVolumeType): Promise|新增|-| -|音频管理|isActive(volumeType: AudioVolumeType, callback: AsyncCallback): void|新增|-| -|音频管理|isActive(volumeType: AudioVolumeType): Promise|新增|-| -|音频管理|isMicrophoneMute(callback: AsyncCallback): void|新增|-| -|音频管理|isMicrophoneMute(): Promise|新增|-| -|音频管理|mute(volumeType: AudioVolumeType, mute: boolean, callback: AsyncCallback) : void|新增|-| -|音频管理|mute(volumeType: AudioVolumeType, mute: boolean): Promise|新增|-| -|音频管理|setMicrophoneMute(mute: boolean, callback: AsyncCallback): void|新增|-| -|音频管理|setMicrophoneMute(mute: boolean): Promise|新增|-| -|音频管理|isDeviceActive(deviceType: DeviceType, callback: AsyncCallback): void|新增|-| -|音频管理|isDeviceActive(deviceType: DeviceType): Promise|新增|-| -|音频管理|setDeviceActive(deviceType: DeviceType, active: boolean, callback: AsyncCallback): void|新增|-| -|音频管理|setDeviceActive(deviceType: DeviceType, active: boolean): Promise|新增|-| -|音频管理|getAudioParameter(key: string, callback: AsyncCallback): void|新增|-| -|音频管理|getAudioParameter(key: string): Promise|新增|-| -|音频管理|setAudioParameter(key: string, value: string, callback: AsyncCallback): void|新增|-| -|音频管理|setAudioParameter(key: string, value: string): Promise|新增|-| -|音频管理|AudioDeviceDescriptor|新增|-| -|音频管理|readonly deviceRole: DeviceRole|新增|-| -|音频管理|readonly deviceType: DeviceType|新增|-| -|音频管理|AudioDeviceDescriptors |新增|-| - diff --git a/zh-cn/release-notes/api-change/v2.2-beta2/native-apidiff-v2.2-beta2.md b/zh-cn/release-notes/api-change/v2.2-beta2/native-apidiff-v2.2-beta2.md deleted file mode 100644 index 1e98d3437ce6b88d742538d9af91d01a2416de23..0000000000000000000000000000000000000000 --- a/zh-cn/release-notes/api-change/v2.2-beta2/native-apidiff-v2.2-beta2.md +++ /dev/null @@ -1,19 +0,0 @@ -# Native API 差异报告 -OpenHarmony 2.2 Beta2相较于OpenHarmony 2.0 Canary版本的API变更如下: -## 轻量级系统接口变更 - -| 模块名称 | 接口名称 | 变更类型 | 变更类型 | -| -------- | -------- | -------- | -------- | -| global_i18n_lite | static LocaleInfo LocaleInfo ::ForLanguageTag(const char *languageTag, I18nStatus &status); | 新增 | 新增接口 | -| global_i18n_lite | const char LocaleInfo ::*GetExtension(const char *key); | 新增 | 新增接口 | -| global_i18n_lite | WeekInfo::WeekInfo(const LocaleInfo &localeInfo, I18nStatus &status); | 新增 | 新增接口 | -| global_i18n_lite | uint8_t WeekInfo::GetFirstDayOfWeek(); | 新增 | 新增接口 | -| global_i18n_lite | uint8_t WeekInfo::GetMinimalDaysInFirstWeek(); | 新增 | 新增接口 | -| global_i18n_lite | uint8_t WeekInfo::GetFirstDayOfWeekend(); | 新增 | 新增接口 | -| global_i18n_lite | uint8_t WeekInfo::GetLastDayOfWeekend(); | 新增 | 新增接口 | -| global_i18n_lite | int PluralFormat::GetPluralRuleIndex(double number, I18nStatus status); | 新增 | 新增接口 | -| powermgr_powermgr_lite | const RunningLock *CreateRunningLock(const char *name, RunningLockType type, RunningLockFlag flag); | 新增 | 新增接口 | -| powermgr_powermgr_lite | void DestroyRunningLock(const RunningLock *lock); | 新增 | 新增接口 | -| powermgr_powermgr_lite | BOOL AcquireRunningLock(const RunningLock *lock); | 新增 | 新增接口 | -| powermgr_powermgr_lite | BOOL ReleaseRunningLock(const RunningLock *lock); | 新增 | 新增接口 | -| powermgr_powermgr_lite | BOOL IsRunningLockHolding(const RunningLock *lock); | 新增 | 新增接口 | \ No newline at end of file