提交 01a0ae29 编写于 作者: D duangavin123

删除冗余文件及图片

Signed-off-by: Nduangavin123 <duanxichao@huawei.com>
上级 2c388cb5
REN architecture-of-the-sensor-driver-model.png liaozhiqi249.png
REN en-us_image_0000001206291517.png liaozhiqi250.png
REN process-of-using-pin.png liaozhiqi251.png
REN using-I2S-process.png liaozhiqi252.png
REN 11.png liaozhiqi253.png
REN download-six.png liaozhiqi254.png
REN download-zlib.png liaozhiqi255.png
REN en-us_image_0000001243481961.png liaozhiqi256.png
REN failed-to-obtain-the-image-file-due-to-unavailable-connection.png liaozhiqi257.png
REN reason-no-python-soft-link.png liaozhiqi258.png
REN serial-port-displayed-after-the-u-boot-is-burnt.png liaozhiqi259.png
REN solution-add-soft-link.png liaozhiqi260.png
REN terminal-list.png liaozhiqi261.png
REN evolution-roadmap.png liaozhiqi262.png
REN 2021-01-27_170334-9.png liaozhiqi263.png
REN ability-gallery-service.png liaozhiqi264.png
REN ability-test.png liaozhiqi265.png
REN add_tools.png liaozhiqi266.png
REN build-project.png liaozhiqi267.png
REN build-success.png liaozhiqi268.png
REN burn_settings.png liaozhiqi269.png
REN choose-nfc.png liaozhiqi270.png
REN choose-product-id.png liaozhiqi271.png
REN choose-requested-product-id.png liaozhiqi272.png
REN choose-template.png liaozhiqi273.png
REN component-reference-code.png liaozhiqi274.png
REN configure-project.png liaozhiqi275.png
REN console.png liaozhiqi276.png
REN control-module-icon.png liaozhiqi277.png
REN control-module.png liaozhiqi278.png
REN copy-hals-and-winder.png liaozhiqi279.png
REN date-and-time-picker.png liaozhiqi280.png
REN date-picker.png liaozhiqi281.png
REN display-component.png liaozhiqi282.png
REN edit-configurations.png liaozhiqi283.png
REN enum-component.png liaozhiqi284.png
REN enum-dialog.png liaozhiqi285.png
REN fa-information.png liaozhiqi286.png
REN harmonyos-tag.png liaozhiqi287.png
REN harmonyos-test-ability-model.png liaozhiqi288.png
REN harmonyos-test-ability.png liaozhiqi289.png
REN hi3861-burning-succeeded-13.png liaozhiqi290.png
REN hi3861-record-the-serial-port-number-10.png liaozhiqi291.png
REN hi3861-restart-the-development-board-12.png liaozhiqi292.png
REN hi3861-upload-11.png liaozhiqi293.png
REN import-project-confirm.png liaozhiqi294.png
REN import-project-setting.png liaozhiqi295.png
REN import-project.png liaozhiqi296.png
REN increase-decrease-component.png liaozhiqi297.png
REN info-dialog.png liaozhiqi298.png
REN launch-atomic-service-procedure.png liaozhiqi299.png
REN multi-column-picker.png liaozhiqi300.png
REN multifunction-component.png liaozhiqi301.png
REN onehop-develop-procedure.png liaozhiqi302.png
REN onehop-procedure.png liaozhiqi303.png
REN place-product-diagram.png liaozhiqi304.png
REN process-component.png liaozhiqi305.png
REN project-structure.png liaozhiqi306.png
REN project_settings.png liaozhiqi307.png
REN radio-dialog.png liaozhiqi308.png
REN request-product-id.png liaozhiqi309.png
REN reversal-component.png liaozhiqi310.png
REN run-entry.png liaozhiqi311.png
REN set-config-i2c-support.png liaozhiqi312.png
REN set-sn-number.png liaozhiqi313.png
REN text-picker.png liaozhiqi314.png
REN time-picker.png liaozhiqi315.png
REN write-to-buffer.png liaozhiqi316.png
REN written-to-tag.png liaozhiqi317.png
REN architecture-of-the-liteos-cortex-m-kernel.png liaozhiqi318.png
REN key-steps-for-soc-porting.png liaozhiqi319.png
REN wlan-chip.png liaozhiqi320.png
REN en-us_image_0000001220852755.png liaozhiqi321.png
REN en-us_image_0000001221012767.png liaozhiqi322.png
REN en-us_image_0000001221012768.png liaozhiqi323.png
REN en-us_image_0000001227549226.png liaozhiqi324.png
REN en-us_image_0000001227711014.png liaozhiqi325.png
REN en-us_image_0000001227711882.png liaozhiqi326.png
REN en-us_image_0000001227712350.png liaozhiqi327.png
REN en-us_image_0000001235266636.png liaozhiqi328.png
REN en-us_image_0000001260919759.png liaozhiqi329.png
REN en-us_image_0000001264982466.png liaozhiqi330.png
REN en-us_image_0000001265041892.png liaozhiqi331.png
REN en-us_image_0000001265201928.png liaozhiqi332.png
REN en-us_image_0000001267932252.png liaozhiqi333.png
REN en-us_image_0000001271234773.png liaozhiqi334.png
REN en-us_image_0000001271237242.png liaozhiqi335.png
REN en-us_image_0000001271442129.png liaozhiqi336.png
REN en-us_image_0000001271791385.png liaozhiqi337.png
REN en-us_image_0000001271912277.png liaozhiqi338.png
REN en-us_image_0000001272032361.png liaozhiqi339.png
REN en-us_image_0000001272109325.png liaozhiqi340.png
REN en-us_image_0000001276354454.png liaozhiqi341.png
REN en-us_image_000000127958708.png liaozhiqi342.png
REN en-us_image_0000001280938208.png liaozhiqi343.png
REN en-us_image_0000001312541849.png liaozhiqi344.png
REN en-us_image_0000001314076609.png liaozhiqi345.png
REN en-us_image_0000001315910101.png liaozhiqi346.png
REN en-us_image_0000001315932049.png liaozhiqi347.png
REN en-us_image_0000001322167645.png liaozhiqi348.png
REN en-us_image_0000001327429541.png liaozhiqi349.png
REN en-us_image_0000001333642545.png liaozhiqi350.png
REN en-us_image_0000001059334449.png liaozhiqi351.png
REN en-us_image_0000001060200050.png liaozhiqi352.png
REN en-us_image_0000001061889268.png liaozhiqi353.png
REN en-us_image_0000001063839940.png liaozhiqi354.png
REN OpenHarmony_build_architecture.png liaozhiqi355.png
REN operation-primitives-for-system-parameters.png liaozhiqi356.png
REN platform-architecture.png liaozhiqi357.png
REN rule-information.png liaozhiqi358.png
REN running-sequence-of-the-test-platform.png liaozhiqi359.png
REN startup-subsystem.png liaozhiqi360.png
REN USB_service_architecture.png liaozhiqi361.png
REN ȫϵͳ.png liaozhiqi362.png
REN architecture-of-the-sensor-driver-model.png liaozhiqi249.png
REN en-us_image_0000001206291517.png liaozhiqi250.png
REN process-of-using-pin.png liaozhiqi251.png
REN using-I2S-process.png liaozhiqi252.png
REN 11.png liaozhiqi253.png
REN download-six.png liaozhiqi254.png
REN download-zlib.png liaozhiqi255.png
REN en-us_image_0000001243481961.png liaozhiqi256.png
REN failed-to-obtain-the-image-file-due-to-unavailable-connection.png liaozhiqi257.png
REN reason-no-python-soft-link.png liaozhiqi258.png
REN serial-port-displayed-after-the-u-boot-is-burnt.png liaozhiqi259.png
REN solution-add-soft-link.png liaozhiqi260.png
REN terminal-list.png liaozhiqi261.png
REN evolution-roadmap.png liaozhiqi262.png
REN 2021-01-27_170334-9.png liaozhiqi263.png
REN ability-gallery-service.png liaozhiqi264.png
REN ability-test.png liaozhiqi265.png
REN add_tools.png liaozhiqi266.png
REN build-project.png liaozhiqi267.png
REN build-success.png liaozhiqi268.png
REN burn_settings.png liaozhiqi269.png
REN choose-nfc.png liaozhiqi270.png
REN choose-product-id.png liaozhiqi271.png
REN choose-requested-product-id.png liaozhiqi272.png
REN choose-template.png liaozhiqi273.png
REN component-reference-code.png liaozhiqi274.png
REN configure-project.png liaozhiqi275.png
REN console.png liaozhiqi276.png
REN control-module-icon.png liaozhiqi277.png
REN control-module.png liaozhiqi278.png
REN copy-hals-and-winder.png liaozhiqi279.png
REN date-and-time-picker.png liaozhiqi280.png
REN date-picker.png liaozhiqi281.png
REN display-component.png liaozhiqi282.png
REN edit-configurations.png liaozhiqi283.png
REN enum-component.png liaozhiqi284.png
REN enum-dialog.png liaozhiqi285.png
REN fa-information.png liaozhiqi286.png
REN harmonyos-tag.png liaozhiqi287.png
REN harmonyos-test-ability-model.png liaozhiqi288.png
REN harmonyos-test-ability.png liaozhiqi289.png
REN hi3861-burning-succeeded-13.png liaozhiqi290.png
REN hi3861-record-the-serial-port-number-10.png liaozhiqi291.png
REN hi3861-restart-the-development-board-12.png liaozhiqi292.png
REN hi3861-upload-11.png liaozhiqi293.png
REN import-project-confirm.png liaozhiqi294.png
REN import-project-setting.png liaozhiqi295.png
REN import-project.png liaozhiqi296.png
REN increase-decrease-component.png liaozhiqi297.png
REN info-dialog.png liaozhiqi298.png
REN launch-atomic-service-procedure.png liaozhiqi299.png
REN multi-column-picker.png liaozhiqi300.png
REN multifunction-component.png liaozhiqi301.png
REN onehop-develop-procedure.png liaozhiqi302.png
REN onehop-procedure.png liaozhiqi303.png
REN place-product-diagram.png liaozhiqi304.png
REN process-component.png liaozhiqi305.png
REN project-structure.png liaozhiqi306.png
REN project_settings.png liaozhiqi307.png
REN radio-dialog.png liaozhiqi308.png
REN request-product-id.png liaozhiqi309.png
REN reversal-component.png liaozhiqi310.png
REN run-entry.png liaozhiqi311.png
REN set-config-i2c-support.png liaozhiqi312.png
REN set-sn-number.png liaozhiqi313.png
REN text-picker.png liaozhiqi314.png
REN time-picker.png liaozhiqi315.png
REN write-to-buffer.png liaozhiqi316.png
REN written-to-tag.png liaozhiqi317.png
REN architecture-of-the-liteos-cortex-m-kernel.png liaozhiqi318.png
REN key-steps-for-soc-porting.png liaozhiqi319.png
REN wlan-chip.png liaozhiqi320.png
REN en-us_image_0000001220852755.png liaozhiqi321.png
REN en-us_image_0000001221012767.png liaozhiqi322.png
REN en-us_image_0000001221012768.png liaozhiqi323.png
REN en-us_image_0000001227549226.png liaozhiqi324.png
REN en-us_image_0000001227711014.png liaozhiqi325.png
REN en-us_image_0000001227711882.png liaozhiqi326.png
REN en-us_image_0000001227712350.png liaozhiqi327.png
REN en-us_image_0000001235266636.png liaozhiqi328.png
REN en-us_image_0000001260919759.png liaozhiqi329.png
REN en-us_image_0000001264982466.png liaozhiqi330.png
REN en-us_image_0000001265041892.png liaozhiqi331.png
REN en-us_image_0000001265201928.png liaozhiqi332.png
REN en-us_image_0000001267932252.png liaozhiqi333.png
REN en-us_image_0000001271234773.png liaozhiqi334.png
REN en-us_image_0000001271237242.png liaozhiqi335.png
REN en-us_image_0000001271442129.png liaozhiqi336.png
REN en-us_image_0000001271791385.png liaozhiqi337.png
REN en-us_image_0000001271912277.png liaozhiqi338.png
REN en-us_image_0000001272032361.png liaozhiqi339.png
REN en-us_image_0000001272109325.png liaozhiqi340.png
REN en-us_image_0000001276354454.png liaozhiqi341.png
REN en-us_image_000000127958708.png liaozhiqi342.png
REN en-us_image_0000001280938208.png liaozhiqi343.png
REN en-us_image_0000001312541849.png liaozhiqi344.png
REN en-us_image_0000001314076609.png liaozhiqi345.png
REN en-us_image_0000001315910101.png liaozhiqi346.png
REN en-us_image_0000001315932049.png liaozhiqi347.png
REN en-us_image_0000001322167645.png liaozhiqi348.png
REN en-us_image_0000001327429541.png liaozhiqi349.png
REN en-us_image_0000001333642545.png liaozhiqi350.png
REN en-us_image_0000001059334449.png liaozhiqi351.png
REN en-us_image_0000001060200050.png liaozhiqi352.png
REN en-us_image_0000001061889268.png liaozhiqi353.png
REN en-us_image_0000001063839940.png liaozhiqi354.png
REN OpenHarmony_build_architecture.png liaozhiqi355.png
REN operation-primitives-for-system-parameters.png liaozhiqi356.png
REN platform-architecture.png liaozhiqi357.png
REN rule-information.png liaozhiqi358.png
REN running-sequence-of-the-test-platform.png liaozhiqi359.png
REN startup-subsystem.png liaozhiqi360.png
REN USB_service_architecture.png liaozhiqi361.png
REN ȫϵͳ.png liaozhiqi362.png
REN architecture-of-the-sensor-driver-model.png liaozhiqi249.png
REN en-us_image_0000001206291517.png liaozhiqi250.png
REN process-of-using-pin.png liaozhiqi251.png
REN using-I2S-process.png liaozhiqi252.png
REN 11.png liaozhiqi253.png
REN download-six.png liaozhiqi254.png
REN download-zlib.png liaozhiqi255.png
REN en-us_image_0000001243481961.png liaozhiqi256.png
REN failed-to-obtain-the-image-file-due-to-unavailable-connection.png liaozhiqi257.png
REN reason-no-python-soft-link.png liaozhiqi258.png
REN serial-port-displayed-after-the-u-boot-is-burnt.png liaozhiqi259.png
REN solution-add-soft-link.png liaozhiqi260.png
REN terminal-list.png liaozhiqi261.png
REN evolution-roadmap.png liaozhiqi262.png
REN 2021-01-27_170334-9.png liaozhiqi263.png
REN ability-gallery-service.png liaozhiqi264.png
REN ability-test.png liaozhiqi265.png
REN add_tools.png liaozhiqi266.png
REN build-project.png liaozhiqi267.png
REN build-success.png liaozhiqi268.png
REN burn_settings.png liaozhiqi269.png
REN choose-nfc.png liaozhiqi270.png
REN choose-product-id.png liaozhiqi271.png
REN choose-requested-product-id.png liaozhiqi272.png
REN choose-template.png liaozhiqi273.png
REN component-reference-code.png liaozhiqi274.png
REN configure-project.png liaozhiqi275.png
REN console.png liaozhiqi276.png
REN control-module-icon.png liaozhiqi277.png
REN control-module.png liaozhiqi278.png
REN copy-hals-and-winder.png liaozhiqi279.png
REN date-and-time-picker.png liaozhiqi280.png
REN date-picker.png liaozhiqi281.png
REN display-component.png liaozhiqi282.png
REN edit-configurations.png liaozhiqi283.png
REN enum-component.png liaozhiqi284.png
REN enum-dialog.png liaozhiqi285.png
REN fa-information.png liaozhiqi286.png
REN harmonyos-tag.png liaozhiqi287.png
REN harmonyos-test-ability-model.png liaozhiqi288.png
REN harmonyos-test-ability.png liaozhiqi289.png
REN hi3861-burning-succeeded-13.png liaozhiqi290.png
REN hi3861-record-the-serial-port-number-10.png liaozhiqi291.png
REN hi3861-restart-the-development-board-12.png liaozhiqi292.png
REN hi3861-upload-11.png liaozhiqi293.png
REN import-project-confirm.png liaozhiqi294.png
REN import-project-setting.png liaozhiqi295.png
REN import-project.png liaozhiqi296.png
REN increase-decrease-component.png liaozhiqi297.png
REN info-dialog.png liaozhiqi298.png
REN launch-atomic-service-procedure.png liaozhiqi299.png
REN multi-column-picker.png liaozhiqi300.png
REN multifunction-component.png liaozhiqi301.png
REN onehop-develop-procedure.png liaozhiqi302.png
REN onehop-procedure.png liaozhiqi303.png
REN place-product-diagram.png liaozhiqi304.png
REN process-component.png liaozhiqi305.png
REN project-structure.png liaozhiqi306.png
REN project_settings.png liaozhiqi307.png
REN radio-dialog.png liaozhiqi308.png
REN request-product-id.png liaozhiqi309.png
REN reversal-component.png liaozhiqi310.png
REN run-entry.png liaozhiqi311.png
REN set-config-i2c-support.png liaozhiqi312.png
REN set-sn-number.png liaozhiqi313.png
REN text-picker.png liaozhiqi314.png
REN time-picker.png liaozhiqi315.png
REN write-to-buffer.png liaozhiqi316.png
REN written-to-tag.png liaozhiqi317.png
REN architecture-of-the-liteos-cortex-m-kernel.png liaozhiqi318.png
REN key-steps-for-soc-porting.png liaozhiqi319.png
REN wlan-chip.png liaozhiqi320.png
REN en-us_image_0000001220852755.png liaozhiqi321.png
REN en-us_image_0000001221012767.png liaozhiqi322.png
REN en-us_image_0000001221012768.png liaozhiqi323.png
REN en-us_image_0000001227549226.png liaozhiqi324.png
REN en-us_image_0000001227711014.png liaozhiqi325.png
REN en-us_image_0000001227711882.png liaozhiqi326.png
REN en-us_image_0000001227712350.png liaozhiqi327.png
REN en-us_image_0000001235266636.png liaozhiqi328.png
REN en-us_image_0000001260919759.png liaozhiqi329.png
REN en-us_image_0000001264982466.png liaozhiqi330.png
REN en-us_image_0000001265041892.png liaozhiqi331.png
REN en-us_image_0000001265201928.png liaozhiqi332.png
REN en-us_image_0000001267932252.png liaozhiqi333.png
REN en-us_image_0000001271234773.png liaozhiqi334.png
REN en-us_image_0000001271237242.png liaozhiqi335.png
REN en-us_image_0000001271442129.png liaozhiqi336.png
REN en-us_image_0000001271791385.png liaozhiqi337.png
REN en-us_image_0000001271912277.png liaozhiqi338.png
REN en-us_image_0000001272032361.png liaozhiqi339.png
REN en-us_image_0000001272109325.png liaozhiqi340.png
REN en-us_image_0000001276354454.png liaozhiqi341.png
REN en-us_image_000000127958708.png liaozhiqi342.png
REN en-us_image_0000001280938208.png liaozhiqi343.png
REN en-us_image_0000001312541849.png liaozhiqi344.png
REN en-us_image_0000001314076609.png liaozhiqi345.png
REN en-us_image_0000001315910101.png liaozhiqi346.png
REN en-us_image_0000001315932049.png liaozhiqi347.png
REN en-us_image_0000001322167645.png liaozhiqi348.png
REN en-us_image_0000001327429541.png liaozhiqi349.png
REN en-us_image_0000001333642545.png liaozhiqi350.png
REN en-us_image_0000001059334449.png liaozhiqi351.png
REN en-us_image_0000001060200050.png liaozhiqi352.png
REN en-us_image_0000001061889268.png liaozhiqi353.png
REN en-us_image_0000001063839940.png liaozhiqi354.png
REN OpenHarmony_build_architecture.png liaozhiqi355.png
REN operation-primitives-for-system-parameters.png liaozhiqi356.png
REN platform-architecture.png liaozhiqi357.png
REN rule-information.png liaozhiqi358.png
REN running-sequence-of-the-test-platform.png liaozhiqi359.png
REN startup-subsystem.png liaozhiqi360.png
REN USB_service_architecture.png liaozhiqi361.png
REN ȫϵͳ.png liaozhiqi362.png
REN architecture-of-the-sensor-driver-model.png liaozhiqi249.png
REN en-us_image_0000001206291517.png liaozhiqi250.png
REN process-of-using-pin.png liaozhiqi251.png
REN using-I2S-process.png liaozhiqi252.png
REN 11.png liaozhiqi253.png
REN download-six.png liaozhiqi254.png
REN download-zlib.png liaozhiqi255.png
REN en-us_image_0000001243481961.png liaozhiqi256.png
REN failed-to-obtain-the-image-file-due-to-unavailable-connection.png liaozhiqi257.png
REN reason-no-python-soft-link.png liaozhiqi258.png
REN serial-port-displayed-after-the-u-boot-is-burnt.png liaozhiqi259.png
REN solution-add-soft-link.png liaozhiqi260.png
REN terminal-list.png liaozhiqi261.png
REN evolution-roadmap.png liaozhiqi262.png
REN 2021-01-27_170334-9.png liaozhiqi263.png
REN ability-gallery-service.png liaozhiqi264.png
REN ability-test.png liaozhiqi265.png
REN add_tools.png liaozhiqi266.png
REN build-project.png liaozhiqi267.png
REN build-success.png liaozhiqi268.png
REN burn_settings.png liaozhiqi269.png
REN choose-nfc.png liaozhiqi270.png
REN choose-product-id.png liaozhiqi271.png
REN choose-requested-product-id.png liaozhiqi272.png
REN choose-template.png liaozhiqi273.png
REN component-reference-code.png liaozhiqi274.png
REN configure-project.png liaozhiqi275.png
REN console.png liaozhiqi276.png
REN control-module-icon.png liaozhiqi277.png
REN control-module.png liaozhiqi278.png
REN copy-hals-and-winder.png liaozhiqi279.png
REN date-and-time-picker.png liaozhiqi280.png
REN date-picker.png liaozhiqi281.png
REN display-component.png liaozhiqi282.png
REN edit-configurations.png liaozhiqi283.png
REN enum-component.png liaozhiqi284.png
REN enum-dialog.png liaozhiqi285.png
REN fa-information.png liaozhiqi286.png
REN harmonyos-tag.png liaozhiqi287.png
REN harmonyos-test-ability-model.png liaozhiqi288.png
REN harmonyos-test-ability.png liaozhiqi289.png
REN hi3861-burning-succeeded-13.png liaozhiqi290.png
REN hi3861-record-the-serial-port-number-10.png liaozhiqi291.png
REN hi3861-restart-the-development-board-12.png liaozhiqi292.png
REN hi3861-upload-11.png liaozhiqi293.png
REN import-project-confirm.png liaozhiqi294.png
REN import-project-setting.png liaozhiqi295.png
REN import-project.png liaozhiqi296.png
REN increase-decrease-component.png liaozhiqi297.png
REN info-dialog.png liaozhiqi298.png
REN launch-atomic-service-procedure.png liaozhiqi299.png
REN multi-column-picker.png liaozhiqi300.png
REN multifunction-component.png liaozhiqi301.png
REN onehop-develop-procedure.png liaozhiqi302.png
REN onehop-procedure.png liaozhiqi303.png
REN place-product-diagram.png liaozhiqi304.png
REN process-component.png liaozhiqi305.png
REN project-structure.png liaozhiqi306.png
REN project_settings.png liaozhiqi307.png
REN radio-dialog.png liaozhiqi308.png
REN request-product-id.png liaozhiqi309.png
REN reversal-component.png liaozhiqi310.png
REN run-entry.png liaozhiqi311.png
REN set-config-i2c-support.png liaozhiqi312.png
REN set-sn-number.png liaozhiqi313.png
REN text-picker.png liaozhiqi314.png
REN time-picker.png liaozhiqi315.png
REN write-to-buffer.png liaozhiqi316.png
REN written-to-tag.png liaozhiqi317.png
REN architecture-of-the-liteos-cortex-m-kernel.png liaozhiqi318.png
REN key-steps-for-soc-porting.png liaozhiqi319.png
REN wlan-chip.png liaozhiqi320.png
REN en-us_image_0000001220852755.png liaozhiqi321.png
REN en-us_image_0000001221012767.png liaozhiqi322.png
REN en-us_image_0000001221012768.png liaozhiqi323.png
REN en-us_image_0000001227549226.png liaozhiqi324.png
REN en-us_image_0000001227711014.png liaozhiqi325.png
REN en-us_image_0000001227711882.png liaozhiqi326.png
REN en-us_image_0000001227712350.png liaozhiqi327.png
REN en-us_image_0000001235266636.png liaozhiqi328.png
REN en-us_image_0000001260919759.png liaozhiqi329.png
REN en-us_image_0000001264982466.png liaozhiqi330.png
REN en-us_image_0000001265041892.png liaozhiqi331.png
REN en-us_image_0000001265201928.png liaozhiqi332.png
REN en-us_image_0000001267932252.png liaozhiqi333.png
REN en-us_image_0000001271234773.png liaozhiqi334.png
REN en-us_image_0000001271237242.png liaozhiqi335.png
REN en-us_image_0000001271442129.png liaozhiqi336.png
REN en-us_image_0000001271791385.png liaozhiqi337.png
REN en-us_image_0000001271912277.png liaozhiqi338.png
REN en-us_image_0000001272032361.png liaozhiqi339.png
REN en-us_image_0000001272109325.png liaozhiqi340.png
REN en-us_image_0000001276354454.png liaozhiqi341.png
REN en-us_image_000000127958708.png liaozhiqi342.png
REN en-us_image_0000001280938208.png liaozhiqi343.png
REN en-us_image_0000001312541849.png liaozhiqi344.png
REN en-us_image_0000001314076609.png liaozhiqi345.png
REN en-us_image_0000001315910101.png liaozhiqi346.png
REN en-us_image_0000001315932049.png liaozhiqi347.png
REN en-us_image_0000001322167645.png liaozhiqi348.png
REN en-us_image_0000001327429541.png liaozhiqi349.png
REN en-us_image_0000001333642545.png liaozhiqi350.png
REN en-us_image_0000001059334449.png liaozhiqi351.png
REN en-us_image_0000001060200050.png liaozhiqi352.png
REN en-us_image_0000001061889268.png liaozhiqi353.png
REN en-us_image_0000001063839940.png liaozhiqi354.png
REN OpenHarmony_build_architecture.png liaozhiqi355.png
REN operation-primitives-for-system-parameters.png liaozhiqi356.png
REN platform-architecture.png liaozhiqi357.png
REN rule-information.png liaozhiqi358.png
REN running-sequence-of-the-test-platform.png liaozhiqi359.png
REN startup-subsystem.png liaozhiqi360.png
REN USB_service_architecture.png liaozhiqi361.png
REN ȫϵͳ.png liaozhiqi362.png
REN architecture-of-the-sensor-driver-model.png liaozhiqi249.png
REN en-us_image_0000001206291517.png liaozhiqi250.png
REN process-of-using-pin.png liaozhiqi251.png
REN using-I2S-process.png liaozhiqi252.png
REN 11.png liaozhiqi253.png
REN download-six.png liaozhiqi254.png
REN download-zlib.png liaozhiqi255.png
REN en-us_image_0000001243481961.png liaozhiqi256.png
REN failed-to-obtain-the-image-file-due-to-unavailable-connection.png liaozhiqi257.png
REN reason-no-python-soft-link.png liaozhiqi258.png
REN serial-port-displayed-after-the-u-boot-is-burnt.png liaozhiqi259.png
REN solution-add-soft-link.png liaozhiqi260.png
REN terminal-list.png liaozhiqi261.png
REN evolution-roadmap.png liaozhiqi262.png
REN 2021-01-27_170334-9.png liaozhiqi263.png
REN ability-gallery-service.png liaozhiqi264.png
REN ability-test.png liaozhiqi265.png
REN add_tools.png liaozhiqi266.png
REN build-project.png liaozhiqi267.png
REN build-success.png liaozhiqi268.png
REN burn_settings.png liaozhiqi269.png
REN choose-nfc.png liaozhiqi270.png
REN choose-product-id.png liaozhiqi271.png
REN choose-requested-product-id.png liaozhiqi272.png
REN choose-template.png liaozhiqi273.png
REN component-reference-code.png liaozhiqi274.png
REN configure-project.png liaozhiqi275.png
REN console.png liaozhiqi276.png
REN control-module-icon.png liaozhiqi277.png
REN control-module.png liaozhiqi278.png
REN copy-hals-and-winder.png liaozhiqi279.png
REN date-and-time-picker.png liaozhiqi280.png
REN date-picker.png liaozhiqi281.png
REN display-component.png liaozhiqi282.png
REN edit-configurations.png liaozhiqi283.png
REN enum-component.png liaozhiqi284.png
REN enum-dialog.png liaozhiqi285.png
REN fa-information.png liaozhiqi286.png
REN harmonyos-tag.png liaozhiqi287.png
REN harmonyos-test-ability-model.png liaozhiqi288.png
REN harmonyos-test-ability.png liaozhiqi289.png
REN hi3861-burning-succeeded-13.png liaozhiqi290.png
REN hi3861-record-the-serial-port-number-10.png liaozhiqi291.png
REN hi3861-restart-the-development-board-12.png liaozhiqi292.png
REN hi3861-upload-11.png liaozhiqi293.png
REN import-project-confirm.png liaozhiqi294.png
REN import-project-setting.png liaozhiqi295.png
REN import-project.png liaozhiqi296.png
REN increase-decrease-component.png liaozhiqi297.png
REN info-dialog.png liaozhiqi298.png
REN launch-atomic-service-procedure.png liaozhiqi299.png
REN multi-column-picker.png liaozhiqi300.png
REN multifunction-component.png liaozhiqi301.png
REN onehop-develop-procedure.png liaozhiqi302.png
REN onehop-procedure.png liaozhiqi303.png
REN place-product-diagram.png liaozhiqi304.png
REN process-component.png liaozhiqi305.png
REN project-structure.png liaozhiqi306.png
REN project_settings.png liaozhiqi307.png
REN radio-dialog.png liaozhiqi308.png
REN request-product-id.png liaozhiqi309.png
REN reversal-component.png liaozhiqi310.png
REN run-entry.png liaozhiqi311.png
REN set-config-i2c-support.png liaozhiqi312.png
REN set-sn-number.png liaozhiqi313.png
REN text-picker.png liaozhiqi314.png
REN time-picker.png liaozhiqi315.png
REN write-to-buffer.png liaozhiqi316.png
REN written-to-tag.png liaozhiqi317.png
REN architecture-of-the-liteos-cortex-m-kernel.png liaozhiqi318.png
REN key-steps-for-soc-porting.png liaozhiqi319.png
REN wlan-chip.png liaozhiqi320.png
REN en-us_image_0000001220852755.png liaozhiqi321.png
REN en-us_image_0000001221012767.png liaozhiqi322.png
REN en-us_image_0000001221012768.png liaozhiqi323.png
REN en-us_image_0000001227549226.png liaozhiqi324.png
REN en-us_image_0000001227711014.png liaozhiqi325.png
REN en-us_image_0000001227711882.png liaozhiqi326.png
REN en-us_image_0000001227712350.png liaozhiqi327.png
REN en-us_image_0000001235266636.png liaozhiqi328.png
REN en-us_image_0000001260919759.png liaozhiqi329.png
REN en-us_image_0000001264982466.png liaozhiqi330.png
REN en-us_image_0000001265041892.png liaozhiqi331.png
REN en-us_image_0000001265201928.png liaozhiqi332.png
REN en-us_image_0000001267932252.png liaozhiqi333.png
REN en-us_image_0000001271234773.png liaozhiqi334.png
REN en-us_image_0000001271237242.png liaozhiqi335.png
REN en-us_image_0000001271442129.png liaozhiqi336.png
REN en-us_image_0000001271791385.png liaozhiqi337.png
REN en-us_image_0000001271912277.png liaozhiqi338.png
REN en-us_image_0000001272032361.png liaozhiqi339.png
REN en-us_image_0000001272109325.png liaozhiqi340.png
REN en-us_image_0000001276354454.png liaozhiqi341.png
REN en-us_image_000000127958708.png liaozhiqi342.png
REN en-us_image_0000001280938208.png liaozhiqi343.png
REN en-us_image_0000001312541849.png liaozhiqi344.png
REN en-us_image_0000001314076609.png liaozhiqi345.png
REN en-us_image_0000001315910101.png liaozhiqi346.png
REN en-us_image_0000001315932049.png liaozhiqi347.png
REN en-us_image_0000001322167645.png liaozhiqi348.png
REN en-us_image_0000001327429541.png liaozhiqi349.png
REN en-us_image_0000001333642545.png liaozhiqi350.png
REN en-us_image_0000001059334449.png liaozhiqi351.png
REN en-us_image_0000001060200050.png liaozhiqi352.png
REN en-us_image_0000001061889268.png liaozhiqi353.png
REN en-us_image_0000001063839940.png liaozhiqi354.png
REN OpenHarmony_build_architecture.png liaozhiqi355.png
REN operation-primitives-for-system-parameters.png liaozhiqi356.png
REN platform-architecture.png liaozhiqi357.png
REN rule-information.png liaozhiqi358.png
REN running-sequence-of-the-test-platform.png liaozhiqi359.png
REN startup-subsystem.png liaozhiqi360.png
REN USB_service_architecture.png liaozhiqi361.png
REN ȫϵͳ.png liaozhiqi362.png
REN architecture-of-the-sensor-driver-model.png liaozhiqi249.png
REN en-us_image_0000001206291517.png liaozhiqi250.png
REN process-of-using-pin.png liaozhiqi251.png
REN using-I2S-process.png liaozhiqi252.png
REN 11.png liaozhiqi253.png
REN download-six.png liaozhiqi254.png
REN download-zlib.png liaozhiqi255.png
REN en-us_image_0000001243481961.png liaozhiqi256.png
REN failed-to-obtain-the-image-file-due-to-unavailable-connection.png liaozhiqi257.png
REN reason-no-python-soft-link.png liaozhiqi258.png
REN serial-port-displayed-after-the-u-boot-is-burnt.png liaozhiqi259.png
REN solution-add-soft-link.png liaozhiqi260.png
REN terminal-list.png liaozhiqi261.png
REN evolution-roadmap.png liaozhiqi262.png
REN 2021-01-27_170334-9.png liaozhiqi263.png
REN ability-gallery-service.png liaozhiqi264.png
REN ability-test.png liaozhiqi265.png
REN add_tools.png liaozhiqi266.png
REN build-project.png liaozhiqi267.png
REN build-success.png liaozhiqi268.png
REN burn_settings.png liaozhiqi269.png
REN choose-nfc.png liaozhiqi270.png
REN choose-product-id.png liaozhiqi271.png
REN choose-requested-product-id.png liaozhiqi272.png
REN choose-template.png liaozhiqi273.png
REN component-reference-code.png liaozhiqi274.png
REN configure-project.png liaozhiqi275.png
REN console.png liaozhiqi276.png
REN control-module-icon.png liaozhiqi277.png
REN control-module.png liaozhiqi278.png
REN copy-hals-and-winder.png liaozhiqi279.png
REN date-and-time-picker.png liaozhiqi280.png
REN date-picker.png liaozhiqi281.png
REN display-component.png liaozhiqi282.png
REN edit-configurations.png liaozhiqi283.png
REN enum-component.png liaozhiqi284.png
REN enum-dialog.png liaozhiqi285.png
REN fa-information.png liaozhiqi286.png
REN harmonyos-tag.png liaozhiqi287.png
REN harmonyos-test-ability-model.png liaozhiqi288.png
REN harmonyos-test-ability.png liaozhiqi289.png
REN hi3861-burning-succeeded-13.png liaozhiqi290.png
REN hi3861-record-the-serial-port-number-10.png liaozhiqi291.png
REN hi3861-restart-the-development-board-12.png liaozhiqi292.png
REN hi3861-upload-11.png liaozhiqi293.png
REN import-project-confirm.png liaozhiqi294.png
REN import-project-setting.png liaozhiqi295.png
REN import-project.png liaozhiqi296.png
REN increase-decrease-component.png liaozhiqi297.png
REN info-dialog.png liaozhiqi298.png
REN launch-atomic-service-procedure.png liaozhiqi299.png
REN multi-column-picker.png liaozhiqi300.png
REN multifunction-component.png liaozhiqi301.png
REN onehop-develop-procedure.png liaozhiqi302.png
REN onehop-procedure.png liaozhiqi303.png
REN place-product-diagram.png liaozhiqi304.png
REN process-component.png liaozhiqi305.png
REN project-structure.png liaozhiqi306.png
REN project_settings.png liaozhiqi307.png
REN radio-dialog.png liaozhiqi308.png
REN request-product-id.png liaozhiqi309.png
REN reversal-component.png liaozhiqi310.png
REN run-entry.png liaozhiqi311.png
REN set-config-i2c-support.png liaozhiqi312.png
REN set-sn-number.png liaozhiqi313.png
REN text-picker.png liaozhiqi314.png
REN time-picker.png liaozhiqi315.png
REN write-to-buffer.png liaozhiqi316.png
REN written-to-tag.png liaozhiqi317.png
REN architecture-of-the-liteos-cortex-m-kernel.png liaozhiqi318.png
REN key-steps-for-soc-porting.png liaozhiqi319.png
REN wlan-chip.png liaozhiqi320.png
REN en-us_image_0000001220852755.png liaozhiqi321.png
REN en-us_image_0000001221012767.png liaozhiqi322.png
REN en-us_image_0000001221012768.png liaozhiqi323.png
REN en-us_image_0000001227549226.png liaozhiqi324.png
REN en-us_image_0000001227711014.png liaozhiqi325.png
REN en-us_image_0000001227711882.png liaozhiqi326.png
REN en-us_image_0000001227712350.png liaozhiqi327.png
REN en-us_image_0000001235266636.png liaozhiqi328.png
REN en-us_image_0000001260919759.png liaozhiqi329.png
REN en-us_image_0000001264982466.png liaozhiqi330.png
REN en-us_image_0000001265041892.png liaozhiqi331.png
REN en-us_image_0000001265201928.png liaozhiqi332.png
REN en-us_image_0000001267932252.png liaozhiqi333.png
REN en-us_image_0000001271234773.png liaozhiqi334.png
REN en-us_image_0000001271237242.png liaozhiqi335.png
REN en-us_image_0000001271442129.png liaozhiqi336.png
REN en-us_image_0000001271791385.png liaozhiqi337.png
REN en-us_image_0000001271912277.png liaozhiqi338.png
REN en-us_image_0000001272032361.png liaozhiqi339.png
REN en-us_image_0000001272109325.png liaozhiqi340.png
REN en-us_image_0000001276354454.png liaozhiqi341.png
REN en-us_image_000000127958708.png liaozhiqi342.png
REN en-us_image_0000001280938208.png liaozhiqi343.png
REN en-us_image_0000001312541849.png liaozhiqi344.png
REN en-us_image_0000001314076609.png liaozhiqi345.png
REN en-us_image_0000001315910101.png liaozhiqi346.png
REN en-us_image_0000001315932049.png liaozhiqi347.png
REN en-us_image_0000001322167645.png liaozhiqi348.png
REN en-us_image_0000001327429541.png liaozhiqi349.png
REN en-us_image_0000001333642545.png liaozhiqi350.png
REN en-us_image_0000001059334449.png liaozhiqi351.png
REN en-us_image_0000001060200050.png liaozhiqi352.png
REN en-us_image_0000001061889268.png liaozhiqi353.png
REN en-us_image_0000001063839940.png liaozhiqi354.png
REN OpenHarmony_build_architecture.png liaozhiqi355.png
REN operation-primitives-for-system-parameters.png liaozhiqi356.png
REN platform-architecture.png liaozhiqi357.png
REN rule-information.png liaozhiqi358.png
REN running-sequence-of-the-test-platform.png liaozhiqi359.png
REN startup-subsystem.png liaozhiqi360.png
REN USB_service_architecture.png liaozhiqi361.png
REN ȫϵͳ.png liaozhiqi362.png
REN architecture-of-the-sensor-driver-model.png liaozhiqi249.png
REN en-us_image_0000001206291517.png liaozhiqi250.png
REN process-of-using-pin.png liaozhiqi251.png
REN using-I2S-process.png liaozhiqi252.png
REN 11.png liaozhiqi253.png
REN download-six.png liaozhiqi254.png
REN download-zlib.png liaozhiqi255.png
REN en-us_image_0000001243481961.png liaozhiqi256.png
REN failed-to-obtain-the-image-file-due-to-unavailable-connection.png liaozhiqi257.png
REN reason-no-python-soft-link.png liaozhiqi258.png
REN serial-port-displayed-after-the-u-boot-is-burnt.png liaozhiqi259.png
REN solution-add-soft-link.png liaozhiqi260.png
REN terminal-list.png liaozhiqi261.png
REN evolution-roadmap.png liaozhiqi262.png
REN 2021-01-27_170334-9.png liaozhiqi263.png
REN ability-gallery-service.png liaozhiqi264.png
REN ability-test.png liaozhiqi265.png
REN add_tools.png liaozhiqi266.png
REN build-project.png liaozhiqi267.png
REN build-success.png liaozhiqi268.png
REN burn_settings.png liaozhiqi269.png
REN choose-nfc.png liaozhiqi270.png
REN choose-product-id.png liaozhiqi271.png
REN choose-requested-product-id.png liaozhiqi272.png
REN choose-template.png liaozhiqi273.png
REN component-reference-code.png liaozhiqi274.png
REN configure-project.png liaozhiqi275.png
REN console.png liaozhiqi276.png
REN control-module-icon.png liaozhiqi277.png
REN control-module.png liaozhiqi278.png
REN copy-hals-and-winder.png liaozhiqi279.png
REN date-and-time-picker.png liaozhiqi280.png
REN date-picker.png liaozhiqi281.png
REN display-component.png liaozhiqi282.png
REN edit-configurations.png liaozhiqi283.png
REN enum-component.png liaozhiqi284.png
REN enum-dialog.png liaozhiqi285.png
REN fa-information.png liaozhiqi286.png
REN harmonyos-tag.png liaozhiqi287.png
REN harmonyos-test-ability-model.png liaozhiqi288.png
REN harmonyos-test-ability.png liaozhiqi289.png
REN hi3861-burning-succeeded-13.png liaozhiqi290.png
REN hi3861-record-the-serial-port-number-10.png liaozhiqi291.png
REN hi3861-restart-the-development-board-12.png liaozhiqi292.png
REN hi3861-upload-11.png liaozhiqi293.png
REN import-project-confirm.png liaozhiqi294.png
REN import-project-setting.png liaozhiqi295.png
REN import-project.png liaozhiqi296.png
REN increase-decrease-component.png liaozhiqi297.png
REN info-dialog.png liaozhiqi298.png
REN launch-atomic-service-procedure.png liaozhiqi299.png
REN multi-column-picker.png liaozhiqi300.png
REN multifunction-component.png liaozhiqi301.png
REN onehop-develop-procedure.png liaozhiqi302.png
REN onehop-procedure.png liaozhiqi303.png
REN place-product-diagram.png liaozhiqi304.png
REN process-component.png liaozhiqi305.png
REN project-structure.png liaozhiqi306.png
REN project_settings.png liaozhiqi307.png
REN radio-dialog.png liaozhiqi308.png
REN request-product-id.png liaozhiqi309.png
REN reversal-component.png liaozhiqi310.png
REN run-entry.png liaozhiqi311.png
REN set-config-i2c-support.png liaozhiqi312.png
REN set-sn-number.png liaozhiqi313.png
REN text-picker.png liaozhiqi314.png
REN time-picker.png liaozhiqi315.png
REN write-to-buffer.png liaozhiqi316.png
REN written-to-tag.png liaozhiqi317.png
REN architecture-of-the-liteos-cortex-m-kernel.png liaozhiqi318.png
REN key-steps-for-soc-porting.png liaozhiqi319.png
REN wlan-chip.png liaozhiqi320.png
REN en-us_image_0000001220852755.png liaozhiqi321.png
REN en-us_image_0000001221012767.png liaozhiqi322.png
REN en-us_image_0000001221012768.png liaozhiqi323.png
REN en-us_image_0000001227549226.png liaozhiqi324.png
REN en-us_image_0000001227711014.png liaozhiqi325.png
REN en-us_image_0000001227711882.png liaozhiqi326.png
REN en-us_image_0000001227712350.png liaozhiqi327.png
REN en-us_image_0000001235266636.png liaozhiqi328.png
REN en-us_image_0000001260919759.png liaozhiqi329.png
REN en-us_image_0000001264982466.png liaozhiqi330.png
REN en-us_image_0000001265041892.png liaozhiqi331.png
REN en-us_image_0000001265201928.png liaozhiqi332.png
REN en-us_image_0000001267932252.png liaozhiqi333.png
REN en-us_image_0000001271234773.png liaozhiqi334.png
REN en-us_image_0000001271237242.png liaozhiqi335.png
REN en-us_image_0000001271442129.png liaozhiqi336.png
REN en-us_image_0000001271791385.png liaozhiqi337.png
REN en-us_image_0000001271912277.png liaozhiqi338.png
REN en-us_image_0000001272032361.png liaozhiqi339.png
REN en-us_image_0000001272109325.png liaozhiqi340.png
REN en-us_image_0000001276354454.png liaozhiqi341.png
REN en-us_image_000000127958708.png liaozhiqi342.png
REN en-us_image_0000001280938208.png liaozhiqi343.png
REN en-us_image_0000001312541849.png liaozhiqi344.png
REN en-us_image_0000001314076609.png liaozhiqi345.png
REN en-us_image_0000001315910101.png liaozhiqi346.png
REN en-us_image_0000001315932049.png liaozhiqi347.png
REN en-us_image_0000001322167645.png liaozhiqi348.png
REN en-us_image_0000001327429541.png liaozhiqi349.png
REN en-us_image_0000001333642545.png liaozhiqi350.png
REN en-us_image_0000001059334449.png liaozhiqi351.png
REN en-us_image_0000001060200050.png liaozhiqi352.png
REN en-us_image_0000001061889268.png liaozhiqi353.png
REN en-us_image_0000001063839940.png liaozhiqi354.png
REN OpenHarmony_build_architecture.png liaozhiqi355.png
REN operation-primitives-for-system-parameters.png liaozhiqi356.png
REN platform-architecture.png liaozhiqi357.png
REN rule-information.png liaozhiqi358.png
REN running-sequence-of-the-test-platform.png liaozhiqi359.png
REN startup-subsystem.png liaozhiqi360.png
REN USB_service_architecture.png liaozhiqi361.png
REN ȫϵͳ.png liaozhiqi362.png
REN architecture-of-the-sensor-driver-model.png liaozhiqi249.png
REN en-us_image_0000001206291517.png liaozhiqi250.png
REN process-of-using-pin.png liaozhiqi251.png
REN using-I2S-process.png liaozhiqi252.png
REN 11.png liaozhiqi253.png
REN download-six.png liaozhiqi254.png
REN download-zlib.png liaozhiqi255.png
REN en-us_image_0000001243481961.png liaozhiqi256.png
REN failed-to-obtain-the-image-file-due-to-unavailable-connection.png liaozhiqi257.png
REN reason-no-python-soft-link.png liaozhiqi258.png
REN serial-port-displayed-after-the-u-boot-is-burnt.png liaozhiqi259.png
REN solution-add-soft-link.png liaozhiqi260.png
REN terminal-list.png liaozhiqi261.png
REN evolution-roadmap.png liaozhiqi262.png
REN 2021-01-27_170334-9.png liaozhiqi263.png
REN ability-gallery-service.png liaozhiqi264.png
REN ability-test.png liaozhiqi265.png
REN add_tools.png liaozhiqi266.png
REN build-project.png liaozhiqi267.png
REN build-success.png liaozhiqi268.png
REN burn_settings.png liaozhiqi269.png
REN choose-nfc.png liaozhiqi270.png
REN choose-product-id.png liaozhiqi271.png
REN choose-requested-product-id.png liaozhiqi272.png
REN choose-template.png liaozhiqi273.png
REN component-reference-code.png liaozhiqi274.png
REN configure-project.png liaozhiqi275.png
REN console.png liaozhiqi276.png
REN control-module-icon.png liaozhiqi277.png
REN control-module.png liaozhiqi278.png
REN copy-hals-and-winder.png liaozhiqi279.png
REN date-and-time-picker.png liaozhiqi280.png
REN date-picker.png liaozhiqi281.png
REN display-component.png liaozhiqi282.png
REN edit-configurations.png liaozhiqi283.png
REN enum-component.png liaozhiqi284.png
REN enum-dialog.png liaozhiqi285.png
REN fa-information.png liaozhiqi286.png
REN harmonyos-tag.png liaozhiqi287.png
REN harmonyos-test-ability-model.png liaozhiqi288.png
REN harmonyos-test-ability.png liaozhiqi289.png
REN hi3861-burning-succeeded-13.png liaozhiqi290.png
REN hi3861-record-the-serial-port-number-10.png liaozhiqi291.png
REN hi3861-restart-the-development-board-12.png liaozhiqi292.png
REN hi3861-upload-11.png liaozhiqi293.png
REN import-project-confirm.png liaozhiqi294.png
REN import-project-setting.png liaozhiqi295.png
REN import-project.png liaozhiqi296.png
REN increase-decrease-component.png liaozhiqi297.png
REN info-dialog.png liaozhiqi298.png
REN launch-atomic-service-procedure.png liaozhiqi299.png
REN multi-column-picker.png liaozhiqi300.png
REN multifunction-component.png liaozhiqi301.png
REN onehop-develop-procedure.png liaozhiqi302.png
REN onehop-procedure.png liaozhiqi303.png
REN place-product-diagram.png liaozhiqi304.png
REN process-component.png liaozhiqi305.png
REN project-structure.png liaozhiqi306.png
REN project_settings.png liaozhiqi307.png
REN radio-dialog.png liaozhiqi308.png
REN request-product-id.png liaozhiqi309.png
REN reversal-component.png liaozhiqi310.png
REN run-entry.png liaozhiqi311.png
REN set-config-i2c-support.png liaozhiqi312.png
REN set-sn-number.png liaozhiqi313.png
REN text-picker.png liaozhiqi314.png
REN time-picker.png liaozhiqi315.png
REN write-to-buffer.png liaozhiqi316.png
REN written-to-tag.png liaozhiqi317.png
REN architecture-of-the-liteos-cortex-m-kernel.png liaozhiqi318.png
REN key-steps-for-soc-porting.png liaozhiqi319.png
REN wlan-chip.png liaozhiqi320.png
REN en-us_image_0000001220852755.png liaozhiqi321.png
REN en-us_image_0000001221012767.png liaozhiqi322.png
REN en-us_image_0000001221012768.png liaozhiqi323.png
REN en-us_image_0000001227549226.png liaozhiqi324.png
REN en-us_image_0000001227711014.png liaozhiqi325.png
REN en-us_image_0000001227711882.png liaozhiqi326.png
REN en-us_image_0000001227712350.png liaozhiqi327.png
REN en-us_image_0000001235266636.png liaozhiqi328.png
REN en-us_image_0000001260919759.png liaozhiqi329.png
REN en-us_image_0000001264982466.png liaozhiqi330.png
REN en-us_image_0000001265041892.png liaozhiqi331.png
REN en-us_image_0000001265201928.png liaozhiqi332.png
REN en-us_image_0000001267932252.png liaozhiqi333.png
REN en-us_image_0000001271234773.png liaozhiqi334.png
REN en-us_image_0000001271237242.png liaozhiqi335.png
REN en-us_image_0000001271442129.png liaozhiqi336.png
REN en-us_image_0000001271791385.png liaozhiqi337.png
REN en-us_image_0000001271912277.png liaozhiqi338.png
REN en-us_image_0000001272032361.png liaozhiqi339.png
REN en-us_image_0000001272109325.png liaozhiqi340.png
REN en-us_image_0000001276354454.png liaozhiqi341.png
REN en-us_image_000000127958708.png liaozhiqi342.png
REN en-us_image_0000001280938208.png liaozhiqi343.png
REN en-us_image_0000001312541849.png liaozhiqi344.png
REN en-us_image_0000001314076609.png liaozhiqi345.png
REN en-us_image_0000001315910101.png liaozhiqi346.png
REN en-us_image_0000001315932049.png liaozhiqi347.png
REN en-us_image_0000001322167645.png liaozhiqi348.png
REN en-us_image_0000001327429541.png liaozhiqi349.png
REN en-us_image_0000001333642545.png liaozhiqi350.png
REN en-us_image_0000001059334449.png liaozhiqi351.png
REN en-us_image_0000001060200050.png liaozhiqi352.png
REN en-us_image_0000001061889268.png liaozhiqi353.png
REN en-us_image_0000001063839940.png liaozhiqi354.png
REN OpenHarmony_build_architecture.png liaozhiqi355.png
REN operation-primitives-for-system-parameters.png liaozhiqi356.png
REN platform-architecture.png liaozhiqi357.png
REN rule-information.png liaozhiqi358.png
REN running-sequence-of-the-test-platform.png liaozhiqi359.png
REN startup-subsystem.png liaozhiqi360.png
REN USB_service_architecture.png liaozhiqi361.png
REN ȫϵͳ.png liaozhiqi362.png
REN architecture-of-the-sensor-driver-model.png liaozhiqi249.png
REN en-us_image_0000001206291517.png liaozhiqi250.png
REN process-of-using-pin.png liaozhiqi251.png
REN using-I2S-process.png liaozhiqi252.png
REN 11.png liaozhiqi253.png
REN download-six.png liaozhiqi254.png
REN download-zlib.png liaozhiqi255.png
REN en-us_image_0000001243481961.png liaozhiqi256.png
REN failed-to-obtain-the-image-file-due-to-unavailable-connection.png liaozhiqi257.png
REN reason-no-python-soft-link.png liaozhiqi258.png
REN serial-port-displayed-after-the-u-boot-is-burnt.png liaozhiqi259.png
REN solution-add-soft-link.png liaozhiqi260.png
REN terminal-list.png liaozhiqi261.png
REN evolution-roadmap.png liaozhiqi262.png
REN 2021-01-27_170334-9.png liaozhiqi263.png
REN ability-gallery-service.png liaozhiqi264.png
REN ability-test.png liaozhiqi265.png
REN add_tools.png liaozhiqi266.png
REN build-project.png liaozhiqi267.png
REN build-success.png liaozhiqi268.png
REN burn_settings.png liaozhiqi269.png
REN choose-nfc.png liaozhiqi270.png
REN choose-product-id.png liaozhiqi271.png
REN choose-requested-product-id.png liaozhiqi272.png
REN choose-template.png liaozhiqi273.png
REN component-reference-code.png liaozhiqi274.png
REN configure-project.png liaozhiqi275.png
REN console.png liaozhiqi276.png
REN control-module-icon.png liaozhiqi277.png
REN control-module.png liaozhiqi278.png
REN copy-hals-and-winder.png liaozhiqi279.png
REN date-and-time-picker.png liaozhiqi280.png
REN date-picker.png liaozhiqi281.png
REN display-component.png liaozhiqi282.png
REN edit-configurations.png liaozhiqi283.png
REN enum-component.png liaozhiqi284.png
REN enum-dialog.png liaozhiqi285.png
REN fa-information.png liaozhiqi286.png
REN harmonyos-tag.png liaozhiqi287.png
REN harmonyos-test-ability-model.png liaozhiqi288.png
REN harmonyos-test-ability.png liaozhiqi289.png
REN hi3861-burning-succeeded-13.png liaozhiqi290.png
REN hi3861-record-the-serial-port-number-10.png liaozhiqi291.png
REN hi3861-restart-the-development-board-12.png liaozhiqi292.png
REN hi3861-upload-11.png liaozhiqi293.png
REN import-project-confirm.png liaozhiqi294.png
REN import-project-setting.png liaozhiqi295.png
REN import-project.png liaozhiqi296.png
REN increase-decrease-component.png liaozhiqi297.png
REN info-dialog.png liaozhiqi298.png
REN launch-atomic-service-procedure.png liaozhiqi299.png
REN multi-column-picker.png liaozhiqi300.png
REN multifunction-component.png liaozhiqi301.png
REN onehop-develop-procedure.png liaozhiqi302.png
REN onehop-procedure.png liaozhiqi303.png
REN place-product-diagram.png liaozhiqi304.png
REN process-component.png liaozhiqi305.png
REN project-structure.png liaozhiqi306.png
REN project_settings.png liaozhiqi307.png
REN radio-dialog.png liaozhiqi308.png
REN request-product-id.png liaozhiqi309.png
REN reversal-component.png liaozhiqi310.png
REN run-entry.png liaozhiqi311.png
REN set-config-i2c-support.png liaozhiqi312.png
REN set-sn-number.png liaozhiqi313.png
REN text-picker.png liaozhiqi314.png
REN time-picker.png liaozhiqi315.png
REN write-to-buffer.png liaozhiqi316.png
REN written-to-tag.png liaozhiqi317.png
REN architecture-of-the-liteos-cortex-m-kernel.png liaozhiqi318.png
REN key-steps-for-soc-porting.png liaozhiqi319.png
REN wlan-chip.png liaozhiqi320.png
REN en-us_image_0000001220852755.png liaozhiqi321.png
REN en-us_image_0000001221012767.png liaozhiqi322.png
REN en-us_image_0000001221012768.png liaozhiqi323.png
REN en-us_image_0000001227549226.png liaozhiqi324.png
REN en-us_image_0000001227711014.png liaozhiqi325.png
REN en-us_image_0000001227711882.png liaozhiqi326.png
REN en-us_image_0000001227712350.png liaozhiqi327.png
REN en-us_image_0000001235266636.png liaozhiqi328.png
REN en-us_image_0000001260919759.png liaozhiqi329.png
REN en-us_image_0000001264982466.png liaozhiqi330.png
REN en-us_image_0000001265041892.png liaozhiqi331.png
REN en-us_image_0000001265201928.png liaozhiqi332.png
REN en-us_image_0000001267932252.png liaozhiqi333.png
REN en-us_image_0000001271234773.png liaozhiqi334.png
REN en-us_image_0000001271237242.png liaozhiqi335.png
REN en-us_image_0000001271442129.png liaozhiqi336.png
REN en-us_image_0000001271791385.png liaozhiqi337.png
REN en-us_image_0000001271912277.png liaozhiqi338.png
REN en-us_image_0000001272032361.png liaozhiqi339.png
REN en-us_image_0000001272109325.png liaozhiqi340.png
REN en-us_image_0000001276354454.png liaozhiqi341.png
REN en-us_image_000000127958708.png liaozhiqi342.png
REN en-us_image_0000001280938208.png liaozhiqi343.png
REN en-us_image_0000001312541849.png liaozhiqi344.png
REN en-us_image_0000001314076609.png liaozhiqi345.png
REN en-us_image_0000001315910101.png liaozhiqi346.png
REN en-us_image_0000001315932049.png liaozhiqi347.png
REN en-us_image_0000001322167645.png liaozhiqi348.png
REN en-us_image_0000001327429541.png liaozhiqi349.png
REN en-us_image_0000001333642545.png liaozhiqi350.png
REN en-us_image_0000001059334449.png liaozhiqi351.png
REN en-us_image_0000001060200050.png liaozhiqi352.png
REN en-us_image_0000001061889268.png liaozhiqi353.png
REN en-us_image_0000001063839940.png liaozhiqi354.png
REN OpenHarmony_build_architecture.png liaozhiqi355.png
REN operation-primitives-for-system-parameters.png liaozhiqi356.png
REN platform-architecture.png liaozhiqi357.png
REN rule-information.png liaozhiqi358.png
REN running-sequence-of-the-test-platform.png liaozhiqi359.png
REN startup-subsystem.png liaozhiqi360.png
REN USB_service_architecture.png liaozhiqi361.png
REN ȫϵͳ.png liaozhiqi362.png
REN architecture-of-the-sensor-driver-model.png liaozhiqi249.png
REN en-us_image_0000001206291517.png liaozhiqi250.png
REN process-of-using-pin.png liaozhiqi251.png
REN using-I2S-process.png liaozhiqi252.png
REN 11.png liaozhiqi253.png
REN download-six.png liaozhiqi254.png
REN download-zlib.png liaozhiqi255.png
REN en-us_image_0000001243481961.png liaozhiqi256.png
REN failed-to-obtain-the-image-file-due-to-unavailable-connection.png liaozhiqi257.png
REN reason-no-python-soft-link.png liaozhiqi258.png
REN serial-port-displayed-after-the-u-boot-is-burnt.png liaozhiqi259.png
REN solution-add-soft-link.png liaozhiqi260.png
REN terminal-list.png liaozhiqi261.png
REN evolution-roadmap.png liaozhiqi262.png
REN 2021-01-27_170334-9.png liaozhiqi263.png
REN ability-gallery-service.png liaozhiqi264.png
REN ability-test.png liaozhiqi265.png
REN add_tools.png liaozhiqi266.png
REN build-project.png liaozhiqi267.png
REN build-success.png liaozhiqi268.png
REN burn_settings.png liaozhiqi269.png
REN choose-nfc.png liaozhiqi270.png
REN choose-product-id.png liaozhiqi271.png
REN choose-requested-product-id.png liaozhiqi272.png
REN choose-template.png liaozhiqi273.png
REN component-reference-code.png liaozhiqi274.png
REN configure-project.png liaozhiqi275.png
REN console.png liaozhiqi276.png
REN control-module-icon.png liaozhiqi277.png
REN control-module.png liaozhiqi278.png
REN copy-hals-and-winder.png liaozhiqi279.png
REN date-and-time-picker.png liaozhiqi280.png
REN date-picker.png liaozhiqi281.png
REN display-component.png liaozhiqi282.png
REN edit-configurations.png liaozhiqi283.png
REN enum-component.png liaozhiqi284.png
REN enum-dialog.png liaozhiqi285.png
REN fa-information.png liaozhiqi286.png
REN harmonyos-tag.png liaozhiqi287.png
REN harmonyos-test-ability-model.png liaozhiqi288.png
REN harmonyos-test-ability.png liaozhiqi289.png
REN hi3861-burning-succeeded-13.png liaozhiqi290.png
REN hi3861-record-the-serial-port-number-10.png liaozhiqi291.png
REN hi3861-restart-the-development-board-12.png liaozhiqi292.png
REN hi3861-upload-11.png liaozhiqi293.png
REN import-project-confirm.png liaozhiqi294.png
REN import-project-setting.png liaozhiqi295.png
REN import-project.png liaozhiqi296.png
REN increase-decrease-component.png liaozhiqi297.png
REN info-dialog.png liaozhiqi298.png
REN launch-atomic-service-procedure.png liaozhiqi299.png
REN multi-column-picker.png liaozhiqi300.png
REN multifunction-component.png liaozhiqi301.png
REN onehop-develop-procedure.png liaozhiqi302.png
REN onehop-procedure.png liaozhiqi303.png
REN place-product-diagram.png liaozhiqi304.png
REN process-component.png liaozhiqi305.png
REN project-structure.png liaozhiqi306.png
REN project_settings.png liaozhiqi307.png
REN radio-dialog.png liaozhiqi308.png
REN request-product-id.png liaozhiqi309.png
REN reversal-component.png liaozhiqi310.png
REN run-entry.png liaozhiqi311.png
REN set-config-i2c-support.png liaozhiqi312.png
REN set-sn-number.png liaozhiqi313.png
REN text-picker.png liaozhiqi314.png
REN time-picker.png liaozhiqi315.png
REN write-to-buffer.png liaozhiqi316.png
REN written-to-tag.png liaozhiqi317.png
REN architecture-of-the-liteos-cortex-m-kernel.png liaozhiqi318.png
REN key-steps-for-soc-porting.png liaozhiqi319.png
REN wlan-chip.png liaozhiqi320.png
REN en-us_image_0000001220852755.png liaozhiqi321.png
REN en-us_image_0000001221012767.png liaozhiqi322.png
REN en-us_image_0000001221012768.png liaozhiqi323.png
REN en-us_image_0000001227549226.png liaozhiqi324.png
REN en-us_image_0000001227711014.png liaozhiqi325.png
REN en-us_image_0000001227711882.png liaozhiqi326.png
REN en-us_image_0000001227712350.png liaozhiqi327.png
REN en-us_image_0000001235266636.png liaozhiqi328.png
REN en-us_image_0000001260919759.png liaozhiqi329.png
REN en-us_image_0000001264982466.png liaozhiqi330.png
REN en-us_image_0000001265041892.png liaozhiqi331.png
REN en-us_image_0000001265201928.png liaozhiqi332.png
REN en-us_image_0000001267932252.png liaozhiqi333.png
REN en-us_image_0000001271234773.png liaozhiqi334.png
REN en-us_image_0000001271237242.png liaozhiqi335.png
REN en-us_image_0000001271442129.png liaozhiqi336.png
REN en-us_image_0000001271791385.png liaozhiqi337.png
REN en-us_image_0000001271912277.png liaozhiqi338.png
REN en-us_image_0000001272032361.png liaozhiqi339.png
REN en-us_image_0000001272109325.png liaozhiqi340.png
REN en-us_image_0000001276354454.png liaozhiqi341.png
REN en-us_image_000000127958708.png liaozhiqi342.png
REN en-us_image_0000001280938208.png liaozhiqi343.png
REN en-us_image_0000001312541849.png liaozhiqi344.png
REN en-us_image_0000001314076609.png liaozhiqi345.png
REN en-us_image_0000001315910101.png liaozhiqi346.png
REN en-us_image_0000001315932049.png liaozhiqi347.png
REN en-us_image_0000001322167645.png liaozhiqi348.png
REN en-us_image_0000001327429541.png liaozhiqi349.png
REN en-us_image_0000001333642545.png liaozhiqi350.png
REN en-us_image_0000001059334449.png liaozhiqi351.png
REN en-us_image_0000001060200050.png liaozhiqi352.png
REN en-us_image_0000001061889268.png liaozhiqi353.png
REN en-us_image_0000001063839940.png liaozhiqi354.png
REN OpenHarmony_build_architecture.png liaozhiqi355.png
REN operation-primitives-for-system-parameters.png liaozhiqi356.png
REN platform-architecture.png liaozhiqi357.png
REN rule-information.png liaozhiqi358.png
REN running-sequence-of-the-test-platform.png liaozhiqi359.png
REN startup-subsystem.png liaozhiqi360.png
REN USB_service_architecture.png liaozhiqi361.png
REN ȫϵͳ.png liaozhiqi362.png
...@@ -6,54 +6,53 @@ ...@@ -6,54 +6,53 @@
- [术语](../glossary.md) - [术语](../glossary.md)
- [版本说明](../release-notes/Readme.md) - [版本说明](../release-notes/Readme.md)
- 快速开始 - 快速开始
- [轻量和小型系统快速入门](quick-start/quickstart-lite.md) - [轻量和小型系统快速入门](quick-start/quickstart-ide-lite-overview.md)
- [标准系统快速入门](quick-start/quickstart-standard.md) - [标准系统快速入门](quick-start/quickstart-ide-standard-overview.md)
- 兼容性与安全 - 兼容性与安全
- [隐私与安全规范](security/Readme-CN.md) - [隐私与安全规范](security/Readme-CN.md)
- 移植 - 移植
- [轻量和小型系统三方库移植指导](porting/porting-thirdparty.md) - [轻量和小型系统三方库移植指导](porting/porting-thirdparty-overview.md)
- [轻量系统芯片移植指导](porting/porting-minichip-overview.md) - [轻量系统芯片移植指导](porting/porting-minichip-overview.md)
- [轻量系统芯片移植案例](porting/porting-minichip-cases.md) - [轻量系统芯片移植案例](porting/porting-bes2600w-on-minisystem-display-demo.md)
- [小型系统芯片移植指导](porting/porting-smallchip.md) - [小型系统芯片移植指导](porting/porting-smallchip-prepare-needs.md)
- [标准系统芯片移植指导](porting/standard-system-porting-guide.md) [标准系统芯片移植指导](porting/standard-system-porting-guide.md)
- 子系统开发 - 子系统开发
- 内核 - 内核
- [轻量系统内核](kernel/kernel-mini.md) - [轻量系统内核](kernel/kernel-mini-overview.md)
- [小型系统内核](kernel/kernel-small.md) - [小型系统内核](kernel/kernel-small-overview.md)
- [标准系统内核](kernel/kernel-standard.md) - [标准系统内核](kernel/kernel-standard-overview.md)
- [驱动](driver/Readme-CN.md) - [驱动](driver/Readme-CN.md)
- [编译构建](subsystems/subsys-build.md) - [编译构建](subsystems/subsys-build-all.md)
- [分布式远程启动](subsystems/subsys-remote-start.md) - [分布式远程启动](subsystems/subsys-remote-start.md)
- [图形图像](subsystems/subsys-graphics.md) [图形图像](subsystems/subsys-graphics-overview.md)
- [媒体](subsystems/subsys-multimedia.md) - [媒体](subsystems/subsys-multimedia-camera-overview.md)
- [公共基础](subsystems/subsys-utils.md) - [公共基础](subsystems/subsys-utils-overview.md)
- [AI框架](subsystems/subsys-aiframework.md) [AI框架](subsystems/subsys-aiframework-guide.md)
- [数据管理](subsystems/subsys-data.md) - [数据管理](subsystems/subsys-data-relational-database-overview.md)
- [Sensor服务](subsystems/subsys-sensor.md) - [Sensor服务](subsystems/subsys-sensor-overview.md)
- [USB服务](subsystems/subsys-usbservice.md) - [USB服务](subsystems/subsys-usbservice-overview.md)
- [用户程序框架](subsystems/subsys-application-framework.md) - [用户程序框架](subsystems/subsys-application-framework-overview.md)
- [OTA升级](subsystems/subsys-ota-guide.md) - [OTA升级](subsystems/subsys-ota-guide.md)
- [电话服务](subsystems/subsys-tel.md) - [电话服务](subsystems/subsys-tel-overview.md)
- [安全](subsystems/subsys-security.md) - [安全](subsystems/subsys-security-overview.md)
- [启动恢复](subsystems/subsys-boot.md) [启动恢复](subsystems/subsys-boot-overview.md)
- [DFX](subsystems/subsys-dfx.md) - [DFX](subsystems/subsys-dfx-overview.md)
- 专题开发 - 专题开发
- [HPM Part](hpm-part/Readme-CN.md) - [HPM Part](hpm-part/Readme-CN.md)
- 设备开发示例 - 设备开发示例
- [轻量和小型系统设备开发示例](guide/device-lite.md) - [轻量和小型系统设备开发示例](guide/device-wlan-led-control.md)
- [标准系统设备开发示例](guide/device-standard.md) - [标准系统设备开发示例](guide/device-clock-guide.md)
- 调测 - 调测
- [测试用例开发](subsystems/subsys-testguide-test.md) - [测试用例开发](subsystems/subsys-testguide-test.md)
- [调测工具](subsystems/subsys-toolchain.md) - [调测工具](subsystems/subsys-toolchain-hdc-guide.md)
- XTS认证 - XTS认证
- [XTS认证](subsystems/subsys-xts-guide.md) - [XTS认证](subsystems/subsys-xts-guide.md)
- 工具 - 工具
- [Docker编译环境](get-code/gettools-acquire.md) - [Docker编译环境](get-code/gettools-acquire.md)
- [IDE集成开发环境](get-code/gettools-ide.md) - [IDE集成开发环境](get-code/gettools-ide.md)
- 示例教程
- 示例教程
- [Demo示例](https://growing.openharmony.cn/mainPlay/sample) - [Demo示例](https://growing.openharmony.cn/mainPlay/sample)
- [Codelabs](https://gitee.com/openharmony/codelabs/blob/master/README.md) - [Codelabs](https://gitee.com/openharmony/codelabs/blob/master/README.md)
- 参考 - 参考
- [常见问题-设备开发](faqs/Readme-CN.md) - [常见问题-设备开发](faqs/Readme-CN.md)
- [HDI接口参考](reference/hdi-apis/Readme-CN.md) - [HDI接口参考](reference/hdi-apis/Readme-CN.md)
......
...@@ -39,10 +39,9 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按 ...@@ -39,10 +39,9 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按
| 快速入门 | 快速熟悉OpenHarmony环境搭建、编译、烧录、调测、运行 | -&nbsp;[轻量和小型系统快速入门](quick-start/quickstart-ide-lite-overview.md) | | 快速入门 | 快速熟悉OpenHarmony环境搭建、编译、烧录、调测、运行 | -&nbsp;[轻量和小型系统快速入门](quick-start/quickstart-ide-lite-overview.md) |
| 基础能力使用 | 使用OpenHarmony提供的基础能力 | -&nbsp;[轻量系统内核开发指南](kernel/kernel-mini-overview.md)<br/>-&nbsp;[小型系统内核开发指南](kernel/kernel-small-overview.md)<br/>-&nbsp;[驱动开发指南](driver/driver-hdf-overview.md)<br/>-&nbsp;[子系统开发指南](subsystems/subsys-build-all.md)<br/>-&nbsp;[安全指南](security/security-guidelines-overall.md)<br/>-&nbsp;[隐私保护](security/security-privacy-protection.md) | | 基础能力使用 | 使用OpenHarmony提供的基础能力 | -&nbsp;[轻量系统内核开发指南](kernel/kernel-mini-overview.md)<br/>-&nbsp;[小型系统内核开发指南](kernel/kernel-small-overview.md)<br/>-&nbsp;[驱动开发指南](driver/driver-hdf-overview.md)<br/>-&nbsp;[子系统开发指南](subsystems/subsys-build-all.md)<br/>-&nbsp;[安全指南](security/security-guidelines-overall.md)<br/>-&nbsp;[隐私保护](security/security-privacy-protection.md) |
| 进阶开发 | 结合系统能力开发智能设备 | -&nbsp;[WLAN连接类产品](guide/device-wlan-led-control.md)<br/>-&nbsp;[无屏摄像头类产品](guide/device-iotcamera-control-overview.md)<br/>-&nbsp;[带屏摄像头类产品](guide/device-camera-control-overview.md) | | 进阶开发 | 结合系统能力开发智能设备 | -&nbsp;[WLAN连接类产品](guide/device-wlan-led-control.md)<br/>-&nbsp;[无屏摄像头类产品](guide/device-iotcamera-control-overview.md)<br/>-&nbsp;[带屏摄像头类产品](guide/device-camera-control-overview.md) |
| 移植适配 | -&nbsp;针对特定芯片做移植适配<br/>-&nbsp;对三方库进行移植适配<br/>-&nbsp;三方厂商移植案例<br/> | -&nbsp;[轻量系统芯片移植指导](porting/porting-minichip-overview.md)<br/>-&nbsp;[小型系统芯片移植指导](porting/porting-smallchip-prepare-needs.md)<br/>-&nbsp;[轻量和小型系统三方库移植指导](porting/porting-thirdparty-overview.md)<br/> - [带屏解决方案之恒玄芯片移植案例](porting/porting-bes2600w-on-minisystem-display-demo.md)<br/> - [Combo解决方案之ASR芯片移植案例](porting/porting-asr582x-combo-demo.md)<br/> - [物联网解决方案之芯海cst85芯片移植案例](porting/porting-cst85f01-combo-demo.md)<br/> - [轻量系统STM32F407芯片移植案例](porting/porting-stm32f407-on-minisystem-eth.md)<br/> - [Combo解决方案之W800芯片移植案例](porting/porting-w800-combo-demo.md)<br/> - [小型设备STM32MP1芯片移植案例](porting/porting-stm32mp15xx-on-smallsystem.md)| | 移植适配 | -&nbsp;针对特定芯片做移植适配<br/>-&nbsp;对三方库进行移植适配<br/>-&nbsp;三方厂商移植案例<br/> | -&nbsp;[轻量系统芯片移植指导](porting/porting-minichip-overview.md)<br/>-&nbsp;[小型系统芯片移植指导](porting/porting-smallchip-prepare-needs.md)<br/>-&nbsp;[轻量和小型系统三方库移植指导](porting/porting-thirdparty-overview.md)<br/> - [带屏解决方案之恒玄芯片移植案例](porting/porting-bes2600w-on-minisystem-display-demo.md)<br/> - [Combo解决方案之ASR芯片移植案例](porting/porting-asr582x-combo-demo.md)<br/> - [物联网解决方案之芯海cst85芯片移植案例](porting/porting-cst85f01-combo-demo.md)<br/> - [轻量系统STM32F407芯片移植案例](porting/porting-stm32f407-on-minisystem-eth.md)<br/> - [Combo解决方案之W800芯片移植案例](porting/porting-w800-combo-demo.md)<br/> - [小型设备STM32MP1芯片移植案例](porting/porting-stm32mp15xx-on-smallsystem.md) |
| 贡献组件 | 为OpenHarmony贡献功能组件 | -&nbsp;[HPM&nbsp;Part&nbsp;介绍](hpm-part/hpm-part-about.md)<br/>-&nbsp;[HPM&nbsp;Part&nbsp;开发指导](hpm-part/hpm-part-development.md)<br/>-&nbsp;[HPM&nbsp;Part&nbsp;参考](hpm-part/hpm-part-reference.md) | | 贡献组件 | 为OpenHarmony贡献功能组件 | -&nbsp;[HPM&nbsp;Part&nbsp;介绍](hpm-part/hpm-part-about.md)<br/>-&nbsp;[HPM&nbsp;Part&nbsp;开发指导](hpm-part/hpm-part-development.md)<br/>-&nbsp;[HPM&nbsp;Part&nbsp;参考](hpm-part/hpm-part-reference.md) |
| 参考 | 为开发者提供常见的问题解答和HDI接口参考 | -&nbsp;[常见问题](faqs/faqs-overview.md)<br/>-&nbsp;[HDI接口参考](reference/hdi-apis/Readme-CN.md) | 参考 | 为开发者提供常见的问题解答和HDI接口参考 | -&nbsp;[常见问题](faqs/faqs-overview.md)<br/>-&nbsp;[HDI接口参考](reference/hdi-apis/Readme-CN.md) |
**表 2** 标准系统开发指导(参考内存≥128MiB) **表 2** 标准系统开发指导(参考内存≥128MiB)
| 学习路径 | 开发者业务 | 相关文档 | | 学习路径 | 开发者业务 | 相关文档 |
...@@ -50,7 +49,7 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按 ...@@ -50,7 +49,7 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按
| 了解OpenHarmony | 整体认知OpenHarmony | -&nbsp;[OpenHarmony概述](https://gitee.com/openharmony)<br/>-&nbsp;[术语](../glossary.md) | | 了解OpenHarmony | 整体认知OpenHarmony | -&nbsp;[OpenHarmony概述](https://gitee.com/openharmony)<br/>-&nbsp;[术语](../glossary.md) |
| 获取开发资源 | 准备开发前相关资源 | -&nbsp;[获取源码](get-code/sourcecode-acquire.md)<br/>-&nbsp;[获取工具](get-code/gettools-acquire.md) | | 获取开发资源 | 准备开发前相关资源 | -&nbsp;[获取源码](get-code/sourcecode-acquire.md)<br/>-&nbsp;[获取工具](get-code/gettools-acquire.md) |
| 快速入门 | 快速熟悉OpenHarmony环境搭建、编译、烧录、调测、运行 | -&nbsp;[标准系统快速入门](quick-start/quickstart-ide-standard-overview.md) | | 快速入门 | 快速熟悉OpenHarmony环境搭建、编译、烧录、调测、运行 | -&nbsp;[标准系统快速入门](quick-start/quickstart-ide-standard-overview.md) |
| 基础能力使用 | 使用OpenHarmony提供的基础能力 | -&nbsp;[内核开发指南](kernel/kernel-standard.md)<br/>-&nbsp;[驱动开发指南](driver/driver-hdf-overview.md)<br/>-&nbsp;[子系统开发指南](subsystems/subsys-build-all.md)<br/>-&nbsp;[安全指南](security/security-guidelines-overall.md)<br/>-&nbsp;[隐私保护](security/security-privacy-protection.md) | | 基础能力使用 | 使用OpenHarmony提供的基础能力 | -&nbsp;[内核开发指南](kernel/kernel-standard-overview.md)<br/>-&nbsp;[驱动开发指南](driver/driver-hdf-overview.md)<br/>-&nbsp;[子系统开发指南](subsystems/subsys-build-all.md)<br/>-&nbsp;[安全指南](security/security-guidelines-overall.md)<br/>-&nbsp;[隐私保护](security/security-privacy-protection.md) |
| 进阶开发 | 结合系统能力开发智能设备 | -&nbsp;[时钟应用开发指导](guide/device-clock-guide.md)<br/>-&nbsp;[平台驱动开发示例](guide/device-driver-demo.md)<br/>-&nbsp;[外设驱动开发示例](guide/device-outerdriver-demo.md) | | 进阶开发 | 结合系统能力开发智能设备 | -&nbsp;[时钟应用开发指导](guide/device-clock-guide.md)<br/>-&nbsp;[平台驱动开发示例](guide/device-driver-demo.md)<br/>-&nbsp;[外设驱动开发示例](guide/device-outerdriver-demo.md) |
| 移植适配 | -&nbsp;针对特定芯片做移植适配 <br/>-&nbsp;快速移植OpenHarmony&nbsp;Linux内核的方法| -&nbsp;[标准系统芯片移植指导](porting/standard-system-porting-guide.md)<br/>-&nbsp;[一种快速移植OpenHarmony&nbsp;Linux内核的方法](porting/porting-linux-kernel.md) <br/>-&nbsp;[标准系统方案之瑞芯微RK3568移植案例](porting/porting-dayu200-on_standard-demo.md)| | 移植适配 | -&nbsp;针对特定芯片做移植适配 <br/>-&nbsp;快速移植OpenHarmony&nbsp;Linux内核的方法| -&nbsp;[标准系统芯片移植指导](porting/standard-system-porting-guide.md)<br/>-&nbsp;[一种快速移植OpenHarmony&nbsp;Linux内核的方法](porting/porting-linux-kernel.md) <br/>-&nbsp;[标准系统方案之瑞芯微RK3568移植案例](porting/porting-dayu200-on_standard-demo.md)|
| 贡献组件 | 为OpenHarmony贡献功能组件 | -&nbsp;[HPM&nbsp;Part&nbsp;介绍](hpm-part/hpm-part-about.md)<br/>-&nbsp;[HPM&nbsp;Part&nbsp;开发指导](hpm-part/hpm-part-development.md)<br/>-&nbsp;[HPM&nbsp;Part&nbsp;参考](hpm-part/hpm-part-reference.md) | | 贡献组件 | 为OpenHarmony贡献功能组件 | -&nbsp;[HPM&nbsp;Part&nbsp;介绍](hpm-part/hpm-part-about.md)<br/>-&nbsp;[HPM&nbsp;Part&nbsp;开发指导](hpm-part/hpm-part-development.md)<br/>-&nbsp;[HPM&nbsp;Part&nbsp;参考](hpm-part/hpm-part-reference.md) |
......
# 平台驱动开发
- **[ADC](driver-platform-adc-develop.md)**
- **[GPIO](driver-platform-gpio-develop.md)**
- **[I2C](driver-platform-i2c-develop.md)**
- **[MIPI DSI](driver-platform-mipidsi-develop.md)**
- **[MMC](driver-platform-mmc-develop.md)**
- **[PWM](driver-platform-pwm-develop.md)**
- **[RTC](driver-platform-rtc-develop.md)**
- **[SDIO](driver-platform-sdio-develop.md)**
- **[SPI](driver-platform-spi-develop.md)**
- **[UART](driver-platform-uart-develop.md)**
- **[WatchDog](driver-platform-watchdog-develop.md)**
\ No newline at end of file
# HDF驱动框架
- **[HDF开发概述](driver-hdf-overview.md)**
- **[驱动开发](driver-hdf-development.md)**
- **[驱动服务管理](driver-hdf-servicemanage.md)**
- **[驱动消息机制管理](driver-hdf-message-management.md)**
- **[配置管理](driver-hdf-manage.md)**
- **[HDF开发实例](driver-hdf-sample.md)**
\ No newline at end of file
# 外设驱动使用
- **[Audio](driver-peripherals-audio-des.md)**
- **[Camera](driver-peripherals-camera-des.md)**
- **[WLAN](driver-peripherals-external-des.md)**
- **[Face_auth](driver-peripherals-face_auth-des.md)**
- **[LCD](driver-peripherals-lcd-des.md)**
- **[Light](driver-peripherals-light-des.md)**
- **[Pin_auth](driver-peripherals-pinauth-des.md)**
- **[Sensor](driver-peripherals-sensor-des.md)**
- **[Touchscreen](driver-peripherals-touch-des.md)**
- **[USB](driver-peripherals-usb-des.md)**
- **[Vibrator](driver-peripherals-vibrator-des.md)**
\ No newline at end of file
...@@ -17,19 +17,19 @@ AdcMethod定义: ...@@ -17,19 +17,19 @@ AdcMethod定义:
``` ```
struct AdcMethod { struct AdcMethod {
int32_t (*read)(struct AdcDevice *device, uint32_t channel, uint32_t *val); int32_t (*read)(struct AdcDevice *device, uint32_t channel, uint32_t *val);
int32_t (*start)(struct AdcDevice *device); int32_t (*start)(struct AdcDevice *device);
int32_t (*stop)(struct AdcDevice *device); int32_t (*stop)(struct AdcDevice *device);
}; };
``` ```
**表1** AdcMethod结构体成员的回调函数功能说明 **表1** AdcMethod结构体成员的回调函数功能说明
| 函数成员 | 入参 | 出参 | 返回值 | 功能 | | 函数成员 | 入参 | 出参 | 返回值 | 功能 |
| -------- | -------- | -------- | -------- | -------- | | -------- | -------- | -------- | -------- | -------- |
| read | device:结构体指针,核心层ADC控制器<br/>channel:uint32_t,传入的通道号 | val:uint32_t指针,要传出的信号数据 | HDF_STATUS相关状态 | 读取ADC采样的信号数据 | | read | device:结构体指针,核心层ADC控制器<br/>channel:uint32_t,传入的通道号 | val:uint32_t指针,要传出的信号数据 | HDF_STATUS相关状态 | 读取ADC采样的信号数据 |
| stop | device:结构体指针,核心层ADC控制器 | 无 | HDF_STATUS相关状态 | 关闭ADC设备 | | stop | device:结构体指针,核心层ADC控制器 | 无 | HDF_STATUS相关状态 | 关闭ADC设备 |
| start | device:结构体指针,核心层ADC控制器 | 无 | HDF_STATUS相关状态 | 开启ADC设备 | | start | device:结构体指针,核心层ADC控制器 | 无 | HDF_STATUS相关状态 | 开启ADC设备 |
## 开发步骤 ## 开发步骤
...@@ -74,19 +74,19 @@ ADC模块适配必选的三个环节是配置属性文件,实例化驱动入 ...@@ -74,19 +74,19 @@ ADC模块适配必选的三个环节是配置属性文件,实例化驱动入
``` ```
static struct HdfDriverEntry g_hi35xxAdcDriverEntry = { static struct HdfDriverEntry g_hi35xxAdcDriverEntry = {
.moduleVersion = 1, .moduleVersion = 1,
.Init = Hi35xxAdcInit, .Init = Hi35xxAdcInit,
.Release = Hi35xxAdcRelease, .Release = Hi35xxAdcRelease,
.moduleName = "hi35xx_adc_driver", //【必要且与HCS文件里面的名字匹配】 .moduleName = "hi35xx_adc_driver", //【必要且与HCS文件里面的名字匹配】
}; };
HDF_INIT(g_hi35xxAdcDriverEntry); // 调用HDF_INIT将驱动入口注册到HDF框架中 HDF_INIT(g_hi35xxAdcDriverEntry); // 调用HDF_INIT将驱动入口注册到HDF框架中
// 核心层adc_core.c管理器服务的驱动入口 // 核心层adc_core.c管理器服务的驱动入口
struct HdfDriverEntry g_adcManagerEntry = { struct HdfDriverEntry g_adcManagerEntry = {
.moduleVersion = 1, .moduleVersion = 1,
.Init = AdcManagerInit, .Init = AdcManagerInit,
.Release = AdcManagerRelease, .Release = AdcManagerRelease,
.moduleName = "HDF_PLATFORM_ADC_MANAGER",// 这与device_info文件中device0对应 .moduleName = "HDF_PLATFORM_ADC_MANAGER",// 这与device_info文件中device0对应
}; };
HDF_INIT(g_adcManagerEntry); HDF_INIT(g_adcManagerEntry);
``` ```
...@@ -142,27 +142,27 @@ ADC模块适配必选的三个环节是配置属性文件,实例化驱动入 ...@@ -142,27 +142,27 @@ ADC模块适配必选的三个环节是配置属性文件,实例化驱动入
``` ```
root { root {
platform { platform {
adc_config_hi35xx { adc_config_hi35xx {
match_attr = "hisilicon_hi35xx_adc"; match_attr = "hisilicon_hi35xx_adc";
template adc_device { template adc_device {
regBasePhy = 0x120e0000;// 寄存器物理基地址 regBasePhy = 0x120e0000;// 寄存器物理基地址
regSize = 0x34; // 寄存器位宽 regSize = 0x34; // 寄存器位宽
deviceNum = 0; // 设备号 deviceNum = 0; // 设备号
validChannel = 0x1; // 有效通道 validChannel = 0x1; // 有效通道
dataWidth = 10; // 信号接收的数据位宽 dataWidth = 10; // 信号接收的数据位宽
scanMode = 1; // 扫描模式 scanMode = 1; // 扫描模式
delta = 0; // delta参数 delta = 0; // delta参数
deglitch = 0; deglitch = 0;
glitchSample = 5000; glitchSample = 5000;
rate = 20000; rate = 20000;
}
device_0 :: adc_device {
deviceNum = 0;
validChannel = 0x2;
}
}
} }
device_0 :: adc_device {
deviceNum = 0;
validChannel = 0x2;
}
}
}
} }
``` ```
...@@ -172,7 +172,7 @@ ADC模块适配必选的三个环节是配置属性文件,实例化驱动入 ...@@ -172,7 +172,7 @@ ADC模块适配必选的三个环节是配置属性文件,实例化驱动入
从驱动的角度看,自定义结构体是参数和数据的载体,而且adc_config.hcs文件中的数值会被HDF读入并通过DeviceResourceIface来初始化结构体成员,其中一些重要数值也会传递给核心层AdcDevice对象,例如设备号、总线号等。 从驱动的角度看,自定义结构体是参数和数据的载体,而且adc_config.hcs文件中的数值会被HDF读入并通过DeviceResourceIface来初始化结构体成员,其中一些重要数值也会传递给核心层AdcDevice对象,例如设备号、总线号等。
``` ```
struct Hi35xxAdcDevice { struct Hi35xxAdcDevice {
struct AdcDevice device; //【必要】是核心层控制对象,具体描述见下面。 struct AdcDevice device; //【必要】是核心层控制对象,具体描述见下面。
...@@ -223,14 +223,14 @@ ADC模块适配必选的三个环节是配置属性文件,实例化驱动入 ...@@ -223,14 +223,14 @@ ADC模块适配必选的三个环节是配置属性文件,实例化驱动入
HDF_STATUS相关状态(下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS定义)。 HDF_STATUS相关状态(下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS定义)。
| 状态(值) | 问题描述 | | 状态(值) | 问题描述 |
| -------- | -------- | | -------- | -------- |
| HDF_ERR_INVALID_OBJECT | 控制器对象非法 | | HDF_ERR_INVALID_OBJECT | 控制器对象非法 |
| HDF_ERR_INVALID_PARAM | 参数非法 | | HDF_ERR_INVALID_PARAM | 参数非法 |
| HDF_ERR_MALLOC_FAIL | 内存分配失败 | | HDF_ERR_MALLOC_FAIL | 内存分配失败 |
| HDF_ERR_IO | I/O错误 | | HDF_ERR_IO | I/O错误 |
| HDF_SUCCESS | 传输成功 | | HDF_SUCCESS | 传输成功 |
| HDF_FAILURE | 传输失败 | | HDF_FAILURE | 传输失败 |
函数说明: 函数说明:
......
...@@ -14,10 +14,10 @@ I2C(Inter Integrated Circuit)总线是由Philips公司开发的一种简单 ...@@ -14,10 +14,10 @@ I2C(Inter Integrated Circuit)总线是由Philips公司开发的一种简单
I2cMethod和I2cLockMethod定义: I2cMethod和I2cLockMethod定义:
``` ```
struct I2cMethod { struct I2cMethod {
int32_t (*transfer)(struct I2cCntlr *cntlr, struct I2cMsg *msgs, int16_t count); int32_t (*transfer)(struct I2cCntlr *cntlr, struct I2cMsg *msgs, int16_t count);
}; };
struct I2cLockMethod {// 锁机制操作结构体 struct I2cLockMethod {// 锁机制操作结构体
int32_t (*lock)(struct I2cCntlr *cntlr);// 加锁 int32_t (*lock)(struct I2cCntlr *cntlr);// 加锁
...@@ -27,9 +27,9 @@ struct I2cLockMethod {// 锁机制操作结构体 ...@@ -27,9 +27,9 @@ struct I2cLockMethod {// 锁机制操作结构体
**表1** I2cMethod结构体成员的回调函数功能说明 **表1** I2cMethod结构体成员的回调函数功能说明
| 函数成员 | 入参 | 出参 | 返回值 | 功能 | | 函数成员 | 入参 | 出参 | 返回值 | 功能 |
| -------- | -------- | -------- | -------- | -------- | | -------- | -------- | -------- | -------- | -------- |
| transfer | cntlr:结构体指针,核心层I2C控制器。<br>msgs:结构体指针,用户消息。<br>count:uint16_t,消息数量。 | 无 | HDF_STATUS相关状态 | 传递用户消息 | | transfer | cntlr:结构体指针,核心层I2C控制器。<br>msgs:结构体指针,用户消息。<br>count:uint16_t,消息数量。 | 无 | HDF_STATUS相关状态 | 传递用户消息 |
## 开发步骤 ## 开发步骤
...@@ -74,7 +74,7 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文 ...@@ -74,7 +74,7 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文
I2C管理器服务的驱动由核心层实现,厂商不需要关注这部分内容的实现,但在实现Init函数的时候需要调用核心层的I2cCntlrAdd函数,它会实现相应功能。 I2C管理器服务的驱动由核心层实现,厂商不需要关注这部分内容的实现,但在实现Init函数的时候需要调用核心层的I2cCntlrAdd函数,它会实现相应功能。
``` ```
struct HdfDriverEntry g_i2cDriverEntry = { struct HdfDriverEntry g_i2cDriverEntry = {
.moduleVersion = 1, .moduleVersion = 1,
...@@ -103,71 +103,71 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文 ...@@ -103,71 +103,71 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文
**表2** 统一服务模式的特点 **表2** 统一服务模式的特点
| 成员名 | 值 | | 成员名 | 值 |
| -------- | -------- | | -------- | -------- |
| moduleName | 固定为HDF_PLATFORM_I2C_MANAGER | | moduleName | 固定为HDF_PLATFORM_I2C_MANAGER |
| serviceName | 固定为HDF_PLATFORM_I2C_MANAGER | | serviceName | 固定为HDF_PLATFORM_I2C_MANAGER |
| policy | 具体配置为1或2取决于是否对用户态可见 | | policy | 具体配置为1或2取决于是否对用户态可见 |
| deviceMatchAttr | 没有使用,可忽略 | | deviceMatchAttr | 没有使用,可忽略 |
从第二个节点开始配置具体I2C控制器信息,此节点并不表示某一路I2C控制器,而是代表一个资源性质设备,用于描述一类I2C控制器的信息。多个控制器之间相互区分的参数是busID和reg_pbase,这在i2c_config文件中有所体现。 从第二个节点开始配置具体I2C控制器信息,此节点并不表示某一路I2C控制器,而是代表一个资源性质设备,用于描述一类I2C控制器的信息。多个控制器之间相互区分的参数是busID和reg_pbase,这在i2c_config文件中有所体现。
- device_info.hcs配置参考 - device_info.hcs配置参考
``` ```
root { root {
device_info { device_info {
match_attr = "hdf_manager"; match_attr = "hdf_manager";
device_i2c :: device { device_i2c :: device {
device0 :: deviceNode { device0 :: deviceNode {
policy = 2; policy = 2;
priority = 50; priority = 50;
permission = 0644; permission = 0644;
moduleName = "HDF_PLATFORM_I2C_MANAGER"; moduleName = "HDF_PLATFORM_I2C_MANAGER";
serviceName = "HDF_PLATFORM_I2C_MANAGER"; serviceName = "HDF_PLATFORM_I2C_MANAGER";
deviceMatchAttr = "hdf_platform_i2c_manager"; deviceMatchAttr = "hdf_platform_i2c_manager";
} }
device1 :: deviceNode { device1 :: deviceNode {
policy = 0; // 等于0,不需要发布服务。 policy = 0; // 等于0,不需要发布服务。
priority = 55; // 驱动启动优先级。 priority = 55; // 驱动启动优先级。
permission = 0644; // 驱动创建设备节点权限。 permission = 0644; // 驱动创建设备节点权限。
moduleName = "hi35xx_i2c_driver"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致。 moduleName = "hi35xx_i2c_driver"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致。
serviceName = "HI35XX_I2C_DRIVER"; //【必要】驱动对外发布服务的名称,必须唯一。 serviceName = "HI35XX_I2C_DRIVER"; //【必要】驱动对外发布服务的名称,必须唯一。
deviceMatchAttr = "hisilicon_hi35xx_i2c"; //【必要】用于配置控制器私有数据,要与i2c_config.hcs中对应控制器保持一致, deviceMatchAttr = "hisilicon_hi35xx_i2c"; //【必要】用于配置控制器私有数据,要与i2c_config.hcs中对应控制器保持一致,
// 具体的控制器信息在 i2c_config.hcs中。 // 具体的控制器信息在 i2c_config.hcs中。
} }
}
} }
} }
}
``` ```
- i2c_config.hcs 配置参考 - i2c_config.hcs 配置参考
``` ```
root { root {
platform { platform {
i2c_config { i2c_config {
match_attr = "hisilicon_hi35xx_i2c"; //【必要】需要和device_info.hcs中的deviceMatchAttr值一致 match_attr = "hisilicon_hi35xx_i2c"; //【必要】需要和device_info.hcs中的deviceMatchAttr值一致
template i2c_controller { // 模板公共参数,继承该模板的节点如果使用模板中的默认值,则节点字段可以缺省。 template i2c_controller { // 模板公共参数,继承该模板的节点如果使用模板中的默认值,则节点字段可以缺省。
bus = 0; //【必要】i2c识别号 bus = 0; //【必要】i2c识别号
reg_pbase = 0x120b0000; //【必要】物理基地址 reg_pbase = 0x120b0000; //【必要】物理基地址
reg_size = 0xd1; //【必要】寄存器位宽 reg_size = 0xd1; //【必要】寄存器位宽
irq = 0; //【可选】根据厂商需要来使用 irq = 0; //【可选】根据厂商需要来使用
freq = 400000; //【可选】根据厂商需要来使用 freq = 400000; //【可选】根据厂商需要来使用
clk = 50000000; //【可选】根据厂商需要来使用 clk = 50000000; //【可选】根据厂商需要来使用
}
controller_0x120b0000 :: i2c_controller {
bus = 0;
}
controller_0x120b1000 :: i2c_controller {
bus = 1;
reg_pbase = 0x120b1000;
}
...
}
} }
controller_0x120b0000 :: i2c_controller {
bus = 0;
}
controller_0x120b1000 :: i2c_controller {
bus = 1;
reg_pbase = 0x120b1000;
}
...
}
}
} }
``` ```
...@@ -177,7 +177,7 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文 ...@@ -177,7 +177,7 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文
从驱动的角度看,自定义结构体是参数和数据的载体,而且i2c_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,其中一些重要数值也会传递给核心层I2cCntlr对象,例如设备号、总线号等。 从驱动的角度看,自定义结构体是参数和数据的载体,而且i2c_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,其中一些重要数值也会传递给核心层I2cCntlr对象,例如设备号、总线号等。
``` ```
// 厂商自定义功能结构体 // 厂商自定义功能结构体
struct Hi35xxI2cCntlr { struct Hi35xxI2cCntlr {
...@@ -204,7 +204,7 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文 ...@@ -204,7 +204,7 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文
``` ```
- I2cCntlr成员回调函数结构体I2cMethod的实例化,和锁机制回调函数结构体I2cLockMethod实例化,其他成员在Init函数中初始化。 - I2cCntlr成员回调函数结构体I2cMethod的实例化,和锁机制回调函数结构体I2cLockMethod实例化,其他成员在Init函数中初始化。
``` ```
// i2c_hi35xx.c中的示例 // i2c_hi35xx.c中的示例
static const struct I2cMethod g_method = { static const struct I2cMethod g_method = {
...@@ -228,20 +228,20 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文 ...@@ -228,20 +228,20 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文
**表3** Init函数入参及返回值参考 **表3** Init函数入参及返回值参考
| 状态(值) | 问题描述 | | 状态(值) | 问题描述 |
| -------- | -------- | | -------- | -------- |
| HDF_ERR_INVALID_OBJECT | 控制器对象非法 | | HDF_ERR_INVALID_OBJECT | 控制器对象非法 |
| HDF_ERR_INVALID_PARAM | 参数非法 | | HDF_ERR_INVALID_PARAM | 参数非法 |
| HDF_ERR_MALLOC_FAIL | 内存分配失败 | | HDF_ERR_MALLOC_FAIL | 内存分配失败 |
| HDF_ERR_IO | I/O&nbsp;错误 | | HDF_ERR_IO | I/O&nbsp;错误 |
| HDF_SUCCESS | 传输成功 | | HDF_SUCCESS | 传输成功 |
| HDF_FAILURE | 传输失败 | | HDF_FAILURE | 传输失败 |
函数说明: 函数说明:
初始化自定义结构体对象,初始化I2cCntlr成员,调用核心层I2cCntlrAdd函数,接入VFS(可选)。 初始化自定义结构体对象,初始化I2cCntlr成员,调用核心层I2cCntlrAdd函数,接入VFS(可选)。
``` ```
static int32_t Hi35xxI2cInit(struct HdfDeviceObject *device) static int32_t Hi35xxI2cInit(struct HdfDeviceObject *device)
{ {
...@@ -301,7 +301,7 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文 ...@@ -301,7 +301,7 @@ I2C模块适配的三个必选环节是实例化驱动入口,配置属性文
释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给Release接口,当HDF框架调用Init函数初始化驱动失败时,可以调用Release释放驱动资源。 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给Release接口,当HDF框架调用Init函数初始化驱动失败时,可以调用Release释放驱动资源。
``` ```
static void Hi35xxI2cRelease(struct HdfDeviceObject *device) static void Hi35xxI2cRelease(struct HdfDeviceObject *device)
{ {
......
...@@ -14,7 +14,7 @@ DSI(Display Serial Interface)是由移动行业处理器接口联盟(Mobil ...@@ -14,7 +14,7 @@ DSI(Display Serial Interface)是由移动行业处理器接口联盟(Mobil
MipiDsiCntlrMethod定义: MipiDsiCntlrMethod定义:
``` ```
struct MipiDsiCntlrMethod { // 核心层结构体的成员函数 struct MipiDsiCntlrMethod { // 核心层结构体的成员函数
int32_t (*setCntlrCfg)(struct MipiDsiCntlr *cntlr); int32_t (*setCntlrCfg)(struct MipiDsiCntlr *cntlr);
...@@ -31,13 +31,13 @@ struct MipiDsiCntlrMethod { // 核心层结构体的成员函数 ...@@ -31,13 +31,13 @@ struct MipiDsiCntlrMethod { // 核心层结构体的成员函数
**表1** MipiDsiCntlrMethod成员的回调函数功能说明 **表1** MipiDsiCntlrMethod成员的回调函数功能说明
| 成员函数 | 入参 | 出参 | 返回状态 | 功能 | | 成员函数 | 入参 | 出参 | 返回状态 | 功能 |
| -------- | -------- | -------- | -------- | -------- | | -------- | -------- | -------- | -------- | -------- |
| setCntlrCfg | cntlr:结构体指针,MipiDsi控制器 | 无 | HDF_STATUS相关状态 | 设置控制器参数 | | setCntlrCfg | cntlr:结构体指针,MipiDsi控制器 | 无 | HDF_STATUS相关状态 | 设置控制器参数 |
| setCmd | cntlr:结构体指针,MipiDsi控制器<br>cmd:结构体指针,指令传入值 | 无 | HDF_STATUS相关状态 | 向显示设备发送指令 | | setCmd | cntlr:结构体指针,MipiDsi控制器<br>cmd:结构体指针,指令传入值 | 无 | HDF_STATUS相关状态 | 向显示设备发送指令 |
| getCmd | cntlr:结构体指针,MipiDsi控制器<br>cmd:传入的命令描述结构体指针<br>readLen:读取的数据大小 | out:结构体指针,用于存储读取的数据 | HDF_STATUS相关状态 | 通过发送指令读取数据 | | getCmd | cntlr:结构体指针,MipiDsi控制器<br>cmd:传入的命令描述结构体指针<br>readLen:读取的数据大小 | out:结构体指针,用于存储读取的数据 | HDF_STATUS相关状态 | 通过发送指令读取数据 |
| toHs | cntlr:结构体指针,MipiDsi控制器 | 无 | HDF_STATUS相关状态 | 设置为高速模式 | | toHs | cntlr:结构体指针,MipiDsi控制器 | 无 | HDF_STATUS相关状态 | 设置为高速模式 |
| toLp | cntlr:结构体指针,MipiDsi控制器 | 无 | HDF_STATUS相关状态 | 设置为低电模式 | | toLp | cntlr:结构体指针,MipiDsi控制器 | 无 | HDF_STATUS相关状态 | 设置为低电模式 |
## 开发步骤 ## 开发步骤
...@@ -74,25 +74,25 @@ MIPI DSI模块适配的三个必选环节是配置属性文件,实例化驱动 ...@@ -74,25 +74,25 @@ MIPI DSI模块适配的三个必选环节是配置属性文件,实例化驱动
但本例中MIPI控制器无需配置额外属性,如有厂商需要,则需要在device_info文件的deviceNode增加deviceMatchAttr信息,以及增加mipidsi_config文件。 但本例中MIPI控制器无需配置额外属性,如有厂商需要,则需要在device_info文件的deviceNode增加deviceMatchAttr信息,以及增加mipidsi_config文件。
device_info.hcs 配置参考: device_info.hcs 配置参考:
``` ```
root { root {
device_info { device_info {
match_attr = "hdf_manager"; match_attr = "hdf_manager";
platform :: host { platform :: host {
hostName = "platform_host"; hostName = "platform_host";
priority = 50; priority = 50;
device_mipi_dsi:: device { device_mipi_dsi:: device {
device0 :: deviceNode { device0 :: deviceNode {
policy = 0; policy = 0;
priority = 150; priority = 150;
permission = 0644; permission = 0644;
moduleName = "HDF_MIPI_TX"; // 【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致。 moduleName = "HDF_MIPI_TX"; // 【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致。
serviceName = "HDF_MIPI_TX"; // 【必要且唯一】驱动对外发布服务的名称。 serviceName = "HDF_MIPI_TX"; // 【必要且唯一】驱动对外发布服务的名称。
}
}
} }
} }
}
}
} }
``` ```
...@@ -120,33 +120,33 @@ MIPI DSI模块适配的三个必选环节是配置属性文件,实例化驱动 ...@@ -120,33 +120,33 @@ MIPI DSI模块适配的三个必选环节是配置属性文件,实例化驱动
从驱动的角度看,自定义结构体是参数和数据的载体,一般来说,config文件中的数值也会用来初始化结构体成员,但本例的mipidsi无器件属性文件,故基本成员结构与MipiDsiCntlr无太大差异。 从驱动的角度看,自定义结构体是参数和数据的载体,一般来说,config文件中的数值也会用来初始化结构体成员,但本例的mipidsi无器件属性文件,故基本成员结构与MipiDsiCntlr无太大差异。
``` ```
typedef struct { typedef struct {
unsigned int devno; // 设备号 unsigned int devno; // 设备号
short laneId[LANE_MAX_NUM]; // lane号 short laneId[LANE_MAX_NUM]; // lane号
OutPutModeTag outputMode; // 输出模式选择:刷新模式,命令行模式或视频流模式 OutPutModeTag outputMode; // 输出模式选择:刷新模式,命令行模式或视频流模式
VideoModeTag videoMode; // 显示设备的同步模式 VideoModeTag videoMode; // 显示设备的同步模式
OutputFormatTag outputFormat; // 输出DSI图像数据格式:RGB或YUV OutputFormatTag outputFormat; // 输出DSI图像数据格式:RGB或YUV
SyncInfoTag syncInfo; // 时序相关的设置 SyncInfoTag syncInfo; // 时序相关的设置
unsigned int phyDataRate; // 数据速率,单位Mbps unsigned int phyDataRate; // 数据速率,单位Mbps
unsigned int pixelClk; // 时钟,单位KHz unsigned int pixelClk; // 时钟,单位KHz
} ComboDevCfgTag; } ComboDevCfgTag;
// MipiDsiCntlr是核心层控制器结构体,其中的成员在Init函数中会被赋值。 // MipiDsiCntlr是核心层控制器结构体,其中的成员在Init函数中会被赋值。
struct MipiDsiCntlr { struct MipiDsiCntlr {
struct IDeviceIoService service; struct IDeviceIoService service;
struct HdfDeviceObject *device; struct HdfDeviceObject *device;
unsigned int devNo; // 设备号 unsigned int devNo; // 设备号
struct MipiCfg cfg; struct MipiCfg cfg;
struct MipiDsiCntlrMethod *ops; struct MipiDsiCntlrMethod *ops;
struct OsalMutex lock; struct OsalMutex lock;
void *priv; void *priv;
}; };
``` ```
- MipiDsiCntlr成员回调函数结构体MipiDsiCntlrMethod的实例化,其他成员在Init函数中初始化。 - MipiDsiCntlr成员回调函数结构体MipiDsiCntlrMethod的实例化,其他成员在Init函数中初始化。
``` ```
static struct MipiDsiCntlrMethod g_method = { static struct MipiDsiCntlrMethod g_method = {
.setCntlrCfg = Hi35xxSetCntlrCfg, .setCntlrCfg = Hi35xxSetCntlrCfg,
...@@ -167,20 +167,20 @@ MIPI DSI模块适配的三个必选环节是配置属性文件,实例化驱动 ...@@ -167,20 +167,20 @@ MIPI DSI模块适配的三个必选环节是配置属性文件,实例化驱动
HDF_STATUS相关状态(下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS定义)。 HDF_STATUS相关状态(下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS定义)。
| 状态(值) | 问题描述 | | 状态(值) | 问题描述 |
| -------- | -------- | | -------- | -------- |
| HDF_ERR_INVALID_OBJECT | 无效对象 | | HDF_ERR_INVALID_OBJECT | 无效对象 |
| HDF_ERR_MALLOC_FAIL | 内存分配失败 | | HDF_ERR_MALLOC_FAIL | 内存分配失败 |
| HDF_ERR_INVALID_PARAM | 无效参数 | | HDF_ERR_INVALID_PARAM | 无效参数 |
| HDF_ERR_IO | I/O&nbsp;错误 | | HDF_ERR_IO | I/O&nbsp;错误 |
| HDF_SUCCESS | 执行成功 | | HDF_SUCCESS | 执行成功 |
| HDF_FAILURE | 执行失败 | | HDF_FAILURE | 执行失败 |
函数说明: 函数说明:
MipiDsiCntlrMethod的实例化对象的挂载,调用MipiDsiRegisterCntlr,以及其他厂商自定义初始化操作。 MipiDsiCntlrMethod的实例化对象的挂载,调用MipiDsiRegisterCntlr,以及其他厂商自定义初始化操作。
``` ```
static int32_t Hi35xxMipiTxInit(struct HdfDeviceObject *device) static int32_t Hi35xxMipiTxInit(struct HdfDeviceObject *device)
{ {
...@@ -232,7 +232,7 @@ MIPI DSI模块适配的三个必选环节是配置属性文件,实例化驱动 ...@@ -232,7 +232,7 @@ MIPI DSI模块适配的三个必选环节是配置属性文件,实例化驱动
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**<br> > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**<br>
> 所有强制转换获取相应对象的操作前提是在Init函数中具备对应赋值的操作。 > 所有强制转换获取相应对象的操作前提是在Init函数中具备对应赋值的操作。
``` ```
static void Hi35xxMipiTxRelease(struct HdfDeviceObject *device) static void Hi35xxMipiTxRelease(struct HdfDeviceObject *device)
{ {
......
# 平台驱动使用
- **[GPIO](driver-platform-gpio-des.md)**
- **[I2C](driver-platform-i2c-des.md)**
- **[RTC](driver-platform-rtc-des.md)**
- **[SDIO](driver-platform-sdio-des.md)**
- **[SPI](driver-platform-spi-des.md)**
- **[UART](driver-platform-uart-des.md)**
- **[Watchdog](driver-platform-watchdog-des.md)**
- **[MIPI DSI](driver-platform-mipidsi-des.md)**
- **[PWM](driver-platform-pwm-des.md)**
\ No newline at end of file
# 驱动
- **[HDF驱动框架](driver-hdf.md)**
- **[平台驱动开发](driver-develop.md)**
- **[平台驱动使用](driver-platform.md)**
- **[外设驱动使用](driver-peripherals.md)**
\ No newline at end of file
# 获取工具<a name="ZH-CN_TOPIC_0000001111199422"></a>
- **[Docker编译环境](gettools-acquire.md)**
- **[IDE](gettools-ide.md)**
# 获取源码<a name="ZH-CN_TOPIC_0000001157319407"></a>
- **[源码获取](sourcecode-acquire.md)**
# 设备开发指南 # 设备开发指南
- [轻量和小型系统设备](device-lite.md) - 轻量和小型系统设备
- [WLAN连接类产品](device-wlan.md) - WLAN连接类产品
- [LED外设控制](device-wlan-led-control.md) - [LED外设控制](device-wlan-led-control.md)
- [集成三方SDK](device-wlan-sdk.md) - [集成三方SDK](device-wlan-sdk.md)
- [无屏摄像头类产品](device-iotcamera.md) - 无屏摄像头类产品
- [摄像头控制](device-iotcamera-control.md) - 摄像头控制
- [概述](device-iotcamera-control-overview.md) - [概述](device-iotcamera-control-overview.md)
- [示例开发](device-iotcamera-control-demo.md) - 示例开发
- [拍照开发指导](device-iotcamera-control-demo-photodevguide.md) - [拍照开发指导](device-iotcamera-control-demo-photodevguide.md)
- [录像开发指导](device-iotcamera-control-demo-videodevguide.md) - [录像开发指导](device-iotcamera-control-demo-videodevguide.md)
- [应用实例](device-iotcamera-control-example.md) - [应用实例](device-iotcamera-control-example.md)
- [带屏摄像头类产品](device-camera.md) - 带屏摄像头类产品
- [屏幕和摄像头控制](device-camera-control.md) - 屏幕和摄像头控制
- [概述](device-camera-control-overview.md) - [概述](device-camera-control-overview.md)
- [示例开发](device-camera-control-demo.md) - 示例开发
- [拍照开发指导](device-camera-control-demo-photoguide.md) - [拍照开发指导](device-camera-control-demo-photoguide.md)
- [录像开发指导](device-camera-control-demo-videoguide.md) - [录像开发指导](device-camera-control-demo-videoguide.md)
- [预览开发指导](device-camera-control-demo-previewguide.md) - [预览开发指导](device-camera-control-demo-previewguide.md)
- [应用实例](device-camera-control-example.md) - [应用实例](device-camera-control-example.md)
- [视觉应用开发](device-camera-visual.md) - 视觉应用开发
- [概述](device-camera-visual-overview.md) - [概述](device-camera-visual-overview.md)
- [开发准备](device-camera-visual-prepare.md) - [开发准备](device-camera-visual-prepare.md)
- [添加页面](device-camera-visual-addpage.md) - [添加页面](device-camera-visual-addpage.md)
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
- [调试打包](device-camera-visual-debug.md) - [调试打包](device-camera-visual-debug.md)
- [真机运行](device-camera-visual-run.md) - [真机运行](device-camera-visual-run.md)
- [常见问题](device-camera-visual-faqs.md) - [常见问题](device-camera-visual-faqs.md)
- [标准系统设备](device-standard.md) - 标准系统设备
- [时钟应用开发指导](device-clock-guide.md) - [时钟应用开发指导](device-clock-guide.md)
- [平台驱动开发示例](device-driver-demo.md) - [平台驱动开发示例](device-driver-demo.md)
- [外设驱动开发示例](device-outerdriver-demo.md) - [外设驱动开发示例](device-outerdriver-demo.md)
\ No newline at end of file
# 示例开发<a name="ZH-CN_TOPIC_0000001054903130"></a>
- **[拍照开发指导](device-camera-control-demo-photoguide.md)**
- **[录像开发指导](device-camera-control-demo-videoguide.md)**
- **[预览开发指导](device-camera-control-demo-previewguide.md)**
# 屏幕和摄像头控制<a name="ZH-CN_TOPIC_0000001111199426"></a>
- **[概述](device-camera-control-overview.md)**
- **[示例开发](device-camera-control-demo.md)**
- **[应用实例](device-camera-control-example.md)**
# 视觉应用开发<a name="ZH-CN_TOPIC_0000001111199420"></a>
- **[概述](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)**
# 带屏摄像头类产品<a name="ZH-CN_TOPIC_0000001111199430"></a>
- **[屏幕和摄像头控制](device-camera-control.md)**
- **[视觉应用开发](device-camera-visual.md)**
...@@ -425,21 +425,23 @@ HDF_INIT(g_sampleI2cDriverEntry); ...@@ -425,21 +425,23 @@ HDF_INIT(g_sampleI2cDriverEntry);
## 编译及烧录<a name="section164824754712"></a> ## 编译及烧录<a name="section164824754712"></a>
1. 编辑Makefile,添加源文件: 1. 编辑Makefile,添加源文件:
``` ```
include drivers/hdf/khdf/platform/platform.mk include drivers/hdf/khdf/platform/platform.mk
obj-y += $(HDF_PLATFORM_FRAMEWORKS_ROOT)/src/i2c_core.o \ obj-y += $(HDF_PLATFORM_FRAMEWORKS_ROOT)/src/i2c_core.o \
$(HDF_PLATFORM_FRAMEWORKS_ROOT)/src/i2c_if.o \ $(HDF_PLATFORM_FRAMEWORKS_ROOT)/src/i2c_if.o \
./i2c_adapter.o \ ./i2c_adapter.o \
./i2c_sample.o ./i2c_sample.o
``` ```
"./i2c\_sample.o"为本示例中在Makefile中追加的内容。
"./i2c\_sample.o"为本示例中在Makefile中追加的内容 2. 编译及烧录
2. 编译及烧录 - 安装包方式具体操作请参考标准系统快速入门[编译](../quick-start/quickstart-ide-standard-running-hi3516-build.md)[烧录](../quick-start/quickstart-ide-standard-running-hi3516-burning.md)
具体操作请参考[标准系统快速入门编译及烧录章节](../quick-start/quickstart-standard.md)。 - IDE方式具体操作请参考标准系统快速入门[编译](../quick-start/quickstart-standard-running-hi3516-build.md)[烧录](../quick-start/quickstart-standard-running-hi3516-burning.md)
# 示例开发<a name="ZH-CN_TOPIC_0000001055086133"></a>
- **[拍照开发指导](device-iotcamera-control-demo-photodevguide.md)**
- **[录像开发指导](device-iotcamera-control-demo-videodevguide.md)**
# 摄像头控制<a name="ZH-CN_TOPIC_0000001157319429"></a>
- **[概述](device-iotcamera-control-overview.md)**
- **[示例开发](device-iotcamera-control-demo.md)**
- **[应用实例](device-iotcamera-control-example.md)**
# 无屏摄像头类产品<a name="ZH-CN_TOPIC_0000001157319403"></a>
- **[摄像头控制](device-iotcamera-control.md)**
# 轻量和小型系统设备<a name="ZH-CN_TOPIC_0000001135844126"></a>
- **[WLAN连接类产品](device-wlan.md)**
- **[无屏摄像头类产品](device-iotcamera.md)**
- **[带屏摄像头类产品](device-camera.md)**
# 标准系统设备<a name="ZH-CN_TOPIC_0000001135684346"></a>
- **[时钟应用开发指导](device-clock-guide.md)**
- **[平台驱动开发示例](device-driver-demo.md)**
- **[外设驱动开发示例](device-outerdriver-demo.md)**
# LED外设控制<a name="ZH-CN_TOPIC_0000001157319393"></a>
- **[LED外设控制](device-wlan-led-control.md)**
# WLAN连接类产品<a name="ZH-CN_TOPIC_0000001157479363"></a>
- **[LED外设控制](device-wlan-led.md)**
- **[集成三方SDK](device-wlan-sdk.md)**
# 设备<a name="ZH-CN_TOPIC_0000001182003649"></a>
- **[轻量和小型系统设备](device-lite.md)**
- **[标准系统设备](device-standard.md)**
...@@ -61,7 +61,6 @@ ...@@ -61,7 +61,6 @@
- [虚拟动态共享库](kernel-small-bundles-share.md) - [虚拟动态共享库](kernel-small-bundles-share.md)
- [轻量级进程间通信](kernel-small-bundles-ipc.md) - [轻量级进程间通信](kernel-small-bundles-ipc.md)
- 文件系统 - 文件系统
- [文件系统概述](kernel-small-bundles-fs.md)
- [虚拟文件系统](kernel-small-bundles-fs-virtual.md) - [虚拟文件系统](kernel-small-bundles-fs-virtual.md)
- [支持的文件系统](kernel-small-bundles-fs-support.md) - [支持的文件系统](kernel-small-bundles-fs-support.md)
- [适配新的文件系统](kernel-small-bundles-fs-new.md) - [适配新的文件系统](kernel-small-bundles-fs-new.md)
......
# 附录
- **[内核编码规范](kernel-mini-appx-code.md)**
- **[基本数据结构](kernel-mini-appx-data-list.md)**
- **[标准库支持](kernel-mini-appx-lib.md)**
\ No newline at end of file
# 基本数据结构
- **[双向链表](kernel-mini-appx-data-list.md)**
\ No newline at end of file
# CMSIS支持
## 基本概念
[CMSIS](https://developer.arm.com/tools-and-software/embedded/cmsis)是Cortex Microcontroller Software Interface Standard(Cortex微控制器软件接口标准)的缩写,是对于那些基于ARM Cortex处理器的微控制器独立于供应商的硬件抽象层。它包含多个组件层,其中之一是RTOS层,该层定义了一套通用及标准化的RTOS API接口,减少了应用开发者对特定RTOS的依赖,方便用户软件的移植重用。该套API有2个版本,分别为版本1(CMSIS-RTOS v1)和版本2(CMSIS-RTOS v2),OpenHarmony LiteOS-M仅提供其版本2的实现。
## 开发指导
### 接口说明
CMSIS-RTOS v2提供下面几种功能,接口详细信息可以查看API参考。
**表1** 内核信息与控制
| 接口名 | 接口描述 |
| -------- | -------- |
| osKernelGetInfo | 获取RTOS内核信息。 |
| osKernelGetState | 获取当前的RTOS内核状态。 |
| osKernelGetSysTimerCount | 获取RTOS内核系统计时器计数。 |
| osKernelGetSysTimerFreq | 获取RTOS内核系统计时器频率。 |
| osKernelInitialize | 初始化RTOS内核。 |
| osKernelLock | 锁定RTOS内核调度程序。 |
| osKernelUnlock | 解锁RTOS内核调度程序。 |
| osKernelRestoreLock | 恢复RTOS内核调度程序锁定状态。 |
| osKernelResume | 恢复RTOS内核调度程序。(暂未实现) |
| osKernelStart | 启动RTOS内核调度程序。 |
| osKernelSuspend | 挂起RTOS内核调度程序。(暂未实现) |
| osKernelGetTickCount | 获取RTOS内核滴答计数。 |
| osKernelGetTickFreq | 获取RTOS内核滴答频率。 |
**表2** 线程管理
| 接口名 | 接口描述 |
| -------- | -------- |
| osThreadDetach | 分离线程(线程终止时可以回收线程存储)。(暂未实现) |
| osThreadEnumerate | 枚举活动线程。(暂未实现) |
| osThreadExit | 终止当前正在运行的线程的执行。 |
| osThreadGetCount | 获取活动线程的数量。 |
| osThreadGetId | 返回当前正在运行的线程的线程ID。 |
| osThreadGetName | 获取线程的名称。 |
| osThreadGetPriority | 获取线程的当前优先级。 |
| osThreadGetStackSize | 获取线程的堆栈大小。 |
| osThreadGetStackSpace | 根据执行期间的堆栈水印记录获取线程的可用堆栈空间。 |
| osThreadGetState | 获取线程的当前线程状态。 |
| osThreadJoin | 等待指定线程终止。(暂未实现) |
| osThreadNew | 创建一个线程并将其添加到活动线程中。 |
| osThreadResume | 恢复线程的执行。 |
| osThreadSetPriority | 更改线程的优先级。 |
| osThreadSuspend | 暂停执行线程。 |
| osThreadTerminate | 终止线程的执行。 |
| osThreadYield | 将控制权传递给处于就绪状态的下一个线程。 |
**表3** 线程标志
| 接口名 | 接口描述 |
| -------- | -------- |
| osThreadFlagsSet | 设置线程的指定线程标志。(暂未实现) |
| osThreadFlagsClear | 清除当前正在运行的线程的指定线程标志。(暂未实现) |
| osThreadFlagsGet | 获取当前正在运行的线程的当前线程标志。(暂未实现) |
| osThreadFlagsWait | 等待当前正在运行的线程的一个或多个线程标志发出信号。(暂未实现) |
**表4** 事件标志
| 接口名 | 接口描述 |
| -------- | -------- |
| osEventFlagsGetName | 获取事件标志对象的名称。(暂未实现) |
| osEventFlagsNew | 创建并初始化事件标志对象。 |
| osEventFlagsDelete | 删除事件标志对象。 |
| osEventFlagsSet | 设置指定的事件标志。 |
| osEventFlagsClear | 清除指定的事件标志。 |
| osEventFlagsGet | 获取当前事件标志。 |
| osEventFlagsWait | 等待一个或多个事件标志被发出信号。 |
**表5** 通用等待函数
| 接口名 | 接口描述 |
| -------- | -------- |
| osDelay | 等待超时(时间延迟)。 |
| osDelayUntil | 等到指定时间。 |
**表6** 计时器管理
| 接口名 | 接口描述 |
| -------- | -------- |
| osTimerDelete | 删除计时器。 |
| osTimerGetName | 获取计时器的名称。(暂未实现) |
| osTimerIsRunning | 检查计时器是否正在运行。 |
| osTimerNew | 创建和初始化计时器。 |
| osTimerStart | 启动或重新启动计时器。 |
| osTimerStop | 停止计时器。 |
**表7** 互斥管理
| 接口名 | 接口描述 |
| -------- | -------- |
| osMutexAcquire | 获取互斥或超时(如果已锁定)。 |
| osMutexDelete | 删除互斥对象。 |
| osMutexGetName | 获取互斥对象的名称。(暂未实现) |
| osMutexGetOwner | 获取拥有互斥对象的线程。 |
| osMutexNew | 创建并初始化Mutex对象。 |
| osMutexRelease | 释放由osMutexAcquire获取的Mutex。 |
**表8** 信号量
| 接口名 | 接口描述 |
| -------- | -------- |
| osSemaphoreAcquire | 获取信号量令牌或超时(如果没有可用的令牌)。 |
| osSemaphoreDelete | 删除一个信号量对象。 |
| osSemaphoreGetCount | 获取当前信号量令牌计数。 |
| osSemaphoreGetName | 获取信号量对象的名称。(暂未实现) |
| osSemaphoreNew | 创建并初始化一个信号量对象。 |
| osSemaphoreRelease | 释放信号量令牌,直到初始最大计数。 |
**表9** 内存池
| 接口名 | 接口描述 |
| -------- | -------- |
| osMemoryPoolAlloc | 从内存池分配一个内存块。 |
| osMemoryPoolDelete | 删除内存池对象。 |
| osMemoryPoolFree | 将分配的内存块返回到内存池。 |
| osMemoryPoolGetBlockSize | 获取内存池中的内存块大小。 |
| osMemoryPoolGetCapacity | 获取内存池中最大的内存块数。 |
| osMemoryPoolGetCount | 获取内存池中使用的内存块数。 |
| osMemoryPoolGetName | 获取内存池对象的名称。 |
| osMemoryPoolGetSpace | 获取内存池中可用的内存块数。 |
| osMemoryPoolNew | 创建并初始化一个内存池对象。 |
**表10** 消息队列
| 接口名 | 接口描述 |
| -------- | -------- |
| osMessageQueueDelete | 删除消息队列对象。 |
| osMessageQueueGet | 从队列获取消息,或者如果队列为空,则从超时获取消息。 |
| osMessageQueueGetCapacity | 获取消息队列中的最大消息数。 |
| osMessageQueueGetCount | 获取消息队列中排队的消息数。 |
| osMessageQueueGetMsgSize | 获取内存池中的最大消息大小。 |
| osMessageQueueGetName | 获取消息队列对象的名称。(暂未实现) |
| osMessageQueueGetSpace | 获取消息队列中消息的可用插槽数。 |
| osMessageQueueNew | 创建和初始化消息队列对象。 |
| osMessageQueuePut | 如果队列已满,则将消息放入队列或超时。 |
| osMessageQueueReset | 将消息队列重置为初始空状态。(暂未实现) |
### 开发流程
CMSIS-RTOS2组件可以作为库或源代码提供(下图显示了库)。通过添加CMSIS-RTOS2组件(通常是一些配置文件),可以将基于CMSIS的应用程序扩展为具有RTOS功能。只需包含cmsis_os2.h头文件就可以访问RTOS API函数,这使用户应用程序能够处理RTOS内核相关事件,而在更换内核时无需重新编译源代码。
静态对象分配需要访问RTOS对象控制块定义。特定于实现的头文件(下图中的os_xx .h)提供对此类控制块定义的访问。对于OpenHarmony LiteOS-M内核,由文件名以los_开头的头文件提供,这些文件包含OpenHarmony LiteOS-M内核的这些定义。
![zh-cn_image_0000001153834574](figures/zh-cn_image_0000001153834574.png)
### 编程实例
```
#include ...
#include "cmsis_os2.h"
/*----------------------------------------------------------------------------
* 应用程序主线程
*---------------------------------------------------------------------------*/
void app_main (void *argument) {
// ...
for (;;) {}
}
int main (void) {
// 系统初始化
MySystemInit();
// ...
osKernelInitialize(); // 初始化CMSIS-RTOS
osThreadNew(app_main, NULL, NULL); // 创建应用程序主线程
osKernelStart(); // 开始执行线程
for (;;) {}
}
```
# POSIX支持
## 基本概念
OpenHarmony内核使用**musl libc**库以及自研接口,支持部分标准POSIX接口,开发者可基于POSIX标准接口开发内核之上的组件及应用。
## 开发指导
### 接口说明
**表1** process
| 需要包含的头文件 | 接口名 | 描述 |
| -------- | -------- | -------- |
| \#include&nbsp;&lt;stdlib.h&gt; | void&nbsp;abort(void); | 中止线程执行 |
| \#include&nbsp;&lt;assert.h&gt; | void&nbsp;assert(scalar&nbsp;expression); | 断言为假终止线程 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_cond_destroy(pthread_cond_t&nbsp;\*cond); | 销毁条件变量 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_cond_init(pthread_cond_t&nbsp;\*restrict&nbsp;co<br/>nd,&nbsp;const&nbsp;pthread_condattr_t&nbsp;\*restrict&nbsp;attr); | 初始化条件变量 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_cond_timedwait(pthread_cond_t&nbsp;\*restr<br/>ict&nbsp;cond,&nbsp;pthread_mutex_t&nbsp;\*restrict&nbsp;mutex,&nbsp;const&nbsp;st<br/>ruct&nbsp;timespec&nbsp;\*restrict&nbsp;abstime); | 等待条件 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_condattr_init(pthread_condattr_t&nbsp;\*attr); | 初始化条件变量属性对象 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_mutex_unlock(pthread_mutex_t&nbsp;\*mutex); | 解锁互斥锁 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_create(pthread_t&nbsp;\*thread,&nbsp;const&nbsp;pthread_<br/>attr_t&nbsp;\*attr,&nbsp;void&nbsp;\*(\*start_routine)(void&nbsp;\*),&nbsp;void&nbsp;\*arg); | 创建一个新的线程 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_join(pthread_t&nbsp;thread,&nbsp;void&nbsp;\*\*retval); | 等待指定的线程结束 |
| \#include&nbsp;&lt;pthread.h&gt; | pthread_t&nbsp;pthread_self(void); | 获取当前线程的ID |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_getschedparam(pthread_t&nbsp;thread,&nbsp;int&nbsp;\*<br/>policy,&nbsp;struct&nbsp;sched_param&nbsp;\*param); | 获取线程的调度策略和参数 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_setschedparam(pthread_t&nbsp;thread,&nbsp;int<br/>policy,&nbsp;const&nbsp;struct&nbsp;sched_param&nbsp;\*param); | 设置线程的调度策略和参数 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_mutex_init(pthread_mutex_t&nbsp;\*__restrict&nbsp;m<br/>,&nbsp;const&nbsp;pthread_mutexattr_t&nbsp;\*__restrict&nbsp;a); | 初始化互斥锁 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_mutex_lock(pthread_mutex_t&nbsp;\*m); | 互斥锁加锁操作 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_mutex_trylock(pthread_mutex_t&nbsp;\*m); | 互斥锁尝试加锁操作 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_mutex_destroy(pthread_mutex_t&nbsp;\*m); | 销毁互斥锁 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_attr_init(pthread_attr_t&nbsp;\*attr); | 初始化线程属性对象 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_attr_destroy(pthread_attr_t&nbsp;\*attr); | 销毁线程属性对象 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_attr_getstacksize(const&nbsp;pthread_attr<br/>_t&nbsp;\*attr,&nbsp;size_t&nbsp;\*stacksize); | 获取线程属性对象的堆栈大小 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_attr_setstacksize(pthread_attr_t&nbsp;\*attr<br/>,&nbsp;size_t&nbsp;stacksize); | 设置线程属性对象的堆栈大小 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_attr_getschedparam(const&nbsp;pthread_<br/>attr_t&nbsp;\*attr,&nbsp;struct&nbsp;sched_param&nbsp;\*param); | 获取线程属性对象的调度参数属性 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_attr_setschedparam(pthread_attr_t&nbsp;\*<br/>attr,&nbsp;const&nbsp;struct&nbsp;sched_param&nbsp;\*param); | 设置线程属性对象的调度参数属性 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_getname_np(pthread_t&nbsp;pthread,&nbsp;char<br/>\*name,&nbsp;size_t&nbsp;len); | 获取线程名称 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_setname_np(pthread_t&nbsp;pthread,&nbsp;const<br/>char&nbsp;\*name); | 设置线程名称 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_cond_broadcast(pthread_cond_t&nbsp;\*c); | 解除若干已被等待条件阻塞的线程 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_cond_signal(pthread_cond_t&nbsp;\*c); | 解除被阻塞的线程 |
| \#include&nbsp;&lt;pthread.h&gt; | int&nbsp;pthread_cond_wait(pthread_cond_t&nbsp;\*__restrict<br/>c,&nbsp;pthread_mutex_t&nbsp;\*__restrict&nbsp;m); | 等待条件 |
**表2** fs
| 需要包含的头文件 | 接口名 | 描述 |
| -------- | -------- | -------- |
| \#include&nbsp;&lt;libgen.h&gt; | char&nbsp;\*dirname(char&nbsp;\*path); | 获取目录名 |
| \#include&nbsp;&lt;dirent.h&gt; | struct&nbsp;dirent&nbsp;\*readdir(DIR&nbsp;\*dirp); | 读目录 |
| \#include&nbsp;&lt;sys/stat.h&gt; | int&nbsp;stat(const&nbsp;char&nbsp;\*restrict&nbsp;path,&nbsp;struct&nbsp;stat&nbsp;\*restrict&nbsp;buf); | 获取文件信息 |
| \#include&nbsp;&lt;unistd.h&gt; | int&nbsp;unlink(const&nbsp;char&nbsp;\*pathname); | 删除文件 |
| \#include&nbsp;&lt;fcntl.h | int&nbsp;open(const&nbsp;char&nbsp;\*path,&nbsp;int&nbsp;oflags,&nbsp;...); | 用于打开文件,如文件不存在,创建文件并打开 |
| \#include&nbsp;&lt;nistd.h&gt; | int&nbsp;close(int&nbsp;fd); | 关闭文件 |
| \#include&nbsp;&lt;stdio.h&gt; | int&nbsp;rename(const&nbsp;char&nbsp;\*oldpath,&nbsp;const&nbsp;char&nbsp;\*newpath); | 重命名指定的文件 |
| \#include&nbsp;&lt;dirent.h&gt; | DIR&nbsp;&nbsp;\*opendir(const&nbsp;char&nbsp;\*dirname); | 打开指定目录 |
| \#include&nbsp;&lt;dirent.h&gt; | int&nbsp;closedir(DIR&nbsp;\*dir); | 关闭指定目录 |
| \#include&nbsp;&lt;sys/mount.h&gt; | int&nbsp;mount(const&nbsp;char&nbsp;\*source,&nbsp;const&nbsp;char&nbsp;\*target,&nbsp;con<br/>st&nbsp;char&nbsp;\*filesystemtype,&nbsp;unsigned&nbsp;long&nbsp;mountflags,&nbsp;c<br/>onst&nbsp;void&nbsp;\*data); | 挂载文件系统 |
| \#include&nbsp;&lt;sys/mount.h&gt; | int&nbsp;umount(const&nbsp;char&nbsp;\*target); | 卸载文件系统 |
| \#include&nbsp;&lt;sys/mount.h&gt; | int&nbsp;umount2(const&nbsp;char&nbsp;\*target,&nbsp;int&nbsp;flag); | 卸载文件系统 |
| \#include&nbsp;&lt;sys/stat.h&gt; | int&nbsp;fsync(int&nbsp;fd); | 将与指定文件描述符关联的文件同步到存储设备 |
| \#include&nbsp;&lt;sys/stat.h&gt; | int&nbsp;mkdir(const&nbsp;char&nbsp;\*pathname,&nbsp;mode_t&nbsp;mode); | 创建目录 |
| \#include&nbsp;&lt;unistd.h&gt; | int&nbsp;rmdir(const&nbsp;char&nbsp;\*path); | 删除目录 |
| \#include&nbsp;&lt;sys/stat.h&gt; | int&nbsp;fstat(int&nbsp;fd,&nbsp;struct&nbsp;stat&nbsp;\*buf); | 获取文件状态信息 |
| \#include&nbsp;&lt;sys/statfs.h&gt; | int&nbsp;statfs(const&nbsp;char&nbsp;\*path,&nbsp;struct&nbsp;statfs&nbsp;\*buf); | 获取指定路径下文件的文件系统信息 |
**表3** time
| 需要包含的头文件 | 接口名 | 描述 |
| -------- | -------- | -------- |
| \#include&nbsp;&lt;sys/time.h&gt; | int&nbsp;gettimeofday(struct&nbsp;timeval&nbsp;\*tv,&nbsp;struct&nbsp;timezone&nbsp;\*tz); | 获取时间。当前暂无时区概念,tz返回为空 |
| \#include&nbsp;&lt;time.h&gt; | struct&nbsp;tm&nbsp;\*gmtime(const&nbsp;time_t&nbsp;\*timep); | 将日期和时间转换为细分时间或ASCII |
| \#include&nbsp;&lt;time.h&gt; | struct&nbsp;tm&nbsp;\*localtime(const&nbsp;time_t&nbsp;\*timep); | 获取时间 |
| \#include&nbsp;&lt;time.h&gt; | struct&nbsp;tm&nbsp;\*localtime_r(const&nbsp;time_t&nbsp;\*timep,&nbsp;struct&nbsp;tm&nbsp;\*result); | 获取时间 |
| \#include&nbsp;&lt;time.h&gt; | time_t&nbsp;mktime(struct&nbsp;tm&nbsp;\*tm); | 将日期和时间转换为细分时间或ASCII |
| \#include&nbsp;&lt;time.h&gt; | size_t&nbsp;strftime(char&nbsp;\*s,&nbsp;size_t&nbsp;max,&nbsp;const&nbsp;char&nbsp;\*<br/>format,const&nbsp;struct&nbsp;tm&nbsp;\*tm); | 格式化日期和时间字符串 |
| \#include&nbsp;&lt;time.h&gt; | time_t&nbsp;time(time_t&nbsp;\*tloc); | 获得日历时间 |
| \#include&nbsp;&lt;sys/times.h&gt; | clock_t&nbsp;times(struct&nbsp;tms&nbsp;\*buf); | 获取线程时间 |
| \#include&nbsp;&lt;unistd.h&gt; | int&nbsp;usleep(useconds_t&nbsp;usec); | 休眠(微秒单位) |
| \#include&nbsp;&lt;time.h&gt; | int&nbsp;nanosleep(const&nbsp;struct&nbsp;timespec&nbsp;\*tspec1,&nbsp;struct<br/>timespec&nbsp;\*tspec2); | 暂停当前线程直到指定的时间到达 |
| \#include&nbsp;&lt;time.h&gt; | int&nbsp;clock_gettime(clockid_t&nbsp;id,&nbsp;struct&nbsp;timespec&nbsp;\*tspec); | 获取时钟的时间 |
| \#include&nbsp;&lt;time.h&gt; | int&nbsp;timer_create(clockid_t&nbsp;id,&nbsp;struct&nbsp;sigevent&nbsp;\*__<br/>restrict&nbsp;evp,&nbsp;timer_t&nbsp;\*__restrict&nbsp;t); | 为线程创建计时器 |
| \#include&nbsp;&lt;time.h&gt; | int&nbsp;timer_delete(timer_t&nbsp;t); | 为线程删除计时器 |
| \#include&nbsp;&lt;time.h&gt; | int&nbsp;timer_settime(timer_t&nbsp;t,&nbsp;int&nbsp;flags,&nbsp;const&nbsp;struct<br/>itimerspec&nbsp;\*__restrict&nbsp;val,&nbsp;struct&nbsp;itimerspec&nbsp;\*__restrict&nbsp;old); | 为线程设置计时器 |
| \#include&nbsp;&lt;time.h&gt; | time_t&nbsp;time&nbsp;(time_t&nbsp;\*t); | 获取时间 |
| \#include&nbsp;&lt;time.h&gt; | char&nbsp;\*strptime(const&nbsp;char&nbsp;\*s,&nbsp;const&nbsp;char&nbsp;\*format,&nbsp;struct&nbsp;tm&nbsp;\*tm); | 将时间的字符串表示形式转换为时间tm结构 |
**表4** util
| 需要包含的头文件 | 接口名 | 描述 |
| -------- | -------- | -------- |
| \#include&nbsp;&lt;stdlib.h&gt; | int&nbsp;atoi(const&nbsp;char&nbsp;\*nptr); | 字符串转换整型(int) |
| \#include&nbsp;&lt;stdlib.h&gt; | long&nbsp;atol(const&nbsp;char&nbsp;\*nptr); | 字符串转换整型(long) |
| \#include&nbsp;&lt;stdlib.h&gt; | long&nbsp;long&nbsp;atoll(const&nbsp;char&nbsp;\*nptr); | 字符串转换整型(long&nbsp;long) |
| \#include&nbsp;&lt;ctype.h&gt; | int&nbsp;isalnum(int&nbsp;c); | 检查字母数字字符 |
| \#include&nbsp;&lt;ctype.h&gt; | int&nbsp;isascii(int&nbsp;c); | 检查ASCII |
| \#include&nbsp;&lt;ctype.h&gt; | int&nbsp;isdigit(int&nbsp;c); | 检查数字字符 |
| \#include&nbsp;&lt;ctype.h&gt; | int&nbsp;islower(int&nbsp;c); | 检查小写字符 |
| \#include&nbsp;&lt;ctype.h&gt; | int&nbsp;isprint(int&nbsp;c); | 检查任何可打印字符,包括空格 |
| \#include&nbsp;&lt;ctype.h&gt; | int&nbsp;isspace(int&nbsp;c); | 检查空格字符 |
| \#include&nbsp;&lt;ctype.h&gt; | int&nbsp;isupper(int&nbsp;c); | 检查所传的字符是否是大写字母 |
| \#include&nbsp;&lt;ctype.h&gt; | int&nbsp;isxdigit(int&nbsp;c); | 判断字符是否为十六进制数 |
| \#include&nbsp;&lt;stdlib.h&gt; | long&nbsp;int&nbsp;random&nbsp;(void); | 生成伪随机数 |
| \#include&nbsp;&lt;stdlib.h&gt; | void&nbsp;srandom(unsigned&nbsp;int&nbsp;seed); | 初始化随机数生成器 |
| \#include&nbsp;&lt;ctype.h&gt; | int&nbsp;tolower(int&nbsp;c); | 字母转换成小写 |
| \#include&nbsp;&lt;ctype.h&gt; | int&nbsp;toupper(int&nbsp;c); | 字母转换成大写 |
| \#include&nbsp;&lt;stdarg.h&gt; | type&nbsp;va_arg(va_list&nbsp;ap,&nbsp;type); | 获取可变参数的当前参数,返回指定类型并将指针指向下一参数 |
| \#include&nbsp;&lt;stdarg.h&gt; | void&nbsp;va_copy(va_list&nbsp;dest,&nbsp;va_list&nbsp;src); | 复制参数 |
| \#include&nbsp;&lt;stdarg.h&gt; | void&nbsp;va_end(va_list&nbsp;ap); | 清空va_list可变参数列表 |
| \#include&nbsp;&lt;stdarg.h&gt; | void&nbsp;va_start(va_list&nbsp;ap,&nbsp;last); | 定义变长参数列表的起始位置 |
| \#include&nbsp;&lt;string.h&gt; | char&nbsp;\*strchr(const&nbsp;char&nbsp;\*s,&nbsp;int&nbsp;c); | 在字符串中定位字符 |
| \#include&nbsp;&lt;string.h&gt; | int&nbsp;strcmp(const&nbsp;char&nbsp;\*s1,&nbsp;const&nbsp;char&nbsp;\*s2); | 比较字符串 |
| \#include&nbsp;&lt;string.h&gt; | size_t&nbsp;strcspn(const&nbsp;char&nbsp;\*s,&nbsp;const&nbsp;char&nbsp;\*reject); | 获取前缀子串的长度 |
| \#include&nbsp;&lt;string.h&gt; | char&nbsp;\*strdup(const&nbsp;char&nbsp;\*s); | 字符串拷贝到新建的位置处 |
| \#include&nbsp;&lt;string.h&gt; | size_t&nbsp;strlen(const&nbsp;char&nbsp;\*s); | 计算字符串长度 |
| \#include&nbsp;&lt;strings.h&gt; | int&nbsp;strncasecmp(const&nbsp;char&nbsp;\*s1,&nbsp;const&nbsp;char&nbsp;\*s2,&nbsp;size_t&nbsp;n); | 比较固定长度字符串(忽略大小写) |
| \#include&nbsp;&lt;strings.h&gt; | int&nbsp;strcasecmp(const&nbsp;char&nbsp;\*s1,&nbsp;const&nbsp;char&nbsp;\*s2); | 比较字符串(忽略大小写) |
| \#include&nbsp;&lt;string.h&gt; | int&nbsp;strncmp(const&nbsp;char&nbsp;\*s1,&nbsp;const&nbsp;char&nbsp;\*s2,&nbsp;size_t&nbsp;n); | 比较字符串(指定长度) |
| \#include&nbsp;&lt;string.h&gt; | char&nbsp;\*strrchr(const&nbsp;char&nbsp;\*s,&nbsp;int&nbsp;c); | 在字符串中定位字符 |
| \#include&nbsp;&lt;string.h&gt; | char&nbsp;\*strstr(const&nbsp;char&nbsp;\*haystack,&nbsp;const&nbsp;char&nbsp;\*needle); | 寻找指定的子串 |
| \#include&nbsp;&lt;stdlib.h&gt; | long&nbsp;int&nbsp;strtol(const&nbsp;char&nbsp;\*nptr,&nbsp;char&nbsp;\*\*endptr,&nbsp;int&nbsp;base); | 将字符串转换为long型整数 |
| \#include&nbsp;&lt;stdlib.h&gt; | unsigned&nbsp;long&nbsp;int&nbsp;strtoul(const&nbsp;char&nbsp;\*nptr,&nbsp;char<br/>\*\*endptr,&nbsp;int&nbsp;base); | 将字符串转换为unsigned&nbsp;long型整数 |
| \#include&nbsp;&lt;stdlib.h&gt; | unsigned&nbsp;long&nbsp;long&nbsp;int&nbsp;strtoull(const&nbsp;char&nbsp;\*nptr,<br/>char&nbsp;\*\*endptr,int&nbsp;base); | 将字符串转换为unsigned&nbsp;long&nbsp;long型整数 |
| \#include&nbsp;&lt;regex.h&gt; | int&nbsp;regcomp(regex_t&nbsp;\*preg,&nbsp;const&nbsp;char&nbsp;\*regex,<br/>int&nbsp;cflags); | 编译正则表达式 |
| \#include&nbsp;&lt;regex.h&gt; | int&nbsp;regexec(const&nbsp;regex_t&nbsp;\*preg,&nbsp;const&nbsp;char&nbsp;\*<br/>string,&nbsp;size_t&nbsp;nmatch,regmatch_t&nbsp;pmatch[],&nbsp;int&nbsp;eflags); | 匹配正则表达式 |
| \#include&nbsp;&lt;regex.h&gt; | void&nbsp;regfree(regex_t&nbsp;\*preg); | 释放正则表达式 |
| \#include&nbsp;&lt;string.h&gt; | char&nbsp;\*strerror(int&nbsp;errnum); | 返回描述错误号的字符串 |
**表5** math
| 需要包含的头文件 | 接口名 | 描述 |
| -------- | -------- | -------- |
| \#include&nbsp;&lt;stdlib.h&gt; | int&nbsp;abs(int&nbsp;i); | 取绝对值 |
| \#include&nbsp;&lt;math.h&gt; | double&nbsp;log(double&nbsp;x); | 自然对数函数 |
| \#include&nbsp;&lt;math.h&gt; | double&nbsp;pow(double&nbsp;x,&nbsp;double&nbsp;y); | 求x的指数y次幂 |
| \#include&nbsp;&lt;math.h&gt; | double&nbsp;round(double&nbsp;x); | 从零开始,舍入到最接近的整数 |
| \#include&nbsp;&lt;math.h&gt; | double&nbsp;sqrt(double&nbsp;x); | 平方根 |
**表6** IO
| 需要包含的头文件 | 接口名 | 描述 |
| -------- | -------- | -------- |
| \#include&nbsp;&lt;stdio.h&gt; | void&nbsp;clearerr(FILE&nbsp;\*stream); | 清除流的文件结尾和错误指示 |
| \#include&nbsp;&lt;stdio.h&gt; | int&nbsp;fclose(FILE&nbsp;\*stream); | 关闭文件流 |
| \#include&nbsp;&lt;stdio.h&gt; | FILE&nbsp;\*fdopen(int&nbsp;fd,&nbsp;const&nbsp;char&nbsp;\*mode); | 通过文件描述符打开文件流 |
| \#include&nbsp;&lt;stdio.h&gt; | int&nbsp;feof(FILE&nbsp;\*stream); | 检测返回文件末尾指示位 |
| \#include&nbsp;&lt;stdio.h&gt; | int&nbsp;fflush(FILE&nbsp;\*stream); | 刷新流 |
| \#include&nbsp;&lt;stdio.h&gt; | char&nbsp;\*fgets(char&nbsp;\*s,&nbsp;int&nbsp;size,&nbsp;FILE&nbsp;\*stream); | 读取流的下一行 |
| \#include&nbsp;&lt;stdio.h&gt; | int&nbsp;fileno(FILE&nbsp;\*stream); | 返回流的文件描述符 |
| \#include&nbsp;&lt;stdio.h&gt; | FILE&nbsp;\*fopen(const&nbsp;char&nbsp;\*path,&nbsp;const&nbsp;char&nbsp;\*mode); | 打开流 |
| \#include&nbsp;&lt;stdio.h&gt; | int&nbsp;fputs(const&nbsp;char&nbsp;\*s,&nbsp;FILE&nbsp;\*stream); | 向指定流写入一行 |
| \#include&nbsp;&lt;stdio.h&gt; | size_t&nbsp;fread(void&nbsp;\*ptr,&nbsp;size_t&nbsp;size,&nbsp;size_t&nbsp;nmemb,<br/>FILE&nbsp;\*stream); | 读一个流 |
| \#include&nbsp;&lt;stdio.h&gt; | int&nbsp;fseek(FILE&nbsp;\*stream,&nbsp;long&nbsp;offset,&nbsp;int&nbsp;whence); | 设置流指针的位置 |
| \#include&nbsp;&lt;stdio.h&gt; | long&nbsp;ftell(FILE&nbsp;\*stream); | 获取流指针的位置 |
| \#include&nbsp;&lt;stdio.h&gt; | size_t&nbsp;fwrite(const&nbsp;void&nbsp;\*ptr,&nbsp;size_t&nbsp;size,&nbsp;size_t<br/>nmemb,FILE&nbsp;\*stream); | 向流写入 |
| \#include&nbsp;&lt;stdio.h&gt; | void&nbsp;perror(const&nbsp;char&nbsp;\*s); | 打印系统错误信息 |
| \#include&nbsp;&lt;stdio.h&gt; | void&nbsp;rewind(FILE&nbsp;\*stream); | 重新定位流 |
| \#include&nbsp;&lt;unistd.h&gt; | ssize_t&nbsp;write(int&nbsp;fd,&nbsp;const&nbsp;void&nbsp;\*buf,&nbsp;size_t&nbsp;size); | 写文件内容 |
| \#include&nbsp;&lt;unistd.h&gt; | ssize_t&nbsp;read(int&nbsp;fd,&nbsp;void&nbsp;\*buf,&nbsp;size_t&nbsp;size); | 读文件内容 |
**表7** net
| 需要包含的头文件 | 接口名 | 描述 |
| -------- | -------- | -------- |
| \#include&nbsp;&lt;sys/socket.h&gt; | void&nbsp;freeaddrinfo(struct&nbsp;addrinfo&nbsp;\*res); | 释放调用getaddrinfo所分配的动态内存 |
| \#include&nbsp;&lt;sys/socket.h&gt; | int&nbsp;getaddrinfo(const&nbsp;char&nbsp;\*restrict&nbsp;nodename,const<br/>char&nbsp;\*restrict&nbsp;servname,const&nbsp;struct&nbsp;addrinfo&nbsp;\*restrict<br/>hints,struct&nbsp;addrinfo&nbsp;\*\*restrict&nbsp;res); | 网络地址和服务转换 |
| \#include&nbsp;&lt;sys/socket.h&gt; | int&nbsp;getnameinfo(const&nbsp;struct&nbsp;sockaddr&nbsp;\*restrict&nbsp;sa,<br/>socklen_t&nbsp;salen,char&nbsp;\*restrict&nbsp;node,&nbsp;socklen_t&nbsp;nodelen<br/>,&nbsp;char&nbsp;\*restrict&nbsp;service,socklen_t&nbsp;servicelen,&nbsp;int&nbsp;flags); | 以协议无关的方式进行地址到名称的转换 |
| \#include&nbsp;&lt;net/if.h&gt; | unsigned&nbsp;int&nbsp;if_nametoindex(const&nbsp;char&nbsp;\*ifname); | 通过网络接口名得到索引 |
| \#include&nbsp;&lt;arpa/inet.h&gt; | in_addr_t&nbsp;inet_addr(const&nbsp;char&nbsp;\*cp); | 网络主机地址点分十进制形式转换位二进制形式 |
| \#include&nbsp;&lt;arpa/inet.h&gt; | char&nbsp;\*inet_ntoa(struct&nbsp;in_addr&nbsp;in); | 网络主机地址二进制形式转换位点分十进制形式 |
| \#include&nbsp;&lt;arpa/inet.h&gt; | const&nbsp;char&nbsp;\*inet_ntop(int&nbsp;af,&nbsp;const&nbsp;void&nbsp;\*src,char&nbsp;\*dst,<br/>socklen_t&nbsp;size); | 网络地址转换 |
| \#include&nbsp;&lt;arpa/inet.h&gt; | int&nbsp;inet_pton(int&nbsp;af,&nbsp;const&nbsp;char&nbsp;\*src,&nbsp;void&nbsp;\*dst); | 网络地址转换 |
| \#include&nbsp;&lt;sys/socket.h&gt; | int&nbsp;listen(int&nbsp;sockfd,&nbsp;int&nbsp;backlog); | 监听套接字 |
| \#include&nbsp;&lt;sys/socket.h&gt; | ssize_t&nbsp;recvmsg(int&nbsp;sockfd,&nbsp;struct&nbsp;msghdr&nbsp;\*msg,&nbsp;int&nbsp;flags); | 从套接字接收消息.只支持iov大小为1的场景,且不支持ancillary消息 |
| \#include&nbsp;&lt;sys/socket.h&gt; | ssize_t&nbsp;send(int&nbsp;sockfd,&nbsp;const&nbsp;void&nbsp;\*buf,&nbsp;size_t&nbsp;len,&nbsp;int&nbsp;flags); | 从socket发送消息 |
| \#include&nbsp;&lt;sys/socket.h&gt; | ssize_t&nbsp;sendmsg(int&nbsp;sockfd,&nbsp;const&nbsp;struct&nbsp;msghdr&nbsp;\*msg,&nbsp;int&nbsp;flags); | 从socket发送消息。不支持ancillary消息 |
| \#include&nbsp;&lt;sys/socket.h&gt; | ssize_t&nbsp;sendto(int&nbsp;sockfd,&nbsp;const&nbsp;void&nbsp;\*buf,&nbsp;size_t&nbsp;len,&nbsp;int<br/>flags,const&nbsp;struct&nbsp;sockaddr&nbsp;\*dest_addr,&nbsp;socklen_t&nbsp;addrlen); | 从socket发送消息 |
| \#include&nbsp;&lt;sys/socket.h&gt; | int&nbsp;setsockopt(int&nbsp;sockfd,&nbsp;int&nbsp;level,&nbsp;int&nbsp;optname,const<br/>void&nbsp;\*optval,&nbsp;socklen_t&nbsp;optlen); | 设置与套接字关联的选项 |
**表8** mem
| 需要包含的头文件 | 接口名 | 描述 |
| -------- | -------- | -------- |
| \#include&nbsp;&lt;string.h&gt; | int&nbsp;memcmp(const&nbsp;void&nbsp;\*s1,&nbsp;const&nbsp;void&nbsp;\*s2,&nbsp;size_t&nbsp;n); | 内存比较 |
| \#include&nbsp;&lt;string.h&gt; | void&nbsp;\*memcpy(void&nbsp;\*dest,&nbsp;const&nbsp;void&nbsp;\*src,&nbsp;size_t&nbsp;n); | 内存拷贝 |
| \#include&nbsp;&lt;string.h&gt; | void&nbsp;\*memset(void&nbsp;\*s,&nbsp;int&nbsp;c,&nbsp;size_t&nbsp;n); | 内存初始化 |
| \#include&nbsp;&lt;stdlib.h&gt; | void&nbsp;\*realloc(void&nbsp;\*ptr,&nbsp;size_t&nbsp;size); | 重分配内存 |
| \#include&nbsp;&lt;stdlib.h&gt; | void&nbsp;\*malloc(size_t&nbsp;size); | 动态分配内存块大小 |
| \#include&nbsp;&lt;stdlib.h&gt; | void&nbsp;free(void&nbsp;\*ptr); | 释放ptr所指向的内存空间 |
**表9** IPC
| 需要包含的头文件 | 接口名 | 描述 |
| -------- | -------- | -------- |
| \#include&nbsp;&lt;semaphore.h&gt; | int&nbsp;sem_timedwait(sem_t&nbsp;\*sem,&nbsp;const&nbsp;struct<br/>&nbsp;timespec&nbsp;\*abs_timeout); | 计时锁定信号量 |
| \#include&nbsp;&lt;semaphore.h&gt; | int&nbsp;sem_destroy(sem_t&nbsp;\*sem); | 销毁指定的无名信号量 |
| \#include&nbsp;&lt;semaphore.h&gt; | int&nbsp;sem_init(sem_t&nbsp;\*sem,&nbsp;int&nbsp;pshared<br/>,&nbsp;unsigned&nbsp;int&nbsp;value); | 创建并初始化一个无名信号量 |
| \#include&nbsp;&lt;semaphore.h&gt; | int&nbsp;sem_post(sem_t&nbsp;\*sem); | 增加信号量计数 |
| \#include&nbsp;&lt;semaphore.h&gt; | int&nbsp;sem_wait(sem_t&nbsp;\*sem); | 获取信号量 |
| \#include&nbsp;&lt;mqueue.h&gt; | mqd_t&nbsp;mq_open(const&nbsp;char&nbsp;\*mqName,<br/>&nbsp;int&nbsp;openFlag,&nbsp;...); | 此API用于打开一个具有指定名称的已有消息队列或创建一个新的消息队列 |
| \#include&nbsp;&lt;mqueue.h&gt; | int&nbsp;mq_close(mqd_t&nbsp;personal); | 此API用于关闭具有指定描述符的消息队列 |
| \#include&nbsp;&lt;mqueue.h&gt; | int&nbsp;mq_unlink(const&nbsp;char&nbsp;\*mqName); | 此API用于删除具有指定名称的消息队列 |
| \#include&nbsp;&lt;mqueue.h&gt; | int&nbsp;mq_send(mqd_t&nbsp;personal,&nbsp;const<br/>&nbsp;char&nbsp;\*msg,size_t&nbsp;msgLen,&nbsp;unsigned&nbsp;int&nbsp;msgPrio); | 此API用于将具有指定内容和长度的消息放入具有指定描述符的消息队列中 |
| \#include&nbsp;&lt;mqueue.h&gt; | ssize_t&nbsp;mq_receive(mqd_t&nbsp;personal,&nbsp;char&nbsp;\*msg,<br/>size_t&nbsp;msgLen,&nbsp;unsigned&nbsp;int&nbsp;\*msgPrio); | 此API用于从具有指定描述符的消息队列中删除最老的消息,并将其放入msg_ptr所指向的缓冲区中 |
| \#include&nbsp;&lt;mqueue.h&gt; | int&nbsp;mq_timedsend(mqd_t&nbsp;personal,&nbsp;const&nbsp;char<br/>\*msg,&nbsp;size_t&nbsp;msgLen,&nbsp;unsigned&nbsp;int&nbsp;msgPrio,&nbsp;c<br/>onst&nbsp;struct&nbsp;timespec&nbsp;\*absTimeout) | 此API用于在预定时间将具有指定内容和长度的消息放入具有描述符的消息队列中 |
| \#include&nbsp;&lt;mqueue.h&gt; | ssize_t&nbsp;mq_timedreceive(mqd_t&nbsp;personal,&nbsp;char<br/>\*msg,&nbsp;size_t&nbsp;msgLen,&nbsp;unsigned&nbsp;int&nbsp;\*msgPrio,<br/>const&nbsp;struct&nbsp;timespec&nbsp;\*absTimeout); | 此API用于从具有指定描述符的消息队列消息中获取具有指定消息内容和长度的消息 |
| \#include&nbsp;&lt;mqueue.h&gt; | int&nbsp;mq_setattr(mqd_t&nbsp;mqdes,&nbsp;const&nbsp;struct&nbsp;mq_<br/>attr&nbsp;\*__restrict&nbsp;newattr,&nbsp;struct&nbsp;mq_attr&nbsp;\*__restrict&nbsp;oldattr); | 设置描述符指定的消息队列属性 |
| \#include&nbsp;&lt;libc.h&gt; | const&nbsp;char&nbsp;\*libc_get_version_string(void); | 获取libc版本字符串 |
| \#include&nbsp;&lt;libc.h&gt; | int&nbsp;libc_get_version(void); | 获取libc版本号 |
### 注意事项
常用错误码对照表:
| 错误码 | 值 | 描述 | 含义 |
| -------- | -------- | -------- | -------- |
| ENOERR | 0 | Success | 成功 |
| EPERM | 1 | Operation&nbsp;not&nbsp;permitted | 操作不允许 |
| ENOENT | 2 | No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory | 没有这样的文件或目录 |
| ESRCH | 3 | No&nbsp;such&nbsp;process | 没有这样的进程(暂不支持) |
| EINTR | 4 | Interrupted&nbsp;system&nbsp;call | 系统调用被中断 |
| EIO | 5 | I/O&nbsp;error | I/O错误 |
| ENXIO | 6 | No&nbsp;such&nbsp;device&nbsp;or&nbsp;address | 没有这样的设备或地址 |
| E2BIG | 7 | Arg&nbsp;list&nbsp;too&nbsp;long | 参数列表太长 |
| ENOEXEC | 8 | Exec&nbsp;format&nbsp;error | 执行格式错误 |
| EBADF | 9 | Bad&nbsp;file&nbsp;number | 坏的文件描述符 |
| ECHILD | 10 | No&nbsp;child&nbsp;processes | 没有子进程(暂不支持) |
| EAGAIN | 11 | Try&nbsp;again | 资源暂时不可用 |
| ENOMEM | 12 | Out&nbsp;of&nbsp;memory | 内存溢出 |
| EACCES | 13 | Permission&nbsp;denied | 拒绝许可 |
| EFAULT | 14 | Bad&nbsp;address | 错误的地址 |
| ENOTBLK | 15 | Block&nbsp;device&nbsp;required | 块设备请求 |
| EBUSY | 16 | Device&nbsp;or&nbsp;resource&nbsp;busy | 设备或资源忙 |
| EEXIST | 17 | File&nbsp;exists | 文件存在 |
| EXDEV | 18 | Cross-device&nbsp;link | 无效的交叉链接 |
| ENODEV | 19 | No&nbsp;such&nbsp;device | 设备不存在 |
| ENOTDIR | 20 | Not&nbsp;a&nbsp;directory | 不是一个目录 |
| EISDIR | 21 | Is&nbsp;a&nbsp;directory | 是一个目录 |
| EINVAL | 22 | Invalid&nbsp;argument | 无效的参数 |
| ENFILE\* | 23 | File&nbsp;table&nbsp;overflow | 打开太多的文件系统 |
| EMFILE | 24 | Too&nbsp;many&nbsp;open&nbsp;files | 打开的文件过多 |
| EFBIG | 27 | File&nbsp;too&nbsp;large | 文件太大 |
| ENOSPC | 28 | No&nbsp;space&nbsp;left&nbsp;on&nbsp;device | 设备上没有空间 |
| ESPIPE | 29 | Illegal&nbsp;seek | 非法移位 |
| EROFS | 30 | Read-only&nbsp;file&nbsp;system | 只读文件系统 |
| EMLINK | 31 | Too&nbsp;many&nbsp;links | 太多的链接 |
| EDOM | 33 | Math&nbsp;argument&nbsp;out&nbsp;of&nbsp;domain | 数值结果超出范围 |
| ERANGE | 34 | Math&nbsp;result&nbsp;not&nbsp;representable | 数值结果不具代表性 |
| EDEADLK | 35 | Resource&nbsp;deadlock&nbsp;would&nbsp;occur | 资源死锁错误 |
| ENAMETOOLONG | 36 | Filename&nbsp;too&nbsp;long | 文件名太长 |
| ENOLCK | 37 | No&nbsp;record&nbsp;locks&nbsp;available | 没有可用锁 |
| ENOSYS | 38 | Function&nbsp;not&nbsp;implemented | 功能没有实现 |
| ENOTEMPTY | 39 | Directory&nbsp;not&nbsp;empty | 目录不空 |
| ELOOP | 40 | Too&nbsp;many&nbsp;symbolic&nbsp;links&nbsp;encountered | 符号链接层次太多 |
| ENOMSG | 42 | No&nbsp;message&nbsp;of&nbsp;desired&nbsp;type | 没有期望类型的消息 |
| EIDRM | 43 | Identifier&nbsp;removed | 标识符删除 |
| ELNRNG | 48 | Link&nbsp;number&nbsp;out&nbsp;of&nbsp;range | 链接数超出范围 |
| EBADR | 53 | Invalid&nbsp;request&nbsp;descriptor | 请求描述符无效 |
| EBADRQC | 56 | Invalid&nbsp;request&nbsp;code | 无效的请求代码 |
| ENOSTR | 60 | Device&nbsp;not&nbsp;a&nbsp;stream | 设备不是字符流 |
| ENODATA | 61 | No&nbsp;data&nbsp;available | 无可用数据 |
| ETIME | 62 | Timer&nbsp;expired | 计时器过期 |
| EPROTO | 71 | Protocol&nbsp;error | 协议错误 |
| EBADMSG | 74 | Not&nbsp;a&nbsp;data&nbsp;message | 非数据消息 |
| EOVERFLOW | 75 | Value&nbsp;too&nbsp;large&nbsp;for&nbsp;defined&nbsp;data&nbsp;type | 值太大,对于定义数据类型 |
| EMSGSIZE | 90 | Message&nbsp;too&nbsp;long | 消息太长 |
### 编程实例
demo功能:
创建一个线程并将父线程中的信息传递给子线程,在子线程中打印传递过来的信息和自身线程id值。
```
#include <stdio.h>
#include <pthread.h>
pthread_t ntid;
void *ThreadFn(void *arg)
{
pthread_t tid;
while(1) {
tid = pthread_self();
printf("\n++++++++++++++ %s %s tid = %d ++++++++++++++\n", (char*)arg, __FUNCTION__, tid);
}
return ((void *)0);
}
void DemoForTest()
{
int err;
char* str = "Hello world";
err = pthread_create(&ntid, NULL, ThreadFn, (void*)str);
if(err != 0) {
printf("can't create thread\n");
}
}
```
执行DemoForTest运行结果如下:
```
++++++++++++++ Hello world ThreadFn tid = 48 ++++++++++++++
++++++++++++++ Hello world ThreadFn tid = 48 ++++++++++++++
++++++++++++++ Hello world ThreadFn tid = 48 ++++++++++++++
```
# 内核通信机制
- **[事件](kernel-mini-basic-ipc-event.md)**
- **[互斥锁](kernel-mini-basic-ipc-mutex.md)**
- **[消息队列](kernel-mini-basic-ipc-queue.md)**
- **[信号量](kernel-mini-basic-ipc-sem.md)**
\ No newline at end of file
# 基本概念
内存管理模块管理系统的内存资源,它是操作系统的核心模块之一,主要包括内存的初始化、分配以及释放。
在系统运行过程中,内存管理模块通过对内存的申请/释放来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。
OpenHarmony LiteOS-M的内存管理分为静态内存管理和动态内存管理,提供内存初始化、分配、释放等功能。
- 动态内存:在动态内存池中分配用户指定大小的内存块。
- 优点:按需分配。
- 缺点:内存池中可能出现碎片。
- 静态内存:在静态内存池中分配用户初始化时预设(固定)大小的内存块。
- 优点:分配和释放效率高,静态内存池中无碎片。
- 缺点:只能申请到初始化预设大小的内存块,不能按需申请。
# 动态内存
## 运行机制
动态内存管理,即在内存资源充足的情况下,根据用户需求,从系统配置的一块比较大的连续内存(内存池,也是堆内存)中分配任意大小的内存块。当用户不需要该内存块时,又可以释放回系统供下一次使用。与静态内存相比,动态内存管理的优点是按需分配,缺点是内存池中容易出现碎片。
OpenHarmony LiteOS-M动态内存在TLSF算法的基础上,对区间的划分进行了优化,获得更优的性能,降低了碎片率。动态内存核心算法框图如下:
**图1** 轻量系统动态内存核心算法
![zh-cn_image_0000001199352445](figures/zh-cn_image_0000001199352445.png)
根据空闲内存块的大小,使用多个空闲链表来管理。根据内存空闲块大小分为两个部分:[4, 127]和[2<sup>7</sup>, 2<sup>31</sup>],如上图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** 轻量系统动态内存管理结构图
![zh-cn_image_0000001153313284](figures/zh-cn_image_0000001153313284.png)
- 内存池池头部分
内存池池头部分包含内存池信息、位图标记数组和空闲链表数组。内存池信息包含内存池起始地址及堆区域总大小,内存池属性。位图标记数组有7个32位无符号整数组成,每个比特位标记对应的空闲链表是否挂载空闲内存块节点。空闲内存链表包含223个空闲内存头节点信息,每个空闲内存头节点信息维护内存节点头和空闲链表中的前驱、后继空闲内存节点。
- 内存池节点部分
包含3种类型节点:未使用空闲内存节点,已使用内存节点和尾节点。每个内存节点维护一个前序指针,指向内存池中上一个内存节点,还维护内存节点的大小和使用标记。空闲内存节点和已使用内存节点后面的内存区域是数据域,尾节点没有数据域。
一些芯片片内RAM大小无法满足要求,需要使用片外物理内存进行扩充。对于这样的多段非连续性内存, LiteOS-M内核支持把多个非连续性内存逻辑上合一,用户不感知底层的多段非连续性内存区域。 LiteOS-M内核内存模块把不连续的内存区域作为空闲内存结点插入到空闲内存节点链表,把不同内存区域间的不连续部分标记为虚拟的已使用内存节点,从逻辑上把多个非连续性内存区域实现为一个统一的内存池。下面通过示意图说明下多段非连续性内存的运行机制:
**图3** 非连续性内存合一示意图
![zh-cn_image_0000001198253551](figures/zh-cn_image_0000001198253551.png)
结合上述示意图,非连续性内存合并为一个统一的内存池的步骤如下:
1. 把多段非连续性内存区域的第一块内存区域通过调用LOS_MemInit接口进行初始化。
2. 获取下一个内存区域的开始地址和长度,计算该内存区域和上一块内存区域的间隔大小gapSize。
3. 把内存区域间隔部分视为虚拟的已使用节点,使用上一个内存区域的尾节点,设置其大小为gapSize+ OS_MEM_NODE_HEAD_SIZE。
4. 把当前内存区域划分为一个空闲内存节点和一个尾节点,把空闲内存节点插入到空闲链表,并设置各个节点的前后链接关系。
5. 如果有更多的非连续内存区域,重复上述步骤2-4。
## 开发指导
### 使用场景
动态内存管理的主要工作是动态分配并管理用户申请到的内存区间。动态内存管理主要用于用户需要使用大小不等的内存块的场景,当用户需要使用内存时,可以通过操作系统的动态内存申请函数索取指定大小的内存块,一旦使用完毕,通过动态内存释放函数归还所占用内存,使之可以重复使用。
### 接口说明
OpenHarmony LiteOS-M的动态内存管理主要为用户提供以下功能,接口详细信息可以查看API参考。
**表1** 动态内存模块接口
| 功能分类 | 接口描述 |
| -------- | -------- |
| 初始化和删除内存池 | -&nbsp;LOS_MemInit:初始化一块指定的动态内存池,大小为size。<br/>-&nbsp;LOS_MemDeInit:删除指定内存池,仅打开LOSCFG_MEM_MUL_POOL时有效。 |
| 申请、释放动态内存 | -&nbsp;LOS_MemAlloc:从指定动态内存池中申请size长度的内存。<br/>-&nbsp;LOS_MemFree:释放从指定动态内存中申请的内存。<br/>-&nbsp;LOS_MemRealloc:释放从指定动态内存中申请的内存。 |
| 获取内存池信息 | -&nbsp;LOS_MemPoolSizeGet:获取指定动态内存池的总大小。<br/>-&nbsp;LOS_MemTotalUsedGet:获取指定动态内存池的总使用量大小。<br/>-&nbsp;LOS_MemInfoGet:获取指定内存池的内存结构信息,包括空闲内存大小、已使用内存大小、空闲内存块数量、已使用的内存块数量、最大的空闲内存块大小。<br/>-&nbsp;LOS_MemPoolList:打印系统中已初始化的所有内存池,包括内存池的起始地址、内存池大小、空闲内存总大小、已使用内存总大小、最大的空闲内存块大小、空闲内存块数量、已使用的内存块数量。仅打开LOSCFG_MEM_MUL_POOL时有效。 |
| 获取内存块信息 | -&nbsp;LOS_MemFreeNodeShow:打印指定内存池的空闲内存块的大小及数量。<br/>-&nbsp;LOS_MemUsedNodeShow:打印指定内存池的已使用内存块的大小及数量。 |
| 检查指定内存池的完整性 | LOS_MemIntegrityCheck:对指定内存池做完整性检查,仅打开LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK时有效。 |
| 增加非连续性内存区域 | LOS_MemRegionsAdd:支持多段非连续性内存区域,把非连续性内存区域逻辑上整合为一个统一的内存池。仅打开LOSCFG_MEM_MUL_REGIONS时有效。如果内存池指针参数pool为空,则使用多段内存的第一个初始化为内存池,其他内存区域,作为空闲节点插入;如果内存池指针参数pool不为空,则把多段内存作为空闲节点,插入到指定的内存池。 |
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> - 由于动态内存管理需要管理控制块数据结构来管理内存,这些数据结构会额外消耗内存,故实际用户可使用内存总量小于配置项OS_SYS_MEM_SIZE的大小。
>
> - 对齐分配内存接口LOS_MemAllocAlign/LOS_MemMallocAlign因为要进行地址对齐,可能会额外消耗部分内存,故存在一些遗失内存,当系统释放该对齐内存时,同时回收由于对齐导致的遗失内存。
>
> - 非连续性内存区域接口LOS_MemRegionsAdd的LosMemRegion数组参数传入的非连续性内存区域需要按各个内存区域的内存开始地址升序,且内存区域不能重叠。
### 开发流程
本节介绍使用动态内存的典型场景开发流程。
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)
__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;
}
```
### 结果验证
输出结果如下:
```
Mem init success!
Mem alloc success!
*mem = 828
Mem free success!
```
# 静态内存
## 运行机制
静态内存实质上是一个静态数组,静态内存池内的块大小在初始化时设定,初始化后块大小不可变更。
静态内存池由一个控制块LOS_MEMBOX_INFO和若干相同大小的内存块LOS_MEMBOX_NODE构成。控制块位于内存池头部,用于内存块管理,包含内存块大小uwBlkSize,内存块数量uwBlkNum,已分配使用的内存块数量uwBlkCnt和空闲内存块链表stFreeList。内存块的申请和释放以块大小为粒度,每个内存块包含指向下一个内存块的指针pstNext。
**图1** 静态内存示意图
![zh-cn_image_0000001199352039](figures/zh-cn_image_0000001199352039.png)
## 开发指导
### 使用场景
当用户需要使用固定长度的内存时,可以通过静态内存分配的方式获取内存,一旦使用完毕,通过静态内存释放函数归还所占用内存,使之可以重复使用。
### 接口说明
OpenHarmony LiteOS-M的静态内存管理主要为用户提供以下功能,接口详细信息可以查看API参考。
**表1** 静态内存模块接口
| 功能分类 | 接口名 |
| -------- | -------- |
| 初始化静态内存池 | LOS_MemboxInit:初始化一个静态内存池,根据入参设定其起始地址、总大小及每个内存块大小。 |
| 清除静态内存块内容 | LOS_MemboxClr:清零从静态内存池中申请的静态内存块的内容。 |
| 申请、释放静态内存 | -&nbsp;LOS_MemboxAlloc:从指定的静态内存池中申请一块静态内存块。<br/>-&nbsp;LOS_MemboxFree:释放从静态内存池中申请的一块静态内存块。 |
| 获取、打印静态内存池信息 | -&nbsp;LOS_MemboxStatisticsGet:获取指定静态内存池的信息,包括内存池中总内存块数量、已经分配出去的内存块数量、每个内存块的大小。<br/>-&nbsp;LOS_ShowBox:打印指定静态内存池所有节点信息(打印等级是LOS_INFO_LEVEL),包括内存池起始地址、内存块大小、总内存块数量、每个空闲内存块的起始地址、所有内存块的起始地址。 |
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 初始化后的内存池的内存块数量,不等于总大小除于内存块大小,因为内存池的控制块和每个内存块的控制头,都存在内存开销,设置总大小时,需要将这些因素考虑进去。
### 开发流程
本节介绍使用静态内存的典型场景开发流程。
1. 规划一片内存区域作为静态内存池。
2. 调用LOS_MemboxInit初始化静态内存池。
初始化会将入参指定的内存区域分割为N块(N值取决于静态内存总大小和块大小),将所有内存块挂到空闲链表,在内存起始处放置控制头。
3. 调用LOS_MemboxAlloc接口分配静态内存。
系统将会从空闲链表中获取第一个空闲块,并返回该内存块的起始地址。
4. 调用LOS_MemboxClr接口。
将入参地址对应的内存块清零。
5. 调用LOS_MemboxFree接口。
将该内存块加入空闲链表。
### 编程实例
本实例执行以下步骤:
1. 初始化一个静态内存池。
2. 从静态内存池中申请一块静态内存。
3. 在内存块存放一个数据。
4. 打印出内存块中的数据。
5. 清除内存块中的数据。
6. 释放该内存块。
示例代码如下:
```
#include "los_membox.h"
VOID Example_StaticMem(VOID)
{
UINT32 *mem = NULL;
UINT32 blkSize = 10;
UINT32 boxSize = 100;
UINT32 boxMem[1000];
UINT32 ret;
/*内存池初始化*/
ret = LOS_MemboxInit(&boxMem[0], boxSize, blkSize);
if(ret != LOS_OK) {
printf("Membox init failed!\n");
return;
} else {
printf("Membox init success!\n");
}
/*申请内存块*/
mem = (UINT32 *)LOS_MemboxAlloc(boxMem);
if (NULL == mem) {
printf("Mem alloc failed!\n");
return;
}
printf("Mem alloc success!\n");
/*赋值*/
*mem = 828;
printf("*mem = %d\n", *mem);
/*清除内存内容*/
LOS_MemboxClr(boxMem, mem);
printf("Mem clear success \n *mem = %d\n", *mem);
/*释放内存*/
ret = LOS_MemboxFree(boxMem, mem);
if (LOS_OK == ret) {
printf("Mem free success!\n");
} else {
printf("Mem free failed!\n");
}
return;
}
```
### 结果验证
输出结果如下:
```
Membox init success!
Mem alloc success!
*mem = 828
Mem clear success
*mem = 0
Mem free success!
```
# 基础内核
- **[中断管理](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)**
\ No newline at end of file
# 内核调测
- **[内存调测](kernel-mini-memory-debug.md)**
- **[异常调测](kernel-mini-memory-exception.md)**
- **[Trace调测](kernel-mini-memory-trace.md)**
- **[LMS调测](kernel-mini-memory-lms.md)**
\ No newline at end of file
# FAT
## 基本概念
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文件系统的使用需要底层MMC相关驱动的支持。在一个带MMC存储设备的板子上运行FATFS,需要:
1、适配板端EMMC驱动,实现disk_status、disk_initialize、disk_read、disk_write、disk_ioctl接口;
2、新增fs_config.h文件,配置FS_MAX_SS(存储设备最大sector大小)、FF_VOLUME_STRS(分区名)等信息,例如:
```
#define FF_VOLUME_STRS "system", "inner", "update", "user"
#define FS_MAX_SS 512
#define FAT_MAX_OPEN_FILES 50
```
### 开发流程
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> - FATFS文件与目录操作:
> - 单个文件大小不超过4G。
> - 支持同时打开的文件数最大为FAT_MAX_OPEN_FILES,文件夹数最大为FAT_MAX_OPEN_DIRS。
> - 暂不支持根目录管理,文件/目录名均以分区名开头,例如“user/testfile”就是在“user”分区下名为“testfile”的文件或目录。
> - 若需要同时多次打开同一文件,必须全部使用只读方式(O_RDONLY)。以可写方式(O_RDWR、O_WRONLY等)只能打开一次。
> - 读写指针未分离,例如以O_APPEND(追加写)方式打开文件后,读指针也在文件尾,从头读文件前需要用户手动置位。
> - 暂不支持文件与目录的权限管理。
> - stat及fstat接口暂不支持查询修改时间、创建时间和最后访问时间。微软FAT协议不支持1980年以前的时间。
>
> - FATFS分区挂载与卸载:
> - 支持以只读属性挂载分区。当mount函数的入参为MS_RDONLY时,所有的带有写入的接口,如write、mkdir、unlink,以及非O_RDONLY属性的open,将均被拒绝。
> - mount支持通过MS_REMOUNT标记修改已挂载分区的权限。
> - 在umount操作前,需确保所有目录及文件全部关闭。
> - umount2支持通过MNT_FORCE参数强制关闭所有文件与文件夹并umount,但可能造成数据丢失,请谨慎使用。
>
> - FATFS支持重新划分存储设备分区、格式化分区,对应接口为fatfs_fdisk与fatfs_format:
> - 在fatfs_format操作之前,若需要格式化的分区已挂载,需确保分区中的所有目录及文件全部关闭,并且分区umount。
> - 在fatfs_fdisk操作前,需要该设备中的所有分区均已umount。
> - fatfs_fdisk与fatfs_format会造成设备数据丢失,请谨慎使用。
## 编程实例
### 实例描述
本实例实现以下功能:
1. 创建目录“user/test”
2. 在“user/test”目录下创建文件“file.txt”
3. 在文件起始位置写入“Hello OpenHarmony!”
4. 将文件内容刷入设备中
5. 设置偏移到文件起始位置
6. 读取文件内容
7. 关闭文件
8. 删除文件
9. 删除目录
### 示例代码
**前提条件:**
系统已将MMC设备分区挂载到user目录
**代码实现如下:**
```
#include <stdio.h>
#include <string.h>
#include "sys/stat.h"
#include "fcntl.h"
#include "unistd.h"
#define LOS_OK 0
#define LOS_NOK -1
int FatfsTest(void)
{
int ret;
int fd = -1;
ssize_t len;
off_t off;
char dirName[20] = "user/test";
char fileName[20] = "user/test/file.txt";
char writeBuf[20] = "Hello OpenHarmony!";
char readBuf[20] = {0};
/* 创建目录“user/test” */
ret = mkdir(dirName, 0777);
if (ret != LOS_OK) {
printf("mkdir failed.\n");
return LOS_NOK;
}
/* 创建可读写文件"user/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(writeBuf)) {
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;
}
/* 删除文件"user/test/file.txt" */
ret = unlink(fileName);
if (ret != LOS_OK) {
printf("unlink failed.\n");
return LOS_NOK;
}
/* 删除目录“user/test” */
ret = rmdir(dirName);
if (ret != LOS_OK) {
printf("rmdir failed.\n");
return LOS_NOK;
}
return LOS_OK;
}
```
### 结果验证
编译运行得到的结果为:
```
Hello OpenHarmony!
```
# LittleFS
## 基本概念
LittleFS是一个小型的Flash文件系统,它结合日志结构(log-structured)文件系统和COW(copy-on-write)文件系统的思想,以日志结构存储元数据,以COW结构存储数据。这种特殊的存储方式,使LittleFS具有强大的掉电恢复能力(power-loss resilience)。分配COW数据块时LittleFS采用了名为统计损耗均衡的动态损耗均衡算法,使Flash设备的寿命得到有效保障。同时LittleFS针对资源紧缺的小型设备进行设计,具有极其有限的ROM和RAM占用,并且所有RAM的使用都通过一个可配置的固定大小缓冲区进行分配,不会随文件系统的扩大占据更多的系统资源。
当在一个资源非常紧缺的小型设备上,寻找一个具有掉电恢复能力并支持损耗均衡的Flash文件系统时,LittleFS是一个比较好的选择。
## 开发指导
移植LittleFS到新硬件设备上,需要申明lfs_config:
```
const struct lfs_config cfg = {
// block device operations
.read = user_provided_block_device_read,
.prog = user_provided_block_device_prog,
.erase = user_provided_block_device_erase,
.sync = user_provided_block_device_sync,
// block device configuration
.read_size = 16,
.prog_size = 16,
.block_size = 4096,
.block_count = 128,
.cache_size = 16,
.lookahead_size = 16,
.block_cycles = 500,
};
```
其中.read,.prog,.erase,.sync分别对应该硬件平台上的底层的读写\擦\同步等接口。
read_size 每次读取的字节数,可以比物理读单元大以改善性能,这个数值决定了读缓存的大小,但值太大会带来更多的内存消耗。
prog_size 每次写入的字节数,可以比物理写单元大以改善性能,这个数值决定了写缓存的大小,必须是read_size的整数倍,但值太大会带来更多的内存消耗。
block_size 每个擦除块的字节数,可以比物理擦除单元大,但此数值应尽可能小因为每个文件至少会占用一个块。必须是prog_size的整数倍。
block_count 可以被擦除的块数量,这取决于块设备的容量及擦除块的大小。
## 示例代码
代码实现如下:
```
#include "lfs.h"
#include "stdio.h"
lfs_t lfs;
lfs_file_t file;
const struct lfs_config cfg = {
// block device operations
.read = user_provided_block_device_read,
.prog = user_provided_block_device_prog,
.erase = user_provided_block_device_erase,
.sync = user_provided_block_device_sync,
// block device configuration
.read_size = 16,
.prog_size = 16,
.block_size = 4096,
.block_count = 128,
.cache_size = 16,
.lookahead_size = 16,
.block_cycles = 500,
};
int main(void) {
// mount the filesystem
int err = lfs_mount(&lfs, &cfg);
// reformat if we can't mount the filesystem
// this should only happen on the first boot
if (err) {
lfs_format(&lfs, &cfg);
lfs_mount(&lfs, &cfg);
}
// read current count
uint32_t boot_count = 0;
lfs_file_open(&lfs, &file, "boot_count", LFS_O_RDWR | LFS_O_CREAT);
lfs_file_read(&lfs, &file, &boot_count, sizeof(boot_count));
// update boot count
boot_count += 1;
lfs_file_rewind(&lfs, &file);
lfs_file_write(&lfs, &file, &boot_count, sizeof(boot_count));
// remember the storage is not updated until the file is closed successfully
lfs_file_close(&lfs, &file);
// release any resources we were using
lfs_unmount(&lfs);
// print the boot count
printf("boot_count: %d\n", boot_count);
}
```
**结果验证**
首次编译运行得到的结果为:
```
Say hello 1 times.
```
# 扩展组件
- **[C++支持](kernel-mini-extend-support.md)**
- **[CPU占用率](kernel-mini-extend-cpup.md)**
- **[动态加载](kernel-mini-extend-dynamic-loading.md)**
- **[文件系统](kernel-mini-extend-file.md)**
\ No newline at end of file
# 踩内存检测
## 基础概念
踩内存检测机制作为内核的可选功能,用于检测动态内存池的完整性。通过该机制,可以及时发现内存池是否发生了踩内存问题,并给出错误信息,便于及时发现系统问题,提高问题解决效率,降低问题定位成本。
## 功能配置
LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK:开关宏,默认关闭;若打开这个功能,在target_config.h中将这个宏定义为1。
1. 开启这个功能,每次申请内存,会实时检测内存池的完整性。
2. 如果不开启该功能,也可以调用LOS_MemIntegrityCheck接口检测,但是每次申请内存时,不会实时检测内存完整性,而且由于节点头没有魔鬼数字(开启时才有,省内存),检测的准确性也会相应降低,但对于系统的性能没有影响,故根据实际情况开关该功能。
由于该功能只会检测出哪个内存节点被破坏了,并给出前节点信息(因为内存分布是连续的,当前节点最有可能被前节点破坏)。如果要进一步确认前节点在哪里申请的,需开启内存泄漏检测功能,通过LR记录,辅助定位。
> ![icon-caution.gif](public_sys-resources/icon-caution.gif) **注意:**
> 开启该功能,节点头多了魔鬼数字字段,会增大节点头大小。由于实时检测完整性,故性能影响较大;若性能敏感的场景,可以不开启该功能,使用LOS_MemIntegrityCheck接口检测。
## 开发指导
### 开发流程
通过调用LOS_MemIntegrityCheck接口检测内存池是否发生了踩内存,如果没有踩内存问题,那么接口返回0且没有log输出;如果存在踩内存问题,那么会输出相关log,详见下文编程实例的结果输出。
### 编程实例
本实例实现如下功能:
1. 申请两个物理上连续的内存块;
2. 通过memset构造越界访问,踩到下个节点的头4个字节;
3. 调用LOS_MemIntegrityCheck检测是否发生踩内存。
### 示例代码
代码实现如下:
```
#include <stdio.h>
#include <string.h>
#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 /* 被破坏节点和其前节点的地址 */
```
# 内存泄漏检测
## 基础概念
内存泄漏检测机制作为内核的可选功能,用于辅助定位动态内存泄漏问题。开启该功能,动态内存机制会自动记录申请内存时的函数调用关系(下文简称LR)。如果出现泄漏,就可以利用这些记录的信息,找到内存申请的地方,方便进一步确认。
## 功能配置
1. LOSCFG_MEM_LEAKCHECK:开关宏,默认关闭;若打开这个功能,在target_config.h中将这个宏定义为1。
2. LOSCFG_MEM_RECORD_LR_CNT:记录的LR层数,默认3层;每层LR消耗sizeof(void \*)字节数的内存。
3. LOSCFG_MEM_OMIT_LR_CNT:忽略的LR层数,默认4层,即从调用LOS_MemAlloc的函数开始记录,可根据实际情况调整。为啥需要这个配置?有3点原因如下:
- LOS_MemAlloc接口内部也有函数调用;
- 外部可能对LOS_MemAlloc接口有封装;
- LOSCFG_MEM_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
```
> ![icon-caution.gif](public_sys-resources/icon-caution.gif) **注意:**
> 开启内存检测会影响内存申请的性能,且每个内存节点都会记录LR地址,内存开销也加大。
### 编程实例
本实例实现如下功能:构建内存泄漏代码段。
1. 调用LOS_MemUsedNodeShow接口,输出全部节点信息打印;
2. 申请内存,但没有释放,模拟内存泄漏;
3. 再次调用LOS_MemUsedNodeShow接口,输出全部节点信息打印;
4. 将两次log进行对比,得出泄漏的节点信息;
5. 通过LR地址,找出泄漏的代码位置;
### 示例代码
代码实现如下:
```
#include <stdio.h>
#include <string.h>
#include "los_memory.h"
#include "los_config.h"
void MemLeakTest(void)
{
LOS_MemUsedNodeShow(LOSCFG_SYS_HEAP_ADDR);
void *ptr1 = LOS_MemAlloc(LOSCFG_SYS_HEAP_ADDR, 8);
void *ptr2 = LOS_MemAlloc(LOSCFG_SYS_HEAP_ADDR, 8);
LOS_MemUsedNodeShow(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接口里申请的且是没有释放的。
# 内存信息统计
## 基础概念
内存信息包括内存池大小、内存使用量、剩余内存大小、最大空闲内存、内存水线、内存节点数统计、碎片率等。
- 内存水线:即内存池的最大使用量,每次申请和释放时,都会更新水线值,实际业务可根据该值,优化内存池大小;
- 碎片率:衡量内存池的碎片化程度,碎片率高表现为内存池剩余内存很多,但是最大空闲内存块很小,可以用公式(fragment=100-100\*最大空闲内存块大小/剩余内存大小)来度量;
- 其他参数:通过调用接口(详见[内存管理](../kernel/kernel-mini-basic-memory-basic.md)章节接口说明),扫描内存池的节点信息,统计出相关信息。
## 功能配置
LOSCFG_MEM_WATERLINE:开关宏,默认打开;若关闭这个功能,在target_config.h中将这个宏定义为0。如需获取内存水线,需要打开该配置。
## 开发指导
### 开发流程
关键结构体介绍:
```
typedef struct {
UINT32 totalUsedSize; // 内存池的内存使用量
UINT32 totalFreeSize; // 内存池的剩余内存大小
UINT32 maxFreeNodeSize; // 内存池的最大空闲内存块大小
UINT32 usedNodeNum; // 内存池的非空闲内存块个数
UINT32 freeNodeNum; // 内存池的空闲内存块个数
#if (LOSCFG_MEM_WATERLINE == 1) // 默认打开,如需关闭,在target_config.h中将该宏设置为0
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 <stdio.h>
#include <string.h>
#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
```
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
- 碎片率:衡量内存池的碎片化程度,碎片率高表现为内存池剩余内存很多,但是最大空闲内存块很小,可以用公式(fragment=100-100\*最大空闲内存块大小/剩余内存大小)来度量; - 碎片率:衡量内存池的碎片化程度,碎片率高表现为内存池剩余内存很多,但是最大空闲内存块很小,可以用公式(fragment=100-100\*最大空闲内存块大小/剩余内存大小)来度量;
- 其他参数:通过调用接口(详见[内存管理](../kernel/kernel-mini-basic-memory-basic.md)章节接口说明),扫描内存池的节点信息,统计出相关信息。 - 其他参数:通过调用接口(详见[内存管理](../kernel/kernel-mini-basic-memory.md)章节接口说明),扫描内存池的节点信息,统计出相关信息。
### 功能配置 ### 功能配置
...@@ -30,7 +30,7 @@ LOSCFG_MEM_WATERLINE:开关宏,默认打开;若关闭这个功能,在tar ...@@ -30,7 +30,7 @@ LOSCFG_MEM_WATERLINE:开关宏,默认打开;若关闭这个功能,在tar
关键结构体介绍: 关键结构体介绍:
``` ```
typedef struct { typedef struct {
UINT32 totalUsedSize; // 内存池的内存使用量 UINT32 totalUsedSize; // 内存池的内存使用量
...@@ -63,7 +63,7 @@ typedef struct { ...@@ -63,7 +63,7 @@ typedef struct {
#### 示例代码 #### 示例代码
代码实现如下: 代码实现如下:
``` ```
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
...@@ -110,7 +110,7 @@ int MemTest(void) ...@@ -110,7 +110,7 @@ int MemTest(void)
编译运行输出的结果如下: 编译运行输出的结果如下:
``` ```
usage = 22, fragment = 3, maxFreeSize = 49056, totalFreeSize = 50132, waterLine = 1414 usage = 22, fragment = 3, maxFreeSize = 49056, totalFreeSize = 50132, waterLine = 1414
``` ```
...@@ -145,7 +145,7 @@ usage = 22, fragment = 3, maxFreeSize = 49056, totalFreeSize = 50132, waterLine ...@@ -145,7 +145,7 @@ usage = 22, fragment = 3, maxFreeSize = 49056, totalFreeSize = 50132, waterLine
调用LOS_MemUsedNodeShow接口输出的节点信息格式如下:每1行为一个节点信息;第1列为节点地址,可以根据这个地址,使用GDB等手段查看节点完整信息;第2列为节点的大小,等于节点头大小+数据域大小;第3~5列为函数调用关系LR地址,可以根据这个值,结合汇编文件,查看该节点具体申请的位置。 调用LOS_MemUsedNodeShow接口输出的节点信息格式如下:每1行为一个节点信息;第1列为节点地址,可以根据这个地址,使用GDB等手段查看节点完整信息;第2列为节点的大小,等于节点头大小+数据域大小;第3~5列为函数调用关系LR地址,可以根据这个值,结合汇编文件,查看该节点具体申请的位置。
``` ```
node size LR[0] LR[1] LR[2] node size LR[0] LR[1] LR[2]
0x10017320: 0x528 0x9b004eba 0x9b004f60 0x9b005002 0x10017320: 0x528 0x9b004eba 0x9b004f60 0x9b005002
...@@ -179,7 +179,7 @@ node size LR[0] LR[1] LR[2] ...@@ -179,7 +179,7 @@ node size LR[0] LR[1] LR[2]
代码实现如下: 代码实现如下:
``` ```
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
...@@ -200,7 +200,7 @@ void MemLeakTest(void) ...@@ -200,7 +200,7 @@ void MemLeakTest(void)
编译运行输出log如下: 编译运行输出log如下:
``` ```
node size LR[0] LR[1] LR[2] node size LR[0] LR[1] LR[2]
0x20001b04: 0x24 0x08001a10 0x080035ce 0x080028fc 0x20001b04: 0x24 0x08001a10 0x080035ce 0x080028fc
...@@ -221,7 +221,7 @@ node size LR[0] LR[1] LR[2] ...@@ -221,7 +221,7 @@ node size LR[0] LR[1] LR[2]
对比两次log,差异如下,这些内存节点就是疑似泄漏的内存块: 对比两次log,差异如下,这些内存节点就是疑似泄漏的内存块:
``` ```
0x20003ac4: 0x1d 0x08001458 0x080014e0 0x080041e6 0x20003ac4: 0x1d 0x08001458 0x080014e0 0x080041e6
0x20003ae0: 0x1d 0x080041ee 0x08000cc2 0x00000000 0x20003ae0: 0x1d 0x080041ee 0x08000cc2 0x00000000
...@@ -229,7 +229,7 @@ node size LR[0] LR[1] LR[2] ...@@ -229,7 +229,7 @@ node size LR[0] LR[1] LR[2]
部分汇编文件如下: 部分汇编文件如下:
``` ```
MemLeakTest: MemLeakTest:
0x80041d4: 0xb510 PUSH {R4, LR} 0x80041d4: 0xb510 PUSH {R4, LR}
...@@ -295,7 +295,7 @@ LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK:开关宏,默认关闭;若打开这 ...@@ -295,7 +295,7 @@ LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK:开关宏,默认关闭;若打开这
代码实现如下: 代码实现如下:
``` ```
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
...@@ -318,7 +318,7 @@ void MemIntegrityTest(void) ...@@ -318,7 +318,7 @@ void MemIntegrityTest(void)
编译运行输出log如下: 编译运行输出log如下:
``` ```
[ERR][OsMemMagicCheckPrint], 2028, memory check error! [ERR][OsMemMagicCheckPrint], 2028, memory check error!
memory used but magic num wrong, magic num = 0x00000000 /* 提示信息,检测到哪个字段被破坏了,用例构造了将下个节点的头4个字节清零,即魔鬼数字字段 */ memory used but magic num wrong, magic num = 0x00000000 /* 提示信息,检测到哪个字段被破坏了,用例构造了将下个节点的头4个字节清零,即魔鬼数字字段 */
......
...@@ -18,13 +18,13 @@ CPU体系架构分为通用架构定义和特定架构定义两层,通用架 ...@@ -18,13 +18,13 @@ CPU体系架构分为通用架构定义和特定架构定义两层,通用架
**表1** CPU体系架构规则 **表1** CPU体系架构规则
| 规则 | 通用体系架构层 | 特定体系架构层 | | 规则 | 通用体系架构层 | 特定体系架构层 |
| -------- | -------- | -------- | | -------- | -------- | -------- |
| 头文件位置 | arch/include | arch/&lt;arch&gt;/&lt;arch&gt;/&lt;toolchain&gt;/ | | 头文件位置 | arch/include | arch/&lt;arch&gt;/&lt;arch&gt;/&lt;toolchain&gt;/ |
| 头文件命名 | los_&lt;function&gt;.h | los_arch_&lt;function&gt;.h | | 头文件命名 | los_&lt;function&gt;.h | los_arch_&lt;function&gt;.h |
| 函数命名 | Halxxxx | Halxxxx | | 函数命名 | Halxxxx | Halxxxx |
LiteOS-M已经支持ARM Cortex-M3、ARM Cortex-M4、ARM Cortex-M7、ARM Cortex-M33、RISC-V等主流架构,如果需要扩展CPU体系架构,请参考[芯片架构适配点](../porting/porting-chip-kernel-overview.md#芯片架构适配点) LiteOS-M已经支持ARM Cortex-M3、ARM Cortex-M4、ARM Cortex-M7、ARM Cortex-M33、RISC-V等主流架构。
## 运行机制 ## 运行机制
......
# 轻量系统内核
- **[内核概述](kernel-mini-overview.md)**
- **[基础内核](kernel-mini-basic.md)**
- **[扩展组件](kernel-mini-extend.md)**
- **[内核调测](kernel-mini-debug.md)**
- **[附录](kernel-mini-app.md)**
\ No newline at end of file
# 基本数据结构
- **[双向链表](kernel-small-apx-dll.md)**
- **[位操作](kernel-small-apx-bitwise.md)**
\ No newline at end of file
# 附录
- **[基本数据结构](kernel-small-apx-structure.md)**
- **[标准库](kernel-small-apx-library.md)**
\ No newline at end of file
# 内存管理
- **[堆内存管理](kernel-small-basic-memory-heap.md)**
- **[物理内存管理](kernel-small-basic-memory-physical.md)**
- **[虚拟内存管理](kernel-small-basic-memory-virtual.md)**
- **[虚实映射](kernel-small-basic-inner-reflect.md)**
\ No newline at end of file
# 进程管理
- **[进程](kernel-small-basic-process-process.md)**
- **[任务](kernel-small-basic-process-thread.md)**
- **[调度器](kernel-small-basic-process-scheduler.md)**
\ No newline at end of file
# 内核通信机制
- **[事件](kernel-small-basic-trans-event.md)**
- **[信号量](kernel-small-basic-trans-semaphore.md)**
- **[互斥锁](kernel-small-basic-trans-mutex.md)**
- **[消息队列](kernel-small-basic-trans-queue.md)**
- **[读写锁](kernel-small-basic-trans-rwlock.md)**
- **[用户态快速互斥锁](kernel-small-basic-trans-user-mutex.md)**
- **[信号](kernel-small-basic-trans-user-signal.md)**
\ No newline at end of file
# 基础内核
- **[中断及异常处理](kernel-small-basic-interrupt.md)**
- **[进程管理](kernel-small-basic-process.md)**
- **[内存管理](kernel-small-basic-memory.md)**
- **[内核通信机制](kernel-small-basic-trans.md)**
- **[时间管理](kernel-small-basic-time.md)**
- **[软件定时器](kernel-small-basic-softtimer.md)**
- **[原子操作](kernel-small-basic-atomic.md)**
\ No newline at end of file
# FAT
## 基本概念
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);
```
> ![icon-note.gif](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个扇区。
# JFFS2
## 基本概念
JFFS2是Journalling Flash File System Version 2(日志文件系统)的缩写,是针对MTD设备的日志型文件系统。
OpenHarmony内核的JFFS2主要应用于NOR FLASH闪存,其特点是:可读写、支持数据压缩、提供了崩溃/掉电安全保护、提供“写平衡”支持等。闪存与磁盘介质有许多差异,直接将磁盘文件系统运行在闪存设备上,会导致性能和安全问题。为解决这一问题,需要实现一个特别针对闪存的文件系统,JFFS2就是这样一种文件系统。
## 运行机制
关于JFFS2文件系统的在存储设备上的实际物理布局,及文件系统本身的规格说明,请参考JFFS2的[官方规格说明文档](https://sourceware.org/jffs2/)
这里仅列举几个对开发者和使用者会有一定影响的JFFS2的重要机制/特征:
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支持硬链接,底层实际占用的物理空间是一份,对于同一个文件的多个硬连接,并不会增加空间的占用;反之,只有当删除了所有的硬链接时,实际物理空间才会被释放。
## 开发指导
对于基于JFFS2和nor flash的开发,总体而言,与其他文件系统非常相似,因为都有VFS层来屏蔽了具体文件系统的差异,对外接口体现也都是标准的POSIX接口。
对于整个裸nor flash设备而言,没有集中的地方来管理和记录分区的信息。因此,需要通过其他的配置方式来传递这部分信息(当前使用的方式是在烧写镜像的时候,使用bootargs参数配置的),然后在代码中调用相应的接口来添加分区,再进行挂载动作。
**制作JFFS2文件系统镜像**
使用mkfs.jffs2工具,制作镜像默认命令如下。页大小默认为4KiB,eraseblock大小默认64KiB。若实际参数与下面不同时,修改相应参数。
```
./mkfs.jffs2 -d rootfs/ -o rootfs.jffs2
```
**表1** 指令含义表(更详细的介绍可以通过mkfs.jffs2 --help来查看)
| 指令 | 含义 |
| -------- | -------- |
| -s | 页大小,不指定默认为4KiB |
| -e | eraseblock大小,不指定默认为64KiB |
| -p | 镜像大小。在镜像文件后面,用0xFF填充至指定大小,不指定则用0xFF填充至eraseblock对齐。 |
| -d | 要制作成文件系统镜像的源目录 |
| -o | 要制成的镜像名称 |
**挂载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
```
# NFS
## 基本概念
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
```
2. 设置单板为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 ---
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上。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 本例默认nfs server已经配置可用,即示例中服务器10.67.212.178上的/home/sqbin/nfs已配置可访问。
>
> mount命令的格式为:
>
>
> ```
> mount <SERVER_IP:SERVER_PATH> <CLIENT_PATH> nfs
> ```
>
> 其中“SERVER_IP”表示服务器的IP地址;“SERVER_PATH”表示服务器端NFS共享目录路径;“CLIENT_PATH”表示设备上的NFS路径,“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服务器上也可以访问,读者可自行体验。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 目前,NFS客户端仅支持NFS v3部分规范要求,因此对于规范支持不全的服务器,无法完全兼容。在开发测试过程中,建议使用Linux的NFS server,其对NFS支持很完善。
# Procfs
## 基本概念
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
```
# Ramfs
## 基本概念
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")
```
> ![icon-caution.gif](public_sys-resources/icon-caution.gif) **注意:**
> - RAMFS只能挂载一次,一次挂载成功后,后面不能继续挂载到其他目录。
>
> - RAMFS属于调测功能,默认配置为关闭,正式产品中不要使用该功能。
# 文件系统
文件系统(File System,或者简称FS),是操作系统中输入输出的一种主要形式,主要负责和内外部的存储设备交互。
文件系统对上通过C库提供的POSIX标准的操作接口,具体可以参考C库的API文档说明。对下,通过内核态的VFS虚拟层,屏蔽了各个具体文件系统的差异。基本架构如下:
**图1** 文件系统的总体结构
![zh-cn_image_0000001125101908](figures/zh-cn_image_0000001125101908.png)
- **[虚拟文件系统](kernel-small-bundles-fs-virtual.md)**
- **[支持的文件系统](kernel-small-bundles-fs-support.md)**
- **[适配新的文件系统](kernel-small-bundles-fs-new.md)**
\ No newline at end of file
# 扩展组件
- **[系统调用](kernel-small-bundles-system.md)**
- **[动态加载与链接](kernel-small-bundles-linking.md)**
- **[虚拟动态共享库](kernel-small-bundles-share.md)**
- **[轻量级进程间通信](kernel-small-bundles-ipc.md)**
- **[文件系统](kernel-small-bundles-fs.md)**
\ No newline at end of file
# 内核态内存调测
- **[内存信息统计](kernel-small-debug-memory-info.md)**
- **[内存泄漏检测](kernel-small-debug-memory-leak.md)**
- **[踩内存检测](kernel-small-debug-memory-corrupt.md)**
\ No newline at end of file
# 其他内核调测手段
- **[临终遗言](kernel-small-debug-trace-other-lastwords.md)**
- **[常见问题](kernel-small-debug-trace-other-faqs.md)**
\ No newline at end of file
# 进程调测
- **[CPU占用率](kernel-small-debug-process-cpu.md)**
\ No newline at end of file
# 系统命令
- **[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-memcheck.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)**
- **[reboot](kernel-small-debug-shell-cmd-reboot.md)**
- **[top](kernel-small-debug-shell-cmd-top.md)**
\ No newline at end of file
# Shell命令使用详解
本章节介绍了系统关键命令的功能、格式、参数范围、使用指南和使用实例。
不在本文档范围内的命令,详见[help](../kernel/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)**
\ No newline at end of file
# 文件命令
- **[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)**
- **[du](kernel-small-debug-shell-file-du.md)**
- **[mv](kernel-small-debug-shell-file-mv.md)**
\ No newline at end of file
# 网络命令
- **[arp](kernel-small-debug-shell-net-arp.md)**
- **[dhclient](kernel-small-debug-shell-net-dhclient.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)**
\ No newline at end of file
# 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-error.md)**
\ No newline at end of file
# 基本概念
Debug版本的musl-libc库为用户提供内存泄漏检测、堆内存统计、踩内存分析以及backtrace功能等维测手段,可以提高用户态内存相关问题的定位效率。
采用了对malloc/free接口进行插桩,保存关键节点信息,然后程序在申请和释放内存时进行内存节点完整性校验,最后在程序结束时通过统计节点信息得到内存统计信息并根据统计信息判断内存是否泄漏的设计思想。
# 常见问题
## UAF(Use after free)
- 申请小块内存(不大于0x1c000字节)
free之后:
读操作:读取free之后的内存大概率是魔术数字(0xFEFEFEFE)
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> free之后的堆内存不会立即释放进堆内存池,会先放至固定长度的队列中,并置魔术数字0xFE,队列满后会将先放至队列中的内存块释放进堆内存池
写操作:无法校验。
- 申请大块内存(大于0x1c000)
堆内存由malloc通过调用mmap接口申请,free之后若仍访问该内存,则用户程序异常(该内存区间已被unmap)。
## Double free
Double free时,用户程序将会异常退出。
## 堆内存节点被踩
- 申请小块内存(不大于0x1c000)
堆内存节点被踩时,用户程序将会异常退出,并输出破坏被踩节点的可能的堆内存申请调用栈,对于野指针踩内存情况无法校验出来。例如用户程序mem_check中存在堆内存越界踩的情况,利用命令行方式可以获得踩内存的可能的具体位置。
```
OHOS # ./mem_check --mwatch
OHOS #
==PID:6== Memory integrity information:
[TID:28 allocated addr: 0x272e1ea0, size: 0x120] The possible attacker was allocated from:
#00: <malloc+0x808>[0x640e8] -> /lib/libc.so
#01: <threadFunc1+0x7c>[0x21d0] -> mem_check
```
可以通过调用栈解析脚本对调用栈信息进行解析。
- 申请大块内存(大于0x1c000)
堆内存由malloc通过mmap接口申请,申请得到的堆内存块前后各置一个size为PAGE_SIZE大小的区间,设置无读写权限,读写操作会触发用户程序异常。
# 运行机制
## 内存泄漏检查
对于每个进程,内存调测模块维护了128个链表(当前系统的线程最大数量为128个),每个链表的索引为线程ID。
申请内存时:保存关键信息到内存节点控制块,根据当前线程ID将内存节点控制块挂到对应链表;
释放内存时:根据需要释放的内存地址匹配内存节点控制块并将该控制块删除。
**图1** 堆内存节点信息链表
![zh-cn_image_0000001165890158](figures/zh-cn_image_0000001165890158.png)
申请内存时,返回地址会被保存到LR寄存器中。进程运行过程中,系统会在内存节点控制块中添加疑似泄漏点对应的lr等信息。如下图所示:
**图2** 堆内存节点信息
![zh-cn_image_0000001165890518](figures/zh-cn_image_0000001165890518.png)
其中,TID表示线程ID;PID表示进程ID;ptr表示申请的内存地址;size表示申请的内存大小;lr[n]表示函数调用栈地址,变量n可以根据具体场景的需要进行配置。
释放内存时,将free等接口的入参指针与node的ptr字段进行匹配,如果相同则删除该内存节点控制块信息。
用户通过串口或文件等方式,将各个进程内存调测信息导出,利用addr2line工具将导出的信息转换成导致内存泄漏的代码行,便可以解决内存泄露问题。
**图3** 泄漏点代码行定位流程
![zh-cn_image_0000001165730464](figures/zh-cn_image_0000001165730464.png)
## 堆内存统计
用户态线程堆内存使用统计具有一定的实际意义,统计线程申请的堆内存占比,为用户程序的内存使用优化提供数据支持。用户态堆内存统计模块主要涉及的接口为malloc和free。如上图所示,每个进程维护128个链表,链表索引即线程ID,申请内存时系统将ptr和size信息记录在内存节点控制块中并将节点控制块挂在以线程ID为头信息的链表上,堆内存释放时根据ptr从对应的链表上移除相应的堆内存块信息;同时计算出当前线程所持有的堆内存总的使用量,并更新当前进程的堆内存使用量和堆内存使用峰值。
## 内存完整性检查
- 使用malloc申请内存(小于等于0x1c000bytes时通过堆分配算法分配)
用户程序申请堆内存时,在堆内存节点处添加校验值等信息,如果校验值异常,则很有可能是前一块堆内存使用越界导致的(目前无法识别校验值被野指针破坏的场景)。在内存申请、释放时校验内存节点校验值的正确性,若内存节点被破坏,校验失败时则输出tid、pid及当前被踩节点前一块堆内存申请时保存的调用栈信息,通过addr2line工具可获得具体的代码行信息,辅助用户解决问题。
**图4** node节点头信息添加校验值
![zh-cn_image_0000001211449151](figures/zh-cn_image_0000001211449151.png)
free堆内存时,不会立即把该内存块释放掉,而是在内存中写入魔术数字0xFE,并放到free队列中(保证在一定时间内不会再被malloc函数分配),当有野指针或use-after-free的情况对该内存进行读取的操作时,能够发现数据异常,但是对于写操作则无法判断出来。
**图5** free流程图
![zh-cn_image_0000001165890904](figures/zh-cn_image_0000001165890904.png)
- 使用malloc申请内存(大于0x1c000bytes时通过mmap申请)
当malloc通过mmap申请大块内存时,在返回给用户使用的内存区间头和尾分别多申请一个页,一个页PAGE_SIZE当前为0x1000,这两个页分别通过mprotect接口设置权限为PROT_NONE(无可读可写权限),可以有效防止内存越界读写问题:越界读写数据时由于无读写权限而导致用户程序异常,根据异常调用栈信息可找到相应的代码逻辑。
**图6** malloc通过mmap机制申请内存的内存布局
![zh-cn_image_0000001211130993](figures/zh-cn_image_0000001211130993.png)
# 接口说明
**表1** 内存调测功能
| 接口名 | 描述 |
| -------- | -------- |
| mem_check_init | 初始化内存检测模块。 |
| watch_mem | 获取线程级堆内存使用信息。 |
| check_leak | 检查是否有堆内存泄漏。 |
| check_heap_integrity | 检查堆内存的完整性。 |
| backtrace | 获取调用栈地址信息。 |
| backtrace_symbols | 根据地址信息获取符号信息。 |
| print_trace | 输出函数调用栈信息。 |
**表2** 调用栈回溯功能
| 接口名 | 描述 |
| -------- | -------- |
| backtrace | 获取调用栈地址信息。 |
| backtrace_symbols | 根据地址信息获取符号信息。 |
| print_trace | 输出函数调用栈信息。 |
# 接口调用方式
## 示例代码
代码功能:显式调用调测模块的相关接口对用户代码进行内存校验。
```
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <debug.h> // 包含提供内存调测接口声明的头文件
#define MALLOC_LEAK_SIZE 0x300
void func(void) {
char *ptr = malloc(MALLOC_LEAK_SIZE);
memset(ptr, '3', MALLOC_LEAK_SIZE);
}
int main()
{
mem_check_init(NULL); // 通过串口输出内存调测信息,必须在用户程序第一次申请堆内存之前调用(一般在main函数入口调用),否则调测信息不准确。
// mem_check_init("/storage/mem_debug.txt"); // 内存调测信息输出到/storage/mem_debug.txt文件中,如果该文件创建失败,则信息通过串口输出。
char *ptr = malloc(MALLOC_LEAK_SIZE);
memset(ptr, '1', MALLOC_LEAK_SIZE);
watch_mem(); // 在当前代码逻辑处查看线程级内存统计信息。
func();
check_heap_integrity(); // 检查堆内存节点完整性。
check_leak(); // 在当前代码逻辑处检查堆内存是否泄漏(一般在程序退出之前校验比较准确,若在malloc和free调用逻辑之间做校验,则结果不准确)。
return 0;
}
```
## 编译
```
$ clang -o mem_check mem_check.c -funwind-tables -rdynamic -g -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 -target arm-liteos --sysroot=/home/<user-name>/directory/out/hispark_taurus/ipcamera_hispark_taurus/sysroot $(clang -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 -target arm-liteos -print-file-name=libunwind.a)
```
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> - 本编译示例基于将编译器的路径写入环境变量中,即.bashrc文件中。
>
> - 编译用户程序及所需的lib库时,需要添加编译选项-funwind-tables,-rdynamic,-g,用于栈回溯。
>
> - -mfloat-abi=softfp,-mcpu=cortex-a7,-mfpu=neon-vfpv4编译选项用于指定具体的芯片架构、浮点数计算优化、fpu,与具体的libc库使用的编译选项保持一致,否则链接时可能出现找不到libc库文件。
>
> - -target arm-liteos用于指定编译器相关库文件路径。
>
> - --sysroot=/home/&lt;user-name&gt;/directory/out/hispark_taurus/ipcamera_hispark_taurus/sysroot用于指定编译器库文件搜索根目录,假设OpenHarmony工程代码存放路径为/home/&lt;user-name&gt;/directory。其中out/hispark_taurus/ipcamera_hispark_taurus路径为在编译时,hb set命令指定的具体产品,本示例选择的是ipcamera_hispark_taurus产品。
>
> - $(clang -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 -target arm-liteos -print-file-name=libunwind.a)用于指定相应的unwind库的路径。
## 调测信息
```
OHOS # ./mem_check
OHOS #
==PID:4== Heap memory statistics(bytes): // 堆内存统计信息
[Check point]: // check点调用栈
#00: <main+0x38>[0x86c] -> mem_check
#01: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so
[TID: 18, Used: 0x320] // 18号线程堆内存占用,当前进程仅一个线程
==PID:4== Total heap: 0x320 byte(s), Peak: 0x320 byte(s)
Check heap integrity ok! // 堆内存完整性检查
==PID:4== Detected memory leak(s): // 内存泄漏信息及调用栈
[Check point]:
#00: <check_leak+0x1c4>[0x2da4c] -> /lib/libc.so
#01: <main+0x44>[0x878] -> mem_check
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <main+0x1c>[0x850] -> mem_check
#01: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <func+0x14>[0x810] -> mem_check
#01: <main+0x3c>[0x870] -> mem_check
#02: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so
==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s).
==PID:4== Detected memory leak(s):
[Check point]:
#00: <check_leak+0x1c4>[0x2da4c] -> /lib/libc.so
#01: <exit+0x28>[0x111ec] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <main+0x1c>[0x850] -> mem_check
#01: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <func+0x14>[0x810] -> mem_check
#01: <main+0x3c>[0x870] -> mem_check
#02: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so
==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s).
Check heap integrity ok!
```
## 调用栈解析
提供parse_mem_info.sh脚本可以对调用栈进行解析,解析脚本存放的路径:kernel/liteos_a/tools/scripts/parse_memory/parse_mem_info.sh。利用脚本可以将相应的调测信息转换成具体的源码行号,如下命令所示,mem_debug.txt保存的是内存调测信息,elf1、elf2等文件是需要解析的elf文件。
```
$ ./parse_mem_info.sh mem_debug.txt elf1 elf2 elf3 ...
```
例如:
```
$ ./parse_mem_info.sh mem_debug.txt mem_check
Compiler is [gcc/llvm]: llvm
Now using addr2line ...
==PID:4== Heap memory statistics(bytes):
[Check point]:
#00: <main+0x38>[0x86c] at /usr1/xxx/TEST_ELF/mem_check.c:22
#01: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so
[TID: 18, Used: 0x320]
==PID:4== Total heap: 0x320 byte(s), Peak: 0x320 byte(s)
Check heap integrity ok!
==PID:4== Detected memory leak(s):
[Check point]:
#00: <check_leak+0x1c4>[0x2da4c] -> /lib/libc.so
#01: <main+0x44>[0x878] at /usr1/xxx/TEST_ELF/mem_check.c:28
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <main+0x1c>[0x850] at /usr1/xxx/TEST_ELF/mem_check.c:17
#01: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <func+0x14>[0x810] at /usr1/xxx/TEST_ELF/mem_check.c:9
#01: <main+0x3c>[0x870] at /usr1/xxx/TEST_ELF/mem_check.c:24
#02: <(null)+0x24baf9dc>[0x219dc] -> /lib/libc.so
==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s).
```
# 命令行参数方式
对用户态进程进行内存相关的检查时,除了接口调用方式还可以通过命令行方式进行内存统计、内存泄漏或内存完整性检查。
```
--mwatch:初始化内存调测功能,注册信号。内存调测信息将从串口输出;
--mrecord <f_path>:初始化内存调测功能,注册信号。内存调测信息将保存至f_path文件,若f_path创建失败,则内存调测信息将从串口输出
```
在待调测的进程未退出时可使用信号机制获取对应信息:
```
kill -35 <pid> # 查看线程级堆内存占用
kill -36 <pid> # 检查是否存在堆内存泄漏
kill -37 <pid> # 检查堆内存头节点是否完整
```
## 示例代码
代码功能:构造内存问题利用命令行方式进行内存调测。
```
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#define MALLOC_LEAK_SIZE 0x300
void func(void) {
char *ptr = malloc(MALLOC_LEAK_SIZE);
memset(ptr, '3', MALLOC_LEAK_SIZE);
}
int main()
{
char *ptr = malloc(MALLOC_LEAK_SIZE);
memset(ptr, '1', MALLOC_LEAK_SIZE);
func();
while (1);
}
```
## 编译
参考[接口调用一节](../kernel/kernel-small-debug-user-guide-use-api.md#编译)
## 使用mwatch参数命令
```
OHOS # ./mem_check --mwatch // 利用task命令可以查到mem_check进程的pid为4
OHOS #
OHOS # kill -35 4 // 查看堆内存统计信息
OHOS #
==PID:4== Heap memory statistics(bytes):
[Check point]:
#00: <arm_signal_process+0x5c>[0x58dfc] -> /lib/libc.so
[TID: 18, Used: 0x640]
==PID:4== Total heap: 0x640 byte(s), Peak: 0x640 byte(s)
OHOS # kill -36 4 // 检查是否存在堆内存泄漏
OHOS #
==PID:4== Detected memory leak(s):
[Check point]:
#00: <check_leak+0x1c4>[0x2da4c] -> /lib/libc.so
#01: <arm_signal_process+0x5c>[0x58dfc] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <main+0x14>[0x724] -> mem_check
#01: <(null)+0x2555a9dc>[0x219dc] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <func+0x14>[0x6ec] -> mem_check
#01: <main+0x30>[0x740] -> mem_check
#02: <(null)+0x2555a9dc>[0x219dc] -> /lib/libc.so
==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s).
OHOS # kill -37 4 // 检查堆内存头节点的完整性
OHOS #
Check heap integrity ok!
```
## 调用栈解析
将调测信息保存至test.txt文件中,利用脚本进行解析,获取内存泄漏的具体行号。
```
$ ./parse_mem_info.sh test.txt mem_check
Compiler is [gcc/llvm]: llvm
Now using addr2line ...
==PID:4== Detected memory leak(s):
[Check point]:
#00: <check_leak+0x1c4>[0x2da4c] -> /lib/libc.so
#01: <arm_signal_process+0x5c>[0x58dfc] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <main+0x14>[0x724] at /usr1/xxx/TEST_ELF/mem_check.c:14
#01: <(null)+0x2555a9dc>[0x219dc] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <func+0x14>[0x6ec] at /usr1/xxx/TEST_ELF/mem_check.c:8
#01: <main+0x30>[0x740] at /usr1/xxx/TEST_ELF/mem_check.c:19
#02: <(null)+0x2555a9dc>[0x219dc] -> /lib/libc.so
==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s).
```
## 使用mrecord参数命令
1. 执行用户程序并指定记录内存调测信息的文件路径
```
OHOS # ./mem_check --mrecord /storage/check.txt
```
2. 利用kill -35 &lt;pid&gt;统计内存信息,该信息将会输出到文件中,使用cat命令查看
```
OHOS # kill -35 4
OHOS # Memory statistics information saved in /storage/pid(4)_check.txt
OHOS # cat /storage/pid(4)_check.txt
==PID:4== Heap memory statistics(bytes):
[Check point]:
#00: <arm_signal_process+0x5c>[0x5973c] -> /lib/libc.so
[TID: 18, Used: 0x640]
==PID:4== Total heap: 0x640 byte(s), Peak: 0x640 byte(s)
```
3. 利用kill -36 &lt;pid&gt;校验内存完整性,该信息将会输出到文件中,使用cat命令查看
```
OHOS # kill -36 4
OHOS # Leak check information saved in /storage/pid(4)_check.txt
OHOS # cat /storage/pid(4)_check.txt
==PID:4== Heap memory statistics(bytes):
[Check point]:
#00: <arm_signal_process+0x5c>[0x5973c] -> /lib/libc.so
[TID: 18, Used: 0x640]
==PID:4== Total heap: 0x640 byte(s), Peak: 0x640 byte(s)
==PID:4== Detected memory leak(s):
[Check point]:
#00: <check_leak+0x1c4>[0x2e38c] -> /lib/libc.so
#01: <arm_signal_process+0x5c>[0x5973c] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <main+0x14>[0x724] -> mem_check
#01: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <func+0x14>[0x6ec] -> mem_check
#01: <main+0x30>[0x740] -> mem_check
#02: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so
==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s).
```
4. 利用kill -9 &lt;pid&gt;杀掉当前进程,进程退出后会默认校验内存完整性,该信息将会输出到文件中,使用cat命令查看
```
OHOS # kill -9 4
OHOS # Leak check information saved in /storage/pid(4)_check.txt
Check heap integrity ok!
OHOS # cat /storage/pid(4)_check.txt
OHOS #
==PID:4== Heap memory statistics(bytes):
[Check point]:
#00: <arm_signal_process+0x5c>[0x5973c] -> /lib/libc.so
[TID: 18, Used: 0x640]
==PID:4== Total heap: 0x640 byte(s), Peak: 0x640 byte(s)
==PID:4== Detected memory leak(s):
[Check point]:
#00: <check_leak+0x1c4>[0x2e38c] -> /lib/libc.so
#01: <arm_signal_process+0x5c>[0x5973c] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <main+0x14>[0x724] -> mem_check
#01: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <func+0x14>[0x6ec] -> mem_check
#01: <main+0x30>[0x740] -> mem_check
#02: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so
==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s).
==PID:4== Detected memory leak(s):
[Check point]:
#00: <check_leak+0x1c4>[0x2e38c] -> /lib/libc.so
#01: <exit+0x28>[0x11b2c] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <main+0x14>[0x724] -> mem_check
#01: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so
[TID:18 Leak:0x320 byte(s)] Allocated from:
#00: <func+0x14>[0x6ec] -> mem_check
#01: <main+0x30>[0x740] -> mem_check
#02: <(null)+0x1fdd231c>[0x2231c] -> /lib/libc.so
==PID:4== SUMMARY: 0x640 byte(s) leaked in 2 allocation(s).
```
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 上述连续记录的信息会逐步追加到初始化时所指定的文件中,故最后cat文件时,文件中还包含历史记录的信息内容。
# 使用说明
编译OpenHarmony工程时默认编译的是debug版本,即libc库已经集成内存调测相关的接口实现,用户可以根据具体需要决定是否使能内存调测功能。
堆内存调测功能提供两种方式供用户使用:接口调用及命令行参数。
- 接口调用:优点是可以较精确的检查某一段代码逻辑的堆内存相关信息,缺点是需要修改用户代码。
- 命令行参数:优点是无需修改用户代码,缺点是无法精确的校验某一段逻辑的堆内存信息。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 内存调测功能使能后,进程退出时会默认进行一次堆内存泄漏和堆内存完整性检查。内存调测功能未使能时,堆内存统计、堆内存泄漏检查、堆内存完整性校验功能不会开启,调用相关调测接口无响应。
- **[接口调用方式](kernel-small-debug-user-guide-use-api.md)**
- **[命令行参数方式](kernel-small-debug-user-guide-use-cli.md)**
\ No newline at end of file
# 使用指导
- **[接口说明](kernel-small-debug-user-guide-api.md)**
- **[使用说明](kernel-small-debug-user-guide-use.md)**
\ No newline at end of file
...@@ -72,24 +72,24 @@ Debug版本的musl-libc库为用户提供内存泄漏检测、堆内存统计、 ...@@ -72,24 +72,24 @@ Debug版本的musl-libc库为用户提供内存泄漏检测、堆内存统计、
**表1** 内存调测功能 **表1** 内存调测功能
| 接口名 | 描述 | | 接口名 | 描述 |
| -------- | -------- | | -------- | -------- |
| mem_check_init | 初始化内存检测模块。 | | mem_check_init | 初始化内存检测模块。 |
| watch_mem | 获取线程级堆内存使用信息。 | | watch_mem | 获取线程级堆内存使用信息。 |
| check_leak | 检查是否有堆内存泄漏。 | | check_leak | 检查是否有堆内存泄漏。 |
| check_heap_integrity | 检查堆内存的完整性。 | | check_heap_integrity | 检查堆内存的完整性。 |
| backtrace | 获取调用栈地址信息。 | | backtrace | 获取调用栈地址信息。 |
| backtrace_symbols | 根据地址信息获取符号信息。 | | backtrace_symbols | 根据地址信息获取符号信息。 |
| print_trace | 输出函数调用栈信息。 | | print_trace | 输出函数调用栈信息。 |
**表2** 调用栈回溯功能 **表2** 调用栈回溯功能
| 接口名 | 描述 | | 接口名 | 描述 |
| -------- | -------- | | -------- | -------- |
| backtrace | 获取调用栈地址信息。 | | backtrace | 获取调用栈地址信息。 |
| backtrace_symbols | 根据地址信息获取符号信息。 | | backtrace_symbols | 根据地址信息获取符号信息。 |
| print_trace | 输出函数调用栈信息。 | | print_trace | 输出函数调用栈信息。 |
### 使用说明 ### 使用说明
...@@ -109,11 +109,6 @@ Debug版本的musl-libc库为用户提供内存泄漏检测、堆内存统计、 ...@@ -109,11 +109,6 @@ Debug版本的musl-libc库为用户提供内存泄漏检测、堆内存统计、
> 内存调测功能使能后,进程退出时会默认进行一次堆内存泄漏和堆内存完整性检查。内存调测功能未使能时,堆内存统计、堆内存泄漏检查、堆内存完整性校验功能不会开启,调用相关调测接口无响应。 > 内存调测功能使能后,进程退出时会默认进行一次堆内存泄漏和堆内存完整性检查。内存调测功能未使能时,堆内存统计、堆内存泄漏检查、堆内存完整性校验功能不会开启,调用相关调测接口无响应。
- **[接口调用方式](kernel-small-debug-user-guide-use-api.md)**
- **[命令行参数方式](kernel-small-debug-user-guide-use-cli.md)**
#### 接口调用方式 #### 接口调用方式
...@@ -123,7 +118,7 @@ Debug版本的musl-libc库为用户提供内存泄漏检测、堆内存统计、 ...@@ -123,7 +118,7 @@ Debug版本的musl-libc库为用户提供内存泄漏检测、堆内存统计、
代码功能:显式调用调测模块的相关接口对用户代码进行内存校验。 代码功能:显式调用调测模块的相关接口对用户代码进行内存校验。
``` ```
#include <pthread.h> #include <pthread.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -155,7 +150,7 @@ int main() ...@@ -155,7 +150,7 @@ int main()
##### 编译 ##### 编译
``` ```
$ clang -o mem_check mem_check.c -funwind-tables -rdynamic -g -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 -target arm-liteos --sysroot=/home/<user-name>/directory/out/hispark_taurus/ipcamera_hispark_taurus/sysroot $(clang -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 -target arm-liteos -print-file-name=libunwind.a) $ clang -o mem_check mem_check.c -funwind-tables -rdynamic -g -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 -target arm-liteos --sysroot=/home/<user-name>/directory/out/hispark_taurus/ipcamera_hispark_taurus/sysroot $(clang -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 -target arm-liteos -print-file-name=libunwind.a)
``` ```
...@@ -177,7 +172,7 @@ $ clang -o mem_check mem_check.c -funwind-tables -rdynamic -g -mfloat-abi=softfp ...@@ -177,7 +172,7 @@ $ clang -o mem_check mem_check.c -funwind-tables -rdynamic -g -mfloat-abi=softfp
##### 调测信息 ##### 调测信息
``` ```
OHOS # ./mem_check OHOS # ./mem_check
OHOS # OHOS #
...@@ -232,14 +227,14 @@ Check heap integrity ok! ...@@ -232,14 +227,14 @@ Check heap integrity ok!
提供parse_mem_info.sh脚本可以对调用栈进行解析,解析脚本存放的路径:kernel/liteos_a/tools/scripts/parse_memory/parse_mem_info.sh。利用脚本可以将相应的调测信息转换成具体的源码行号,如下命令所示,mem_debug.txt保存的是内存调测信息,elf1、elf2等文件是需要解析的elf文件。 提供parse_mem_info.sh脚本可以对调用栈进行解析,解析脚本存放的路径:kernel/liteos_a/tools/scripts/parse_memory/parse_mem_info.sh。利用脚本可以将相应的调测信息转换成具体的源码行号,如下命令所示,mem_debug.txt保存的是内存调测信息,elf1、elf2等文件是需要解析的elf文件。
``` ```
$ ./parse_mem_info.sh mem_debug.txt elf1 elf2 elf3 ... $ ./parse_mem_info.sh mem_debug.txt elf1 elf2 elf3 ...
``` ```
例如: 例如:
``` ```
$ ./parse_mem_info.sh mem_debug.txt mem_check $ ./parse_mem_info.sh mem_debug.txt mem_check
Compiler is [gcc/llvm]: llvm Compiler is [gcc/llvm]: llvm
...@@ -322,7 +317,7 @@ int main() ...@@ -322,7 +317,7 @@ int main()
##### 编译 ##### 编译
参考[接口调用一节](../kernel/kernel-small-debug-user-guide-use-api.md#编译) 参考接口调用章节里的编译
##### 使用mwatch参数命令 ##### 使用mwatch参数命令
...@@ -534,7 +529,7 @@ Double free时,用户程序将会异常退出。 ...@@ -534,7 +529,7 @@ Double free时,用户程序将会异常退出。
- 申请小块内存(不大于0x1c000) - 申请小块内存(不大于0x1c000)
堆内存节点被踩时,用户程序将会异常退出,并输出破坏被踩节点的可能的堆内存申请调用栈,对于野指针踩内存情况无法校验出来。例如用户程序mem_check中存在堆内存越界踩的情况,利用命令行方式可以获得踩内存的可能的具体位置。 堆内存节点被踩时,用户程序将会异常退出,并输出破坏被踩节点的可能的堆内存申请调用栈,对于野指针踩内存情况无法校验出来。例如用户程序mem_check中存在堆内存越界踩的情况,利用命令行方式可以获得踩内存的可能的具体位置。
``` ```
OHOS # ./mem_check --mwatch OHOS # ./mem_check --mwatch
OHOS # OHOS #
......
# 调测与工具
- **[Shell](kernel-small-debug-shell.md)**
- **[Trace调测](kernel-small-debug-trace.md)**
- **[Perf调测](kernel-mini-memory-perf.md)**
- **[LMS调测](kernel-small-memory-lms.md)**
- **[进程调测](kernel-small-debug-process-cpu.md)**
- **[内核态内存调测](kernel-small-debug-memory.md)**
- **[用户态内存调测](kernel-small-debug-user.md)**
- **[其他内核调测手段](kernel-small-debug-other.md)**
\ No newline at end of file
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
使用链接脚本将如下init启动代码放置到系统镜像指定位置。 使用链接脚本将如下init启动代码放置到系统镜像指定位置。
``` ```
#define LITE_USER_SEC_ENTRY __attribute__((section(".user.entry"))) #define LITE_USER_SEC_ENTRY __attribute__((section(".user.entry")))
LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args) LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args)
...@@ -38,7 +38,7 @@ LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args) ...@@ -38,7 +38,7 @@ LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args)
- 启动关键系统程序或服务,如交互进程shell。 - 启动关键系统程序或服务,如交互进程shell。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 在OpenHarmony 中**init**进程通过读取/etc/init.cfg,根据配置执行指定命令,或启动指定进程(详见:[init启动引导](../subsystems/subsys-boot-init.md))。 > 在OpenHarmony 中**init**进程通过读取/etc/init.cfg,根据配置执行指定命令,或启动指定进程(详见:[init启动引导](../subsystems/subsys-boot-init-cfg.md))。
- 监控回收孤儿进程,清理子进程中的僵尸进程。 - 监控回收孤儿进程,清理子进程中的僵尸进程。
...@@ -48,7 +48,7 @@ LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args) ...@@ -48,7 +48,7 @@ LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args)
用户态程序启动有如下常见方式: 用户态程序启动有如下常见方式:
- shell命令启动进程。 - shell命令启动进程。
``` ```
OHOS $ exec helloworld OHOS $ exec helloworld
OHOS $ ./helloworld OHOS $ ./helloworld
......
# 内核启动
- **[内核态启动](kernel-small-start-kernel.md)**
- **[用户态启动](kernel-small-start-user.md)**
\ No newline at end of file
# 小型系统内核
- **[内核概述](kernel-small-overview.md)**
- **[内核启动](kernel-small-start.md)**
- **[基础内核](kernel-small-basics.md)**
- **[扩展组件](kernel-small-bundles.md)**
- **[调测与工具](kernel-small-debug.md)**
- **[附录](kernel-small-apx.md)**
\ No newline at end of file
# 内核增强特性
- **[内存管理](kernel-standard-mm.md)**
- **[任务调度](kernel-standard-sched.md)**
\ No newline at end of file
# 内存管理
- **[Enhanced SWAP特性介绍](kernel-standard-mm-eswap.md)**
\ No newline at end of file
# 任务调度
- **[关联线程组调度特性介绍](kernel-standard-sched-rtg.md)**
- **[CPU轻量级隔离特性介绍](kernel-standard-sched-cpuisolation.md)**
# 标准系统内核
- **[Linux内核概述](kernel-standard-overview.md)**
- **[开发板Patch使用指导](kernel-standard-patch.md)**
- **[Linux内核编译与构建指导](kernel-standard-build.md)**
- **[内核增强特性](kernel-standard-enhanced-features.md)**
# 内核
- **[轻量系统内核](kernel-mini.md)**
- **[小型系统内核](kernel-small.md)**
- **[标准系统内核](kernel-standard.md)**
\ No newline at end of file
...@@ -473,7 +473,69 @@ LOSCFG_DRIVERS_HDF_PLATFORM=y ...@@ -473,7 +473,69 @@ LOSCFG_DRIVERS_HDF_PLATFORM=y
lwIP组件的源码在`//third_party/lwip`,OpenHarmony在kernel中做了定制化,`//kernel/liteos_m/components/net/lwip-2.1`,包括一些接口的重定义,结构体的重定义等。 lwIP组件的源码在`//third_party/lwip`,OpenHarmony在kernel中做了定制化,`//kernel/liteos_m/components/net/lwip-2.1`,包括一些接口的重定义,结构体的重定义等。
移植过程可参考:[lwIP组件适配](porting-chip-board-lwip.md) lwIP组件适配:
lwIP是一个小型开源的TCP/IP协议栈,LiteOS-M已对开源lwIP做了适配和功能增强,lwIP代码分为两部分:
- third_party/lwip目录下是lwIP开源代码,里面只做了少量的侵入式修改,为了适配增强功能。
- kernel/liteos_m/components/net/lwip-2.1目录下是lwIP适配和功能增强代码,里面提供了lwIP的默认配置文件。
如果需要使用lwIP组件,请按如下步骤适配:
1. 在产品目录下新建一个目录用来存放产品的适配文件,如lwip_adapter。
2. 在lwip_adapter目录下新建一个目录include,用来存放适配的头文件。
3. 在include目录下新建目录lwip,并在lwip目录下新建头文件lwipopts.h,代码如下所示,如果默认配置不能满足产品使用,可自行根据产品使用情况修改配置,如关闭DHCP功能。
```
#ifndef _LWIP_ADAPTER_LWIPOPTS_H_
#define _LWIP_ADAPTER_LWIPOPTS_H_
#include_next "lwip/lwipopts.h"
#undef LWIP_DHCP#define LWIP_DHCP 0 // 关闭DHCP功能
#endif /* _LWIP_ADAPTER_LWIPOPTS_H_ */
```
4. 将kernel/liteos_m/components/net/lwip-2.1目录下的BUILD.gn复制到lwip_adapter目录下,并按如下修改。
```
import("//kernel/liteos_m/liteos.gni")
import("$LITEOSTHIRDPARTY/lwip/lwip.gni")
import("$LITEOSTOPDIR/components/net/lwip-2.1/lwip_porting.gni")
module_switch = defined(LOSCFG_NET_LWIP_SACK)
module_name = "lwip"kernel_module(module_name) {
sources = LWIP_PORTING_FILES + LWIPNOAPPSFILES - [ "$LWIPDIR/api/sockets.c" ]
include_dirs = [ "//utils/native/lite/include" ]
}
#添加新增加的适配头文件路径include
config("public") {
include_dirs = [ "include" ] + LWIP_PORTING_INCLUDE_DIRS + LWIP_INCLUDE_DIRS
}
```
5. 在产品的配置文件(如config.json)中设置lwIP的编译路径,即步骤4中BUILD.gn的路径。
```
{
"subsystem": "kernel",
"components": [
{ "component": "liteos_m", "features":["ohos_kernel_liteos_m_lwip_path = \"//xxx/lwip_adapter\"" ] }
]
},
```
6. 在产品的内核编译配置文件中,如kernel_config/debug.config,打开编译lwIP的开关。
```
LOSCFG_NET_LWIP=y
```
本案例在config.json中设置lwIP的路径如下: 本案例在config.json中设置lwIP的路径如下:
......
# 三方组件适配
如果需要使用third_party目录下与产品相关的三方组件,可能需要对三方组件进行适配,下面以比较常用的mbedtls为例,介绍下适配步骤,注意本小节中仅介绍如何将适配的代码与OpenHarmony的编译框架融合,不会详细介绍mbedtls本身的原理和适配代码的具体逻辑,这些内容请参考mbedtls官方网站上的适配指南。
1. 编写适配层代码
根据mbedtls官网的适配指南,编写需要的适配层代码,以适配硬件随机数举例,下面的路径都是相对third_party/mbedtls的路径:
1. 拷贝include/mbedtls/config.h到ports目录下,并修改打开MBEDTLS_ENTROPY_HARDWARE_ALT开关。
2. 在ports目录下创建entropy_poll_alt.c文件include并实现entropy_poll.h中的硬件随机数接口
3. 在BUILD.gn中的mbedtls_sources中增加刚才适配的entropy_poll_alt.c的路径
4. 在BUILD.gn中的lite_library("mbedtls_static")中增加一行MBEDTLS_CONFIG_FILE指定新配置文件的位置
```
lite_library("mbedtks_static") {
...
defines += ["MBEDTLS_CONFIG_FILE=<../port/config.h>"]
...
}
```
注意,上面的修改最好都新建一个config或者新建一个xxx_alt.c文件来修改,不要直接在原先的代码中修改,侵入式的修改会导致后续版本升级出现大量零散冲突,增加升级维护成本。
2. 制作patch
由于上面的适配是硬件相关的,上库代码时,不能直接放到通用的third_party/mbedtls目录中,因此需要将上面的修改制作成patch,在编译之前通过打patch的方式注入到代码中。
1. 首先增加设备的patch配置文件device/&lt;company&gt;/&lt;board&gt;/patch.yml
2. 编辑device/&lt;company&gt;/&lt;board&gt;/patch.yml,增加要打的patch的信息:
```
# 需要打patch的路径,路径均为相对代码根目录的路径
third_party/mbedtls:
# 该路径下需要打的patch存放路径
- device/<company>/<board>/third_party/mbedtls/adapter.patch
third_party/wpa_supplicant:
# 当一个路径下有多个patch的时候会依次执行patch
- device/<company>/<board>/third_party/wpa_supplicant/xxxxx.patch
- device/<company>/<board>/third_party/wpa_supplicant/yyyyy.patch
...
```
3. 制作上述**步骤1**修改的patch并放到对应的目录即可
3. 使用带patch的编译
想要在编译的时候带上patch,其他步骤不变,仅需要在触发编译的时候加上 --patch,例如全编译的命令编程
```
hb build -f --patch
```
> ![icon-caution.gif](public_sys-resources/icon-caution.gif) **注意:**
> 最后一次打patch的产品信息会被记录,在进行下一次编译操作时,会对上一次的patch进行回退(即执行`patch -p1 -R &lt; xxx`),回退patch失败或新增patch失败均会终止编译过程,请解决patch冲突后再次尝试编译。
# 系统组件调用
系统组件为上层应用提供基础能力,包括SAMGR(系统服务框架子系统)、DFX子系统等。在板级系统移植过程中,只需要选择使用即可,不用对其进行适配。
## SAMGR
**基本介绍**
系统服务框架基于面向服务的架构,提供了服务开发、服务的子功能开发、对外接口的开发、以及多服务共进程、进程间服务调用等开发能力。
> ![icon-notice.gif](public_sys-resources/icon-notice.gif) **须知:**
> 本组件在板级系统移植中必须要使用,否则其他服务组件无法运行。
**SAMGR使用说明,请参考:[SAMGR 使用指导](https://gitee.com/openharmony/systemabilitymgr_samgr_lite/blob/master/README_zh.md)**
## DFX
**基本介绍**
DFX子系统主要包含DFR(Design for Reliability,可靠性)和DFT(Design for Testability,可测试性)特性,为开发者提供代码维测信息。
**DFX子系统使用说明,请参考:[DFX子系统使用指导 ](../subsystems/subsys-dfx-overview.md)**
\ No newline at end of file
# 板级驱动适配
板级驱动适配的主要步骤如下:
1. SDK基于OpenHarmony提供的CMSIS/POSIX适配依赖OS的接口。
板级SDK适配OS接口存在两种选择:CMSIS、POSIX,当前liteos_m已经适配CMSIS大部分接口(覆盖:基础内核管理、线程管理、定时器、事件、互斥锁、信号量、队列等),基本可以满足直接移植,POSIX接口当前具备初步的移植能力,接口正在补全中;如果SDK原本基于CMSIS或者POSIX接口实现,理论上可以直接适配到liteos_m中;
如果SDK原本基于freeRTOS等其他嵌入式OS或者本身有一层OS interface的抽象层,建议将依赖OS接口直接适配到CMSIS接口;
例如,某产品定义的OS interface接口,创建queue的接口原型:
```
bool osif_msg_queue_create(void **pp_handle, uint32_t msg_num, uint32_t msg_size)
```
而CMSIS提供的接口原型如下:
```
osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr);
```
对应的OS interface接口的原型可以按照如下适配:
```
#include "CMSIS_os2.h"
osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr);
bool osif_msg_queue_create(void **pp_handle, uint32_t msg_num, uint32_t msg_size)
{
(*pp_handle) = osMessageQueueNew (msg_num, msg_size, NULL);
if((*pp_handle) == NULL){
return FALSE;
}
return TRUE;
}
```
2. 接口SDK编译问题或者基于OpenHarmony编译框架改造SDK,将SDK按照目录结构要求合入OpenHarmony的device目录中。
OS接口适配后,板级驱动集成到OpenHarmony也存在2种选择:
- SDK独立编译,通过二进制形式直接链入OpenHarmony;
- SDK基于OpenHarmony改造编译框架,从长期演进及后期联调便利性角度考虑,建议基于GN编译框架直接改造SDK编译框架,通过源码形式链入OpenHarmony工程。
3. 验证SDK基本功能。
# HAL层实现
HAL层主要功能是实现轻OpenHarmony与芯片的解耦,以下模块描述的是轻OpenHarmony系统对芯片接口的依赖情况。
## UTILS
**基本介绍:**
公共基础提供通用的基础组件,这些基础组件可被各业务子系统及上层应用所使用。基础组件依赖芯片文件系统实现,需要芯片平台提供实现文件的打开、关闭、读写、获取大小等功能。
**公共基础HAL层接口说明:**
需要芯片适配相关接口的实现,对芯片文件系统接口依赖请参考[utils的HAL头文件](https://gitee.com/openharmony/utils_native_lite/tree/master/hals/file)
## IOT外设子系统
**基本介绍**
提供轻OpenHarmony专有的外部设备操作接口。本模块提供设备操作接口有:FLASH, GPIO, I2C, PWM, UART, WATCHDOG等。
**IOT外设子系统HAL层接口说明**:
需要芯片适配相关接口的实现,对芯片设备外设接口依赖请参考[IOT外设子系统的HAL头文件](https://gitee.com/openharmony/iothardware_peripheral/tree/master/interfaces/inner_api)
## WLAN服务
**基本介绍:**
WLAN服务适用于设备接入WLAN无线局域网场景,包括:
- 使用STA模式,作为接入方接入其他设备、路由器开启的WLAN无线局域网接入点;
- 使用AP模式,开启无线局域网接入点,允许其他设备连接。
借助WLAN服务,开发者可以实现对系统中WLAN的控制,包括开启关闭、扫描发现、连接断开等功能。
此外,WLAN服务还包括事件listen功能,开发者可以listen WLAN的状态,并在状态发生变化时立刻感知。
**WLAN服务HAL层接口说明:**
代码路径及接口定义如下:
```
foundation/communication/interfaces/kits/wifi_lite/wifiservice/
├── station_info.h
├── wifi_device_config.h
├── wifi_device.h
├── wifi_error_code.h
├── wifi_event.h
├── wifi_hotspot_config.h
├── wifi_hotspot.h
├── wifi_linked_info.h
└── wifi_scan_info.h
```
具体的实现需要各厂家按照定义的接口在vendor/\*\*\*/\*\*\*/\*\*\*_adapter中实现,例如hi3861中具体实现在
```
vendor/hisi/hi3861/hi3861_adapter/hals/communication/wifi_lite/wifiservice/
├── BUILD.gn
└── source
├── wifi_device.c
├── wifi_device_util.c
├── wifi_device_util.h
└── wifi_hotspot.c
```
需要芯片适配相关接口的实现,对芯片设备外设接口依赖请参考[WLAN服务的头文件](https://gitee.com/openharmony/communication_wifi_lite/tree/master/interfaces/wifiservice)
# lwIP组件适配
lwIP是一个小型开源的TCP/IP协议栈,LiteOS-M已对开源lwIP做了适配和功能增强,lwIP代码分为两部分:
- third_party/lwip目录下是lwIP开源代码,里面只做了少量的侵入式修改,为了适配增强功能。
- kernel/liteos_m/components/net/lwip-2.1目录下是lwIP适配和功能增强代码,里面提供了lwIP的默认配置文件。
如果需要使用lwIP组件,请按如下步骤适配:
1. 在产品目录下新建一个目录用来存放产品的适配文件,如lwip_adapter。
2. 在lwip_adapter目录下新建一个目录include,用来存放适配的头文件。
3. 在include目录下新建目录lwip,并在lwip目录下新建头文件lwipopts.h,代码如下所示,如果默认配置不能满足产品使用,可自行根据产品使用情况修改配置,如关闭DHCP功能。
```
#ifndef _LWIP_ADAPTER_LWIPOPTS_H_
#define _LWIP_ADAPTER_LWIPOPTS_H_
#include_next "lwip/lwipopts.h"
#undef LWIP_DHCP#define LWIP_DHCP 0 // 关闭DHCP功能
#endif /* _LWIP_ADAPTER_LWIPOPTS_H_ */
```
4. 将kernel/liteos_m/components/net/lwip-2.1目录下的BUILD.gn复制到lwip_adapter目录下,并按如下修改。
```
import("//kernel/liteos_m/liteos.gni")
import("$LITEOSTHIRDPARTY/lwip/lwip.gni")
import("$LITEOSTOPDIR/components/net/lwip-2.1/lwip_porting.gni")
module_switch = defined(LOSCFG_NET_LWIP_SACK)
module_name = "lwip"kernel_module(module_name) {
sources = LWIP_PORTING_FILES + LWIPNOAPPSFILES - [ "$LWIPDIR/api/sockets.c" ]
include_dirs = [ "//utils/native/lite/include" ]
}
#添加新增加的适配头文件路径include
config("public") {
include_dirs = [ "include" ] + LWIP_PORTING_INCLUDE_DIRS + LWIP_INCLUDE_DIRS
}
```
5. 在产品的配置文件(如config.json)中设置lwIP的编译路径,即步骤4中BUILD.gn的路径。
```
{
"subsystem": "kernel",
"components": [
{ "component": "liteos_m", "features":["ohos_kernel_liteos_m_lwip_path = \"//xxx/lwip_adapter\"" ] }
]
},
```
6. 在产品的内核编译配置文件中,如kernel_config/debug.config,打开编译lwIP的开关。
```
LOSCFG_NET_LWIP=y
```
# 移植概述
## 板级移植流程
最小系统移植完成后,下一步进行板级系统移植,板级系统移植包含以下几步操作:
1. 板级驱动适配。
2. HAL层实现。
3. XTS测试套。
4. 业务功能验证。
**图1** 单板驱动适配流程
![zh-cn_image_0000001200417969](figures/zh-cn_image_0000001200417969.png)
## 板级目录规范
板级系统编译适配参考[编译系统介绍](../porting/porting-chip-prepare-process.md),板级相关的驱动、SDK、目录、HAL实现存放在device目录,目录结构和具体描述如下:
```
.
├── device --- 单板样例
│ └── xxx --- <单板厂商名>
│ └── xxx --- <单板名>,里面包含liteos-m内核的,并且能够运行的demo
│ ├── BUILD.gn --- 定义单板的编译配置文件
│ ├── board --- 板子特定的实现(可选,如果本单板直接提供产品级demo,则相关应用层实现放在此目录)
│ ├── liteos_m --- 根据BUILD.gn文件中的kernel_type,使用liteos_m内核
│ │ └── config.gni --- 编译选项
│ ├── libraries --- 板级SDK
│ │ └── include --- SDK提供对外头文件
│ │ └── ... --- binary or source
│ ├── main.c --- main函数入口(如果产品级存在相同定义,则使用产品级配置)
│ ├── target_config.h --- 板级内核配置
│ ├── project --- 单板级工程配置文件(如果产品级存在相同定义,则使用产品级配置)
│ └── adapter --- 单板适配上层应用组件的适配层接口,根据能力可选
│ └── hals
│ ├── communication
│ │ └── wifi_lite
│ │ ├── ...
│ └── iot_hardware
│ ├── upgrade
│ ├── utils
│ └── wifiiot_lite
├── vendor --- 提供端到端的OpenHarmony特性产品样例
│ └── huawei --- 厂商名字
│ └── wifiiot --- wifiiot表示特性产品
│ ├── app
│ │ └── main.c --- 产品的main函数入口
│ ├── project --- 工程配置文件
│ ├── BUILD.gn --- 工程编译入口
│ └── config.json --- 定义产品的编译配置文件,配置产品所使用的组件等。
└── out --- 编译过程中的输出目录
├── ... --- 单板/产品编译产生的bin等
```
# XTS认证
## XTS简介
XTS是OpenHarmony生态认证测试套件的集合,当前包括acts(application compatibility test suite)应用兼容性测试套。test/xts仓当前包括acts与tools软件包:
- acts,存放acts相关测试用例源码与配置文件,其目的是帮助终端设备厂商尽早发现软件与OpenHarmony的不兼容性,确保软件在整个开发过程中满足OpenHarmony的兼容性要求。
- tools,存放acts相关测试用例开发框架。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> XTS的启动依赖SAMGR系统服务。
适配分为两步,包括:
1. 将XTS认证子系统加入编译组件中。
2. 执行联接类模组acts测试用例。
### 将XTS认证子系统加入编译组件中
举例:将XTS认证子系统加入hispark_aries产品编译组件中为例。
1. 在vendor/hisilicon/hispark_aries/config.json中加入XTS认证子系统定义:
```
{
"subsystem": "test",
"components": [
{ "component": "xts_acts", "features":[] },
{ "component": "xts_tools", "features":[] }
]
},
```
2. Debug版本才会触发XTS认证子系统编译;
### 执行联接类模组acts测试用例
举例:以hispark_aries产品执行联接类模组acts测试用例为例。
1. 获取编译镜像。
请在如下目录获取版本镜像:out/hispark_pegasus/wifiiot_hispark_pegasus/。
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 判断当前版本镜像是否集成acts测试套件方法:在map文件中查看对应.a是否被编译即可。
2. 版本镜像烧录进开发板。
3. 测试步骤。
(1)使用串口工具登录开发板,并保存串口打印信息。
(2)重启设备,查看串口日志。
4. 测试结果分析指导。
(1)基于串口打印日志进行分析;
(2)每个测试套件执行以“Start to run test suite”开始,以“xx Tests xx Failures xx Ignored”结束。
# 板级系统移植
- **[移植概述](porting-chip-board-overview.md)**
- **[板级驱动适配](porting-chip-board-driver.md)**
- **[HAL层实现](porting-chip-board-hal.md)**
- **[系统组件调用](porting-chip-board-component.md)**
- **[lwIP组件适配](porting-chip-board-lwip.md)**
- **[三方组件适配](porting-chip-board-bundle.md)**
- **[XTS认证](porting-chip-board-xts.md)**
\ No newline at end of file
# 内核基础适配
芯片架构适配完成后,liteos-m提供系统运行所需的系统初始化流程和定制化配置选项。移植过程中,需要关注初始化流程中跟硬件配置相关的函数;了解内核配置选项,才能裁剪出适合单板的最小内核。
## 基础适配
如下图所示,基础适配主要分为以下两步:
1. 启动文件startup.S和相应链接配置文件。
2. main. c中的串口初始化和tick中断注册。
**图1** 启动流程
![zh-cn_image_0000001199842521](figures/zh-cn_image_0000001199842521.png)
启动文件startup.S需要确保中断向量表的入口函数(例如reset_vector)放在RAM的首地址,它由链接配置文件来指定。其中iar、keil和gcc工程的链接配置文件分别为xxx.icf、xxx.sct和xxx.ld,如果startup.S已经完成系统时钟初始化,并且能够引导到main函数,则启动文件不需要进行修改,采用厂商自带的startup.S即可,否则需要实现以上功能。
在main.c文件中,需要关注串口初始化UartInit和系统Tick的handler函数注册。
- UartInit函数表示单板串口的初始化,具体的函数名根据单板自行定义。这个函数是可选的,用户可以根据硬件单板是否支持串口来自行选择调用该函数。如果硬件单板支持串口,则该函数需要完成使能串口TX和RX通道,设置波特率。
- HalTickStart设置tick中断的handler函数OsTickHandler。
对于中断向量表不可重定向的芯片,需要关闭LOSCFG_PLATFORM_HWI宏,并且在startup.S中新增tick中断的handler函数。
## 特性配置项
liteos_m的完整配置能力及默认配置在los_config.h定义,该头文件中的配置项可以根据不同的单板进行裁剪配置。
如果针对这些配置项需要进行不同的板级配置,则可将对应的配置项直接定义到对应单板的device/xxxx/target_config.h文件中,其他未定义的配置项,采用los_config.h中的默认值。
一份典型的配置参数如下:
**表1** 内核典型配置项说明
| 配置项 | 说明 |
| -------- | -------- |
| LOSCFG_BASE_CORE_SWTMR | 软件定时器特性开关,1表示打开,0表示关闭 |
| LOSCFG_BASE_CORE_SWTMR_ALIGN | 对齐软件定时器特性开,1表示打开,依赖软件定时器特性打开,0表示关闭 |
| LOSCFG_BASE_IPC_MUX | mux功能开关,1表示打开,0表示关闭 |
| LOSCFG_BASE_IPC_QUEUE | 队列功能开关,1表示打开,0表示关闭 |
| LOSCFG_BASE_CORE_TSK_LIMIT | 除idle&nbsp;task之外,总的可用task个数限制,可以根据业务使用的task个数来配置,也可以设置一个较大的值,待业务稳定了,查看运行task的个数来进行配置 |
| LOSCFG_BASE_IPC_SEM | 信号量功能开关,1表示打开,0表示关闭 |
| LOSCFG_PLATFORM_EXC | 异常特性开关,1表示打开,0表示关闭 |
| LOSCFG_KERNEL_PRINTF | 打印特性开关,1表示打开,0表示关闭 |
# 移植概述
## 移植场景
芯片架构适配是可选过程,如果在liteos_m/arch目录下已经支持对应芯片架构,则可以跳过芯片架构适配,进行单板适配过程,否则需要进行芯片架构移植工作。
## 目录规范
模组芯片使用的内核为liteos-m,liteos-m中主要分为KAL、Components、Kernel和Utils四个模块。
- KAL模块作为内核对外的接口依赖Components模块和Kernel模块。
- Components模块可插拔,它依赖Kernel模块。
- 在Kernel模块中,其中硬件相关的代码放在kernel的arch目录中,其余为硬件无关的代码。内核功能集(task、sem等)的实现依赖硬件相关的arch代码,例如任务上下文切换、原子操作等。
- Utils模块作为基础代码块,被其他模块依赖。
**图1** liteos-m内核模块图
![zh-cn_image_0000001199722629](figures/zh-cn_image_0000001199722629.png)
内核的目录结构和说明如下:
```
.
├── components --- 移植可选组件,依赖内核,单独对外提供头文件
├── kal --- 内核抽象层,提供内核对外接口,当前支持cmsis接口和部分posix接口
├── kernel --- 内核最小功能集代码
│ ├── arch --- 内核指令架构层代码
│ │ ├── arm --- arm32架构的代码
│ │ │ ├── cortex-m3 --- cortex-m3架构的代码
│ │ │ │ ├── iar --- iar编译工具链实现
│ │ │ │ ├── keil --- keil编译工具链实现
│ │ │ │ └── xxx --- xxx编译工具链实现
│ │ │ └── cortex-m4 --- cortex-m4架构的代码
│ │ │ ├── iar --- iar编译工具链实现
│ │ │ ├── keil --- keil编译工具链实现
│ │ │ └── xxx --- xxx编译工具链实现
│ │ ├── include --- 所有的arch需要实现的函数定义,内核依赖
│ │ └── risc-v --- risk-v架构
│ │ └── gcc --- gcc编译工具链实现
│ ├── include --- 内核最小功能集代码
│ └── src --- 内核最小功能集代码
└──utils --- 基础代码,作为依赖的最底层,被系统依赖
```
## 芯片架构适配点
如内核的[目录结构](#目录规范)所示,arch/include定义通用的芯片架构所需要实现的函数,另外芯片架构相关的代码会有部分的汇编代码,而汇编代码会因编译工具链的不同而不同,因此在具体的芯片架构下,还包含不同工具链(iar、keil、gcc等)的实现。
arch/include 目录定义通用的文件以及函数列表,该目录下的所有函数在新增arch组件时都需要适配,详见每一个头文件:
```
los_arch.h --- 定义芯片架构初始化所需要的函数
los_atomic.h --- 定义芯片架构所需要实现的原子操作函数
los_context.h --- 定义芯片架构所需要实现的任务上下文相关函数
los_interrupt.h --- 定义芯片架构所需要实现的中断和异常相关的函数
los_timer.h --- 定义芯片架构所需要实现的系统时钟相关的函数
```
# 内核移植验证
在工程device目录下添加编译main.c示例程序文件,此示例程序的主要目的是:LOS_KernelInit完成之后,创建两个任务,循环调度延时并打印日志信息,通过此方法可以验证系统是否可正常调度以及时钟是否正常。
```
VOID TaskSampleEntry2(VOID) // 任务2的入口函数
{
while(1) {
LOS_TaskDelay(10000);
printf("taskSampleEntry2 running...\n");
}
}
VOID TaskSampleEntry1(VOID) // 任务1的入口函数
{
while(1) {
LOS_TaskDelay(2000);
printf("taskSampleEntry1 running...\n");
}
}
UINT32 TaskSample(VOID)
{
UINT32 uwRet;
UINT32 taskID1,taskID2;
TSK_INIT_PARAM_S stTask1={0};
stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskSampleEntry1;
stTask1.uwStackSize = 0X1000;
stTask1.pcName = "taskSampleEntry1";
stTask1.usTaskPrio = 6; //stTask1的任务优先级设定,不同于stTask2
uwRet = LOS_TaskCreate(&taskID1, &stTask1);
stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskSampleEntry2;
stTask1.uwStackSize = 0X1000;
stTask1.pcName = "taskSampleEntry2";
stTask1.usTaskPrio = 7;
uwRet = LOS_TaskCreate(&taskID2, &stTask1);
return LOS_OK;
}
LITE_OS_SEC_TEXT_INIT int main(void)
{
UINT32 ret;
UartInit(); // 硬件串口配置,通过串口输出调试日志,实际函数名根据单板实现不一样而不一样。
printf("\n\rhello world!!\n\r");
ret = LOS_KernelInit();
TaskSample();
if (ret == LOS_OK) {
LOS_Start(); // 开始系统调度,循环执行stTask1/stTask2任务,串口输出任务日志
}
while (1) {
__asm volatile("wfi");
}
}
```
第一个任务运行正常后,说明最小系统的核心流程基本OK;由于xts用例框架对外依赖较多,主要是utils、bootstrap的链接脚本和编译框架,暂时无法支撑内核单独跑xts;此处略过内核测试套的测试,可以通过[XTS测试套](../porting/porting-chip-board-xts.md)来覆盖最小系统是否完整移植成功。
# 内核移植
- **[移植概述](porting-chip-kernel-overview.md)**
- **[内核基础适配](porting-chip-kernel-adjustment.md)**
- **[内核移植验证](porting-chip-kernel-verify.md)**
\ No newline at end of file
# 移植须知
本文为OpenHarmony平台系统开发人员和芯片(或模组)制造商提供基础的开发移植指导,典型的芯片架构例如cortex-m系列、risc-v系列等都可以按照本文进行移植,暂时不支持蓝牙服务。OpenHarmony是个持续演进的复杂项目,随着版本和API的改变,本文将会不断更新。
本文要求读者具有一定的嵌入式系统开发经验,因此它的重点未放在基本的OS基础介绍,而更多地描述OpenHarmony平台移植过程中主要操作和所需要关注的方面。
## 移植目录
OpenHarmony整体工程较为复杂,目录及实现为系统本身功能,如果不涉及复杂的特性增强,不需要关注每一层实现,移植过程中重点关注如下目录即可:
**表1** 移植过程中的重点目录
| 目录名称 | 描述 |
| -------- | -------- |
| /build/lite | OpenHarmony基础编译构建框架 |
| /kernel/liteos_m | 基础内核,其中芯片架构相关实现在arch目录下 |
| /device | 板级相关实现,各个三方厂商按照OpenHarmony规范适配实现,device下具体目录结构及移植过程参见[板级系统移植](../porting/porting-chip-board-overview.md) |
| /vendor | 产品级相关实现,主要由产品厂商贡献 |
device目录规则:device/{芯片解决方案厂商}/{开发板}。以hisilicon的hispark_taurus为例:
```
device
└── hisilicon # 芯片解决方案厂商名
├── common # 芯片解决方案开发板公共部分
└── hispark_taurus # 开发板名称
├── BUILD.gn # 开发板编译入口
├── hals # 芯片解决方案厂商OS硬件适配
├── linux # linux版本
│ └── config.gni # linux版本编译工具链和编译选项配置
└── liteos_a # liteos-a版本
└── config.gni # liteos-a版本编译工具链和编译选项配置
```
vendor目录规则:vendor/{产品解决方案厂商}/{产品名称}。以wifiiot产品为例:
```
vendor # 产品解决方案厂商
└── example # 产品解决方案厂商名称
└── wifiiot # 产品名称
├── hals # 产品解决方案厂商OS适配
├── BUILD.gn # 产品编译脚本
└── config.json # 产品配置文件
```
## 移植流程
OpenHarmony的device目录是基础芯片的适配目录,如果在三方芯片应用过程中发现此目录下已经有完整的芯片适配,则不需要再额外移植,直接跳过移植过程进行系统应用开发即可,如果该目录下无对应的芯片移植实现,则根据本文完成移植过程。OpenHarmony三方芯片移植主要过程如下:
**图1** 芯片移植关键步骤
![zh-cn_image_0000001200336823](figures/zh-cn_image_0000001200336823.png)
## 移植规范
- 满足OpenHarmony[开源贡献基本规范和准则](../../contribute/参与贡献.md)
- 三方芯片适配所需要贡献的代码主要在device、vendor和arch三个目录,参照[内核目录规范](../porting/porting-chip-kernel-overview.md)[板级目录规范](../porting/porting-chip-board-overview.md#板级目录规范)满足基本目录命名和使用规范。
# 编译构建适配流程
编译构建的详细介绍请见[编译构建子系统介绍](../subsystems/subsys-build-all.md)。新增三方芯片时,编译相关的适配流程如下:
## 编译构建适配流程
首先,创建开发板目录,以芯片解决方案厂商realtek的rtl8720开发板为例,需创建device/realtek/rtl8720目录。编译相关的适配步骤如下:
1. 编译工具链和编译选项配置。
构建系统默认使用ohos-clang编译工具链,也支持芯片解决方案厂商按开发板自定义配置。开发板编译配置文件编译相关的变量如下:
- kernel_type: 开发板使用的内核类型,例如:"liteos_a", "liteos_m", "linux"。
- kernel_version: 开发使用的内核版本,例如:"4.19"。
- board_cpu: 开发板CPU类型,例如:"cortex-a7", "riscv32"。
- board_arch: 开发芯片arch, 例如: "armv7-a", "rv32imac"。
- board_toolchain: 开发板自定义的编译工具链名称,例如:"gcc-arm-none-eabi"。若为空,则使用默认为ohos-clang。
- board_toolchain_prefix:编译工具链前缀,例如:"gcc-arm-none-eabi"。
- board_toolchain_type:编译工具链类型,目前支持gcc和clang。例如:"gcc" ,"clang"。
- board_cflags:开发板配置的c文件编译选项。
- board_cxx_flags:开发板配置的cpp文件编译选项。
- board_ld_flags:开发板配置的链接选项。
编译构建会按产品的选择的开发板,加载对应的config.gni,该文件中变量对系统组件全局可见。
以芯片解决方案厂商realtek的rtl8720开发板为例,device/realtek/rtl8720/liteos_m/config.gni的内容如下:
```
# Kernel type, e.g. "linux", "liteos_a", "liteos_m".
kernel_type = "liteos_m"
# Kernel version.
kernel_version = "3.0.0"
# Board CPU type, e.g. "cortex-a7", "riscv32".
board_cpu = "real-m300"
# Board arch, e.g. "armv7-a", "rv32imac".
board_arch = ""
# Toolchain name used for system compiling.
# E.g. gcc-arm-none-eabi, arm-linux-harmonyeabi-gcc, ohos-clang, riscv32-unknown-elf.
# Note: The default toolchain is "ohos-clang". It's not mandatory if you use the default toochain.
board_toolchain = "gcc-arm-none-eabi"
# The toolchain path installed, it's not mandatory if you have added toolchain path to your ~/.bashrc.
board_toolchain_path =
rebase_path("//prebuilts/gcc/linux-x86/arm/gcc-arm-none-eabi/bin",
root_build_dir)
# Compiler prefix.
board_toolchain_prefix = "gcc-arm-none-eabi-"
# Compiler type, "gcc" or "clang".
board_toolchain_type = "gcc"
# Board related common compile flags.
board_cflags = []
board_cxx_flags = []
board_ld_flags = []
```
2. 开发板编译脚本。
新增的开发板,对应目录下需要新增BUILD.gn文件作为开发板编译的总入口。以芯片解决方案厂商realtek的rtl8720开发板为例,对应的device/realtek/rtl8720/BUILD.gn为:
```
group("rtl8720") {
...
}
```
3. 编译调试开发板。
1. 任意目录执行hb set按提示设置源码路径和要编译的产品。
2. 在开发板目录下执行hb build, 即可启动开发板的编译。
4. 编译调试产品
将开发板和组件信息写入产品配置文件,该配置文件字段说明如下:
- product_name:产品名称,支持自定义,建议与vendor下的三级目录名称一致。
- ohos_version:OpenHarmony版本号,应与实际下载的版本一致。
- device_company:芯片解决方案厂商名称,建议与device的二级目录名称一致。
- board:开发板名称,建议与device的三级级目录名称一致。
- kernel_type:内核类型,应与开发板支持的内核类型匹配。
- kernel_version:内核版本号,应与开发板支持的内核版本匹配。
- subsystem:产品选择的子系统,应为OS支持的子系统,OS支持的子系统请见build/lite/components目录下的各子系统描述文件。
- components:产品选择的某个子系统下的组件,应为某个子系统支持的组件,子系统支持的组件请见build/lite/components/子系统.json文件。
- features:产品配置的某个组件的特性,组件支持的特性请见build/lite/components/子系统.json中对应组件的features字段。
以基于rtl8720开发板的wifiiot模组为例,vendor/my_company/wifiiot/config.json如下:
```
{
"product_name": "wifiiot", # 产品名称
"ohos_version": "OpenHarmony 1.0", # 使用的OS版本
"device_company": "realtek", # 芯片解决方案厂商名称
"board": "rtl8720", # 开发板名称
"kernel_type": "liteos_m", # 选择的内核类型
"kernel_version": "3.0.0", # 选择的内核版本
"subsystems": [
{
"subsystem": "kernel", # 选择的子系统
"components": [
{ "component": "liteos_m", "features":[] } # 选择的组件和组件特性
]
},
...
{
更多子系统和组件
}
]
}
```
# 移植准备
- **[移植须知](porting-chip-prepare-knows.md)**
- **[编译构建适配流程](porting-chip-prepare-process.md)**
\ No newline at end of file
# 轻量系统芯片移植案例
- **[轻量带屏解决方案之恒玄芯片移植案例](porting-bes2600w-on-minisystem-display-demo.md)**
- **[Combo解决方案之ASR芯片移植案例](porting-asr582x-combo-demo.md)**
# 轻量系统芯片移植指导
- **[移植准备](porting-chip-prepare.md)**
- **[内核移植](porting-chip-kernel.md)**
- **[板级系统移植](porting-chip-board.md)**
- **[常见问题](porting-chip-faqs.md)**
\ No newline at end of file
# 驱动移植
- **[移植概述](porting-smallchip-driver-overview.md)**
- **[平台驱动移植](porting-smallchip-driver-plat.md)**
- **[器件驱动移植](porting-smallchip-driver-oom.md)**
\ No newline at end of file
# 移植内核
- **[LiteOS-A内核](porting-smallchip-kernel-a.md)**
- **[Linux内核](porting-smallchip-kernel-linux.md)**
\ No newline at end of file
# 移植准备
- **[移植须知](porting-smallchip-prepare-needs.md)**
- **[编译构建](porting-smallchip-prepare-building.md)**
\ No newline at end of file
# 小型系统芯片移植指导
- **[移植准备](porting-smallchip-prepare.md)**
- **[移植内核](porting-smallchip-kernel.md)**
- **[驱动移植](porting-smallchip-driver.md)**
\ No newline at end of file
# 标准系统芯片移植指导
- **[标准系统移植指南](standard-system-porting-guide.md)**
- **[一种快速移植OpenHarmony Linux内核的方法](porting-linux-kernel.md)**
\ No newline at end of file
...@@ -252,6 +252,7 @@ orsource "../../device/soc/*/Kconfig.liteos_m.soc" ...@@ -252,6 +252,7 @@ orsource "../../device/soc/*/Kconfig.liteos_m.soc"
default "st" default "st"
rsource "*/Kconfig.liteos_m.soc" rsource "*/Kconfig.liteos_m.soc"
endif # SOC_COMPANY_STMICROELECTRONICS endif # SOC_COMPANY_STMICROELECTRONICS
```
-`//device/soc/st/stm32f4xx/Kconfig.liteos_m.defconfig.series`中添加: -`//device/soc/st/stm32f4xx/Kconfig.liteos_m.defconfig.series`中添加:
...@@ -714,7 +715,7 @@ board_ld_flags :链接选项,与Makefile中的LDFLAGS变量对应。 ...@@ -714,7 +715,7 @@ board_ld_flags :链接选项,与Makefile中的LDFLAGS变量对应。
### 内核基础功能适配 ### 内核基础功能适配
内核基础功能适配项包括:**[中断管理](../kernel/kernel-mini-basic-interrupt.md)****[任务管理](../kernel/kernel-mini-basic-task.md)****[内存管理](../kernel/kernel-mini-basic-memory.md)****[内核通信机制](../kernel/kernel-mini-basic-ipc.md)****[时间管理](../kernel/kernel-basic-mini-time.md)****[软件定时器](../kernel/kernel-mini-basic-soft.md)**,可以参考对应链接中的编程实例进行内核基础功能验证。在验证的过程中发现问题,针对相应问题进行具体的适配。 内核基础功能适配项包括:**[中断管理](../kernel/kernel-mini-basic-interrupt.md)****[任务管理](../kernel/kernel-mini-basic-task.md)****[内存管理](../kernel/kernel-mini-basic-memory.md)****[内核通信机制](../kernel/kernel-mini-basic-ipc-event.md)****[时间管理](../kernel/kernel-basic-mini-time.md)****[软件定时器](../kernel/kernel-mini-basic-soft.md)**,可以参考对应链接中的编程实例进行内核基础功能验证。在验证的过程中发现问题,针对相应问题进行具体的适配。
从上一节中打印信息输出时间间隔可以看出,`LOS_TaskDelay`函数的延时时间不准确,我们可以在`target_config.h`中定义如下宏进行内核时钟适配: 从上一节中打印信息输出时间间隔可以看出,`LOS_TaskDelay`函数的延时时间不准确,我们可以在`target_config.h`中定义如下宏进行内核时钟适配:
......
# 轻量和小型系统三方库移植指导
- **[概述](porting-thirdparty-overview.md)**
- **[CMake方式组织编译的库移植](porting-thirdparty-cmake.md)**
- **[Makefile方式组织编译的库移植](porting-thirdparty-makefile.md)**
\ No newline at end of file
# 移植
- **[轻量系统芯片移植指导](porting-minichip.md)**
- **[小型系统芯片移植指导](porting-smallchip.md)**
- **[标准系统芯片移植指导](porting-standardchip.md)**
- **[轻量和小型系统三方库移植指导](porting-thirdparty.md)**
\ No newline at end of file
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
点击烧写并选择串口后,出现Error: Opening COMxx: Access denied。 点击烧写并选择串口后,出现Error: Opening COMxx: Access denied。
**图1** 打开串口失败图  **图1** 打开串口失败图 
 
![zh-cn_image_0000001226634728](figures/zh-cn_image_0000001226634728.png) ![zh-cn_image_0000001226634728](figures/zh-cn_image_0000001226634728.png)
- **可能原因** - **可能原因**
...@@ -16,20 +16,20 @@ ...@@ -16,20 +16,20 @@
- **解决办法** - **解决办法**
1. 按图依次选择下拉框,查找带有serial-xx的终端。 1. 按图依次选择下拉框,查找带有serial-xx的终端。
**图2** 查找是否存在占用串口的终端   **图2** 查找是否存在占用串口的终端  
![zh-cn_image_0000001226954644](figures/zh-cn_image_0000001226954644.png) ![zh-cn_image_0000001226954644](figures/zh-cn_image_0000001226954644.png)
2. 点击标号中的垃圾桶图标,关闭串口。 2. 点击标号中的垃圾桶图标,关闭串口。
**图3** 关闭串口终端  **图3** 关闭串口终端 
 
![zh-cn_image_0000001271234761](figures/zh-cn_image_0000001271234761.png) ![zh-cn_image_0000001271234761](figures/zh-cn_image_0000001271234761.png)
3. 重新点击烧写,选择串口并开始烧写程序。 3. 重新点击烧写,选择串口并开始烧写程序。
**图4** 重新启动烧写任务   **图4** 重新启动烧写任务  
![zh-cn_image_0000001271594765](figures/zh-cn_image_0000001271594765.png) ![zh-cn_image_0000001271594765](figures/zh-cn_image_0000001271594765.png)
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
1. 检查网线是否连接。 1. 检查网线是否连接。
2. 点击Windows防火墙。 2. 点击Windows防火墙。
**图6** 网络防火墙设置图   **图6** 网络防火墙设置图  
![zh-cn_image_0000001226634732](figures/zh-cn_image_0000001226634732.png) ![zh-cn_image_0000001226634732](figures/zh-cn_image_0000001226634732.png)
...@@ -101,7 +101,7 @@ ...@@ -101,7 +101,7 @@
- **解决办法** - **解决办法**
修改串口号。 修改串口号。
请查看设备管理器,确认连接单板的串口与终端中连接串口是否一致,若不一致,请按[串口访问失败的步骤](#烧写选择串口后提示error-opening-comxx-access-denied)修改串口号。 请查看设备管理器,确认连接单板的串口与终端中连接串口是否一致,若不一致,请按烧写选择串口后提示error-opening-comxx-access-denied修改串口号。
- **可能原因2** - **可能原因2**
单板U-boot被损坏。 单板U-boot被损坏。
...@@ -123,6 +123,6 @@ ...@@ -123,6 +123,6 @@
3. 烧写完成后,登录串口如下图所示。 3. 烧写完成后,登录串口如下图所示。
**图10** U-boot烧写完成串口显示图  **图10** U-boot烧写完成串口显示图 
 
![zh-cn_image_0000001271234753](figures/zh-cn_image_0000001271234753.png) ![zh-cn_image_0000001271234753](figures/zh-cn_image_0000001271234753.png)
# 轻量和小型系统入门
- **[轻量和小型系统快速入门-IDE](quickstart-lite-ide-directory.md)**
- **[轻量和小型系统快速入门-安装包](quickstart-lite-package-directory.md)**
# 标准系统入门
- **[标准系统快速入门-IDE](quickstart-standard-ide-directory.md)**
- **[标准系统快速入门-安装包](quickstart-standard-package-directory.md)**
# 结构体
- **[__attribute__](____attribute____.md)**
- **[Alignment](_alignment.md)**
- **[AllocInfo](_alloc_info.md)**
- **[AudioAdapter](_audio_adapter.md)**
- **[AudioAdapterDescriptor](_audio_adapter_descriptor.md)**
- **[AudioAttribute](_audio_attribute.md)**
- **[AudioCapture](_audio_capture.md)**
- **[AudioControl](_audio_control.md)**
- **[AudioDevExtInfo](_audio_dev_ext_info.md)**
- **[AudioDeviceDescriptor](_audio_device_descriptor.md)**
- **[AudioManager](_audio_manager.md)**
- **[AudioMixExtInfo](_audio_mix_ext_info.md)**
- **[AudioMmapBufferDescripter](_audio_mmap_buffer_descripter.md)**
- **[AudioPort](_audio_port.md)**
- **[AudioPortCap](_audio_port_cap.md)**
- **[AudioPortCapability](_audio_port_capability.md)**
- **[AudioRender](_audio_render.md)**
- **[AudioRoute](_audio_route.md)**
- **[AudioRouteNode](_audio_route_node.md)**
- **[AudioSampleAttributes](_audio_sample_attributes.md)**
- **[AudioScene](_audio_scene.md)**
- **[AudioSceneDescriptor](_audio_scene_descriptor.md)**
- **[AudioSceneDescriptor::SceneDesc](union_audio_scene_descriptor_1_1_scene_desc.md)**
- **[AudioSessionExtInfo](_audio_session_ext_info.md)**
- **[AudioSubPortCapability](_audio_sub_port_capability.md)**
- **[AudioTimeStamp](_audio_time_stamp.md)**
- **[AudioVolume](_audio_volume.md)**
- **[AuthResultInfo](_auth_result_info.md)**
- **[AuthSolution](_auth_solution.md)**
- **[BatteryInfo](_battery_info.md)**
- **[BufferData](_buffer_data.md)**
- **[CodecCallbackType](_codec_callback_type.md)**
- **[CodecCompCapability](_codec_comp_capability.md)**
- **[CodecComponentManager](_codec_component_manager.md)**
- **[CodecComponentType](_codec_component_type.md)**
- **[CompVerInfo](_comp_ver_info.md)**
- **[CredentialInfo](_credential_info.md)**
- **[DeviceFuncs](_device_funcs.md)**
- **[DeviceInfo](_device_info.md)**
- **[DisplayCapability](_display_capability.md)**
- **[DisplayInfo](_display_info.md)**
- **[DisplayModeInfo](_display_mode_info.md)**
- **[EnrolledInfo](_enrolled_info.md)**
- **[EnrollParam](_enroll_param.md)**
- **[EnrollResultInfo](_enroll_resultinfo.md)**
- **[EventInfo](_event_info.md)**
- **[EventPackage](_event_package.md)**
- **[ExecutorInfo](_executor_info.md)**
- **[ExecutorInfo](_user_executor_info.md)**
- **[ExecutorRegisterInfo](_executor_register_info.md)**
- **[ExecutorSendMsg](_executor_send_msg.md)**
- **[GetBufferHandleUsageParams](_get_buffer_handle_usage_params.md)**
- **[GfxFuncs](_gfx_funcs.md)**
- **[GfxOpt](_gfx_opt.md)**
- **[GrallocFuncs](_gralloc_funcs.md)**
- **[HdfThermalCallbackInfo](_hdf_thermal_callback_info.md)**
- **[HDRCapability](_h_d_r_capability.md)**
- **[HDRMetaData](_h_d_r_meta_data.md)**
- **[IBatteryCallback](interface_i_battery_callback.md)**
- **[IBatteryInterface](interface_i_battery_interface.md)**
- **[ICircle](_i_circle.md)**
- **[IdentifyResultInfo](_identify_result_info.md)**
- **[IExecutor](interface_i_executor.md)**
- **[IExecutor](interface_pin_i_executor.md)**
- **[IExecutorCallback](interface_i_executor_callback.md)**
- **[IExecutorCallback](interface_pin_i_executor_callback.md)**
- **[IFaceAuthInterface](interface_i_face_auth_interface.md)**
- **[IInputInterface](_i_input_interface.md)**
- **[ILine](_i_line.md)**
- **[InputController](_input_controller.md)**
- **[InputExtraCmd](_input_extra_cmd.md)**
- **[InputManager](_input_manager.md)**
- **[InputReporter](_input_reporter.md)**
- **[InputReportEventCb](_input_report_event_cb.md)**
- **[IPinAuthInterface](interface_i_pin_auth_interface.md)**
- **[IPowerHdiCallback](interface_i_power_hdi_callback.md)**
- **[IPowerInterface](interface_i_power_interface.md)**
- **[IRect](_i_rect.md)**
- **[ISurface](_i_surface.md)**
- **[IThermalCallback](interface_i_thermal_callback.md)**
- **[IThermalInterface](interface_i_thermal_interface.md)**
- **[IUserAuthInterface](interface_i_user_auth_interface.md)**
- **[IWiFi](_i_wi_fi.md)**
- **[IWiFiAp](_i_wi_fi_ap.md)**
- **[IWiFiBaseFeature](_i_wi_fi_base_feature.md)**
- **[IWiFiSta](_i_wi_fi_sta.md)**
- **[LayerAlpha](_layer_alpha.md)**
- **[LayerBuffer](_layer_buffer.md)**
- **[LayerFuncs](_layer_funcs.md)**
- **[LayerInfo](_layer_info.md)**
- **[LightEffect](_light_effect.md)**
- **[LightFlashEffect](_light_flash_effect.md)**
- **[LightInfo](_light_info.md)**
- **[LightInterface](_light_interface.md)**
- **[OHOS::Camera::CaptureEndedInfo](_o_h_o_s_1_1_camera_1_1_capture_ended_info.md)**
- **[OHOS::Camera::CaptureErrorInfo](_o_h_o_s_1_1_camera_1_1_capture_error_info.md)**
- **[OHOS::Camera::CaptureInfo](_o_h_o_s_1_1_camera_1_1_capture_info.md)**
- **[OHOS::Camera::ICameraDevice](_o_h_o_s_1_1_camera_1_1_i_camera_device.md)**
- **[OHOS::Camera::ICameraDeviceCallback](_o_h_o_s_1_1_camera_1_1_i_camera_device_callback.md)**
- **[OHOS::Camera::ICameraHost](_o_h_o_s_1_1_camera_1_1_i_camera_host.md)**
- **[OHOS::Camera::ICameraHostCallback](_o_h_o_s_1_1_camera_1_1_i_camera_host_callback.md)**
- **[OHOS::Camera::IOfflineStreamOperator](_o_h_o_s_1_1_camera_1_1_i_offline_stream_operator.md)**
- **[OHOS::Camera::IStreamOperator](_o_h_o_s_1_1_camera_1_1_i_stream_operator.md)**
- **[OHOS::Camera::IStreamOperatorCallback](_o_h_o_s_1_1_camera_1_1_i_stream_operator_callback.md)**
- **[OHOS::Camera::StreamAttribute](_o_h_o_s_1_1_camera_1_1_stream_attribute.md)**
- **[OHOS::Camera::StreamInfo](_o_h_o_s_1_1_camera_1_1_stream_info.md)**
- **[OHOS::USB::UsbCtrlTransfer](_o_h_o_s_1_1_u_s_b_1_1_usb_ctrl_transfer.md)**
- **[OHOS::USB::UsbdClient](_o_h_o_s_1_1_u_s_b_1_1_usbd_client.md)**
- **[OHOS::USB::UsbDev](_o_h_o_s_1_1_u_s_b_1_1_usb_dev.md)**
- **[OHOS::USB::USBDeviceInfo](_o_h_o_s_1_1_u_s_b_1_1_u_s_b_device_info.md)**
- **[OHOS::USB::UsbdSubscriber](_o_h_o_s_1_1_u_s_b_1_1_usbd_subscriber.md)**
- **[OHOS::USB::UsbInfo](_o_h_o_s_1_1_u_s_b_1_1_usb_info.md)**
- **[OHOS::USB::UsbPipe](_o_h_o_s_1_1_u_s_b_1_1_usb_pipe.md)**
- **[OmxCodecBuffer](_omx_codec_buffer.md)**
- **[PortCap](union_port_cap.md)**
- **[PresentTimestamp](_present_timestamp.md)**
- **[PropertyObject](_property_object.md)**
- **[RangeValue](_range_value.md)**
- **[Rect](_rect.md)**
- **[Rectangle](_rectangle.md)**
- **[ScheduleInfo](_schedule_info.md)**
- **[SensorEvents](_sensor_events.md)**
- **[SensorInformation](_sensor_information.md)**
- **[SensorInterface](_sensor_interface.md)**
- **[StaInfo](_sta_info.md)**
- **[SupportBufferType](_support_buffer_type.md)**
- **[TemplateInfo](_template_info.md)**
- **[ThermalZoneInfo](_thermal_zone_info.md)**
- **[UseBufferType](_use_buffer_type.md)**
- **[VerifyAllocInfo](_verify_alloc_info.md)**
- **[VibratorInterface](_vibrator_interface.md)**
- **[VideoPortCap](_video_port_cap.md)**
\ No newline at end of file
# 头文件
- **[audio_adapter.h](audio__adapter_8h.md)**
- **[audio_attribute.h](audio__attribute_8h.md)**
- **[audio_capture.h](audio__capture_8h.md)**
- **[audio_control.h](audio__control_8h.md)**
- **[audio_manager.h](audio__manager_8h.md)**
- **[audio_render.h](audio__render_8h.md)**
- **[audio_scene.h](audio__scene_8h.md)**
- **[audio_types.h](audio__types_8h.md)**
- **[audio_volume.h](audio__volume_8h.md)**
- **[codec_callback_if.h](codec__callback__if_8h.md)**
- **[codec_common_type.h](codec__common__type_8h.md)**
- **[codec_component_if.h](codec__component__if_8h.md)**
- **[codec_component_manager.h](codec__component__manager_8h.md)**
- **[codec_component_type.h](codec__component__type_8h.md)**
- **[display_device.h](display__device_8h.md)**
- **[display_gfx.h](display__gfx_8h.md)**
- **[display_gralloc.h](display__gralloc_8h.md)**
- **[display_layer.h](display__layer_8h.md)**
- **[display_type.h](display__type_8h.md)**
- **[icamera_device_callback.h](icamera__device__callback_8h.md)**
- **[icamera_device.h](icamera__device_8h.md)**
- **[icamera_host_callback.h](icamera__host__callback_8h.md)**
- **[icamera_host.h](icamera__host_8h.md)**
- **[input_controller.h](input__controller_8h.md)**
- **[input_manager.h](input__manager_8h.md)**
- **[input_reporter.h](input__reporter_8h.md)**
- **[input_type.h](input__type_8h.md)**
- **[ioffline_stream_operator.h](ioffline__stream__operator_8h.md)**
- **[istream_operator_callback.h](istream__operator__callback_8h.md)**
- **[istream_operator.h](istream__operator_8h.md)**
- **[light_if.h](light__if_8h.md)**
- **[light_type.h](light_8typeh.md)**
- **[sensor_if.h](sensor__if_8h.md)**
- **[sensor_type.h](sensor__type_8h.md)**
- **[types.h](types_8h.md)**
- **[usb_info.h](usb__info_8h.md)**
- **[usbd_client.h](usbd__client_8h.md)**
- **[usbd_subscriber.h](usbd__subscriber_8h.md)**
- **[usbd_type.h](usbd__type_8h.md)**
- **[vibrator_if.h](vibrator__if_8h.md)**
- **[vibrator_type.h](vibrator__type_8h.md)**
- **[wifi_hal_ap_feature.h](wifi__hal__ap__feature_8h.md)**
- **[wifi_hal_base_feature.h](wifi__hal__base__feature_8h.md)**
- **[wifi_hal_sta_feature.h](wifi__hal__sta__feature_8h.md)**
- **[wifi_hal.h](wifi__hal_8h.md)**
- **[IExecutor.idl](face__auth_2_i_executor_8idl.md)**
- **[IExecutorCallback.idl](face__auth_2_i_executor_callback_8idl.md)**
- **[FaceAuthTypes.idl](_face_auth_types_8idl.md)**
- **[PinAuthTypes.idl](_pin_auth_types_8idl.md)**
- **[IBatteryCallback.idl](_i_battery_callback_8idl.md)**
- **[IBatteryInterface.idl](_i_battery_interface_8idl.md)**
- **[IExecutor.idl](pin__auth_2_i_executor_8idl.md)**
- **[IExecutorCallback.idl](pin__auth_2_i_executor_callback_8idl.md)**
- **[IFaceAuthInterface.idl](_i_face_auth_interface_8idl.md)**
- **[IPinAuthInterface.idl](_i_pin_auth_interface_8idl.md)**
- **[IPowerHdiCallback.idl](_i_power_hdi_callback_8idl.md)**
- **[IPowerInterface.idl](_i_power_interface_8idl.md)**
- **[IThermalInterface.idl](_i_thermal_interface_8idl.md)**
- **[IThermalCallback.idl](_i_thermal_callback_8idl.md)**
- **[IUserAuthInterface.idl](_i_user_auth_interface_8idl.md)**
- **[PowerTypes.idl](_power_types_8idl.md)**
- **[ThermalTypes.idl](_thermal_types_8idl.md)**
- **[Types.idl](_types_8idl.md)**
- **[UserAuthTypes.idl](_user_auth_types_8idl.md)**
\ No newline at end of file
# NativeAPI参考
- **[Audio](_audio.md)**
- **[Battery](battery.md)**
- **[Camera](_camera.md)**
- **[Codec](_codec.md)**
- **[Display](_display.md)**
- **[HdfFaceAuth](_hdf_face_auth.md)**
- **[Input](_input.md)**
- **[Light](_light.md)**
- **[HdfPinAuth](_hdf_pin_auth.md)**
- **[Power](power.md)**
- **[Sensor](_sensor.md)**
- **[Thermal](thermal.md)**
- **[USB](_u_s_b.md)**
- **[HdfUserAuth](_hdf_user_auth.md)**
- **[Vibrator](_vibrator.md)**
- **[WLAN](_w_l_a_n.md)**
\ No newline at end of file
# 头文件和结构体
- **[头文件](files.md)**
- **[结构体](annotated.md)**
\ No newline at end of file
...@@ -4,6 +4,20 @@ ...@@ -4,6 +4,20 @@
- [编译构建指导](subsys-build-all.md) - [编译构建指导](subsys-build-all.md)
- [构建系统编码规范与最佳实践](subsys-build-gn-coding-style-and-best-practice.md) - [构建系统编码规范与最佳实践](subsys-build-gn-coding-style-and-best-practice.md)
- [编译构建Kconfig可视化配置指导](subsys-build-gn-kconfig-visual-config-guide.md) - [编译构建Kconfig可视化配置指导](subsys-build-gn-kconfig-visual-config-guide.md)
- 编译构建相关操作
- [产品配置规则](subsys-build-product.md#产品配置规则)
- [子系统配置规则](subsys-build-subsystem.md#子系统配置规则)
- [部件配置规则](subsys-build-component.md#部件配置规则)
- [模块配置规则](subsys-build-module.md#模块配置规则)
- [芯片解决方案配置规则](subsys-build-chip_solution.md#芯片解决方案配置规则)
- [特性配置规则](subsys-build-feature.md#特性配置规则)
- [系统能力配置规则](subsys-build-syscap.md#如何按需配置部件的系统能力)
- [关于deps、external_deps的使用](subsys-build-reference.md#关于deps、external_deps的使用)
- [开源软件Notice收集策略说明](subsys-build-reference.md#开源软件notice收集策略说明)
- [加快本地编译的一些参数](subsys-build-reference.md#加快本地编译的一些参数)
- [查看NinjaTrace](subsys-build-reference.md#查看ninjatrace)
- [HAP编译构建指导](subsys-build-gn-hap-compilation-guide.md)
- [ 常见问题](subsys-build-FAQ.md)
- [分布式远程启动](subsys-remote-start.md) - [分布式远程启动](subsys-remote-start.md)
- 图形图像 - 图形图像
- [图形图像概述](subsys-graphics-overview.md) - [图形图像概述](subsys-graphics-overview.md)
......
# 用户程序框架
- **[概述](subsys-application-framework-overview.md)**
- **[搭建环境](subsys-application-framework-envbuild.md)**
- **[开发指导](subsys-application-framework-guide.md)**
- **[开发实例](subsys-application-framework-demo.md)**
\ No newline at end of file
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
**可能原因** **可能原因**
被init启动的服务都有一个叫做“importance”的属性(详见[第2章表3](../subsystems/subsys-boot-init.md)描述)。 被init启动的服务都有一个叫做“importance”的属性(详见[第2章表3](../subsystems/subsys-boot-init-jobs.md)描述)。
- 当该属性为0时,表示若当前服务进程退出,init不需要重启单板。 - 当该属性为0时,表示若当前服务进程退出,init不需要重启单板。
......
# Init启动引导组件
- **[引导启动配置文件](subsys-boot-init-cfg.md)**
- **[jobs管理](subsys-boot-init-jobs.md)**
- **[服务管理](subsys-boot-init-service.md)**
- **[系统参数](subsys-boot-init-sysparam.md)**
- **[沙盒管理](subsys-boot-init-sandbox.md)**
- **[插件](subsys-boot-init-plugin.md)**
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
启动子系统内部涉及以下组件: 启动子系统内部涉及以下组件:
- init启动引导组件: - init启动引导组件:
init启动引导组件对应的进程为init进程,是内核完成初始化后启动的第一个用户态进程。init进程启动之后,读取init.cfg配置文件,根据解析结果,执行相应命令(见[第2章表2](../subsystems/subsys-boot-init.md)描述)并依次启动各关键系统服务进程,在启动系统服务进程的同时设置其对应权限。 init启动引导组件对应的进程为init进程,是内核完成初始化后启动的第一个用户态进程。init进程启动之后,读取init.cfg配置文件,根据解析结果,执行相应命令(见[第2章表2](../subsystems/subsys-boot-init-jobs.md)描述)并依次启动各关键系统服务进程,在启动系统服务进程的同时设置其对应权限。
- ueventd启动引导组件: - ueventd启动引导组件:
ueventd负责监听内核设备驱动插拔的netlink事件,根据事件类型动态管理相应设备的dev节点。 ueventd负责监听内核设备驱动插拔的netlink事件,根据事件类型动态管理相应设备的dev节点。
...@@ -57,7 +57,9 @@ ...@@ -57,7 +57,9 @@
- 新芯片平台移植时,平台相关的初始化配置需要增加平台相关的初始化配置文件/vendor/etc/init/init.{hardware}.cfg;该文件完成平台相关的初始化设置,如安装ko驱动,设置平台相关的/proc节点信息。 - 新芯片平台移植时,平台相关的初始化配置需要增加平台相关的初始化配置文件/vendor/etc/init/init.{hardware}.cfg;该文件完成平台相关的初始化设置,如安装ko驱动,设置平台相关的/proc节点信息。
> **说明:** 配置文件init.cfg仅支持json格式。 > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 配置文件init.cfg仅支持json格式。
- bootstrap服务启动组件:需要在链接脚本中配置zInit代码段。 - bootstrap服务启动组件:需要在链接脚本中配置zInit代码段。
...@@ -330,7 +332,7 @@ ...@@ -330,7 +332,7 @@
- init执行system和vendor中的启动脚本,挂载vendor中更多的分区 - init执行system和vendor中的启动脚本,挂载vendor中更多的分区
挂载完必要的分区后,init扫描各个脚本文件。vendor中与芯片或开发板相关的初始化脚本入口如/vendor/etc/init.{ohos.boot.hardware}.cfg。vendor中扩展的挂载分区文件是/vendor/etc/fstab.{ohos.boot.hardware}。hardware的来源是bootloader传递给内核的bootargs。 挂载完必要的分区后,init扫描各个脚本文件。vendor中与芯片或开发板相关的初始化脚本入口如/vendor/etc/init.{ohos.boot.hardware}.cfg。vendor中扩展的挂载分区文件是/vendor/etc/fstab.{ohos.boot.hardware}。hardware的来源是bootloader传递给内核的bootargs。
### 无ramdisk的启动加载流程 ### 无ramdisk的启动加载流程
......
# 启动恢复
- **[启动恢复子系统概述](subsys-boot-overview.md)**
- **[init启动引导组件](subsys-boot-init.md)**
- **[appspawn应用孵化组件](subsys-boot-appspawn.md)**
- **[bootstrap服务启动组件](subsys-boot-bootstrap.md)**
- **[常见问题](subsys-boot-faqs.md)**
- **[参考](subsys-boot-ref.md)**
\ No newline at end of file
# 编译构建
- **[编译构建指导](subsys-build-all.md)**
- **[构建系统编码规范与最佳实践](subsys-build-gn-coding-style-and-best-practice.md)**
- **[编译构建Kconfig可视化配置指导](subsys-build-gn-kconfig-visual-config-guide.md)**
# 关系型数据库
- **[关系型数据库概述](subsys-data-relational-database-overview.md)**
- **[关系型数据库开发指导](subsys-data-relational-database-guide.md)**
# 轻量级数据存储
- **[轻量级数据存储概述](subsys-data-storage-overview.md)**
- **[轻量级数据存储开发指导](subsys-data-storage-guide.md)**
# 数据管理
- **[关系型数据库](subsys-data-relational-database.md)**
- **[轻量级数据存储](subsys-data-storage.md)**
# HiSysEvent开发指导
- **[HiSysEvent概述](subsys-dfx-hisysevent-overview.md)**
- **[HiSysEvent打点配置](subsys-dfx-hisysevent-logging-config.md)**
- **[HiSysEvent打点](subsys-dfx-hisysevent-logging.md)**
- **[HiSysEvent订阅](subsys-dfx-hisysevent-listening.md)**
- **[HiSysEvent查询](subsys-dfx-hisysevent-query.md)**
- **[HiSysEvent工具](subsys-dfx-hisysevent-tool.md)**
\ No newline at end of file
# DFX
- **[DFX概述](subsys-dfx-overview.md)**
- **[HiLog开发指导](subsys-dfx-hilog-rich.md)**
- **[HiLog_Lite开发指导](subsys-dfx-hilog-lite.md)**
- **[HiTrace开发指导](subsys-dfx-hitrace.md)**
- **[HiCollie开发指导](subsys-dfx-hicollie.md)**
- **[HiSysEvent开发指导](subsys-dfx-hisysevent.md)**
- **[HiDumper开发指导](subsys-dfx-hidumper.md)**
- **[HiChecker开发指导](subsys-dfx-hichecker.md)**
- **[Hiview开发指导](subsys-dfx-hiview.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)**
\ No newline at end of file
# 相机
- **[相机开发概述](subsys-multimedia-camera-overview.md)**
- **[拍照开发指导](subsys-multimedia-camera-photo-guide.md)**
- **[录像开发指导](subsys-multimedia-camera-record-guide.md)**
- **[预览开发指导](subsys-multimedia-camera-preview-guide.md)**
\ No newline at end of file
# 音视频
- **[音视频开发概述](subsys-multimedia-video-overview.md)**
- **[音视频播放开发指导](subsys-multimedia-video-play-guide.md)**
- **[音视频录制开发指导](subsys-multimedia-video-record-guide.md)**
\ No newline at end of file
# 媒体
- **[相机](subsys-multimedia-camera.md)**
- **[音视频](subsys-multimedia-video.md)**
\ No newline at end of file
# 升级服务
- **[OTA升级](subsys-ota-guide.md)**
\ No newline at end of file
...@@ -42,7 +42,7 @@ OpenHarmony设备安全等级管理(DSLM)模块,负责管理各种不同 ...@@ -42,7 +42,7 @@ OpenHarmony设备安全等级管理(DSLM)模块,负责管理各种不同
### 约束与限制 ### 约束与限制
OpenHarmony设备的默认安全等级为SL1,设备制造商可以根据设备实际情况定制更高的安全等级。详细请参考章节[设备安全等级定制](#设备安全等级定制) OpenHarmony设备的默认安全等级为SL1,设备制造商可以根据设备实际情况定制更高的安全等级。详细请参考章节[定制设备安全等级](#定制设备安全等级)
应用开发者在调试分布式业务时,如遇到因设备安全等级过低而导致数据处理或流转失败的情况时,也可以参考章节[工具使用介绍](#工具使用介绍)临时提升相关设备的安全等级。 应用开发者在调试分布式业务时,如遇到因设备安全等级过低而导致数据处理或流转失败的情况时,也可以参考章节[工具使用介绍](#工具使用介绍)临时提升相关设备的安全等级。
......
# 安全
- **[概述](subsys-security-overview.md)**
- **[应用验签开发指导](subsys-security-sigverify.md)**
- **[应用权限管理开发指导](subsys-security-rightmanagement.md)**
- **[IPC通信鉴权开发指导](subsys-security-communicationverify.md)**
- **[设备安全等级管理开发指南](subsys-security-devicesecuritylevel.md)**
\ No newline at end of file
# Sensor服务<a name="ZH-CN_TOPIC_0000001111039534"></a>
- **[Sensor服务子系概述](subsys-sensor-overview.md)**
- **[Sensor服务子系使用指导](subsys-sensor-guide.md)**
- **[Sensor服务子系使用实例](subsys-sensor-demo.md)**
# 电话服务
- **[电话服务概述](subsys-tel-overview.md)**
- **[电话服务开发指导](subsys-tel-guide.md)**
\ No newline at end of file

# 环境配置
## 测试框架基础环境依赖
|环境依赖|操作系统|Linux系统扩展组件|python|python插件|NFS Server|HDC|
|------------|------------|------------|------------|------------|------------|------------|
|版本型号|Ubuntu18.04及以上|libreadline-dev|3.7.5版本及以上|pyserial 3.3及以上、paramiko2.7.1及以上、setuptools40.8.0及以上、rsa4.0及以上|haneWIN NFS Server 1.2.50及以上或者 NFS v4及以上| 1.1.0版本及以上 |
|详细说明|代码编译环境|命令行读取插件|测试框架语言 |pyserial:支持python的串口通信;paramiko:支持python使用SSH协议;setuptools:支持python方便创建和分发python包;rsa:支持python rsa加密 |支持设备通过串口连接| 支持设备通过HDC连接 |
## 安装流程
1. 安装Linux扩展组件readline,安装命令如下:
```
sudo apt-get install libreadline-dev
```
安装成功提示如下:
```
Reading package lists... Done
Building dependency tree
Reading state information... Done
libreadline-dev is already the newest version (7.0-3).
0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.
```
2. 安装setuptools插件,安装命令如下:
```
pip3 install setuptools
```
安装成功提示如下:
```
Requirement already satisfied: setuptools in d:\programs\python37\lib\site-packages (41.2.0)
```
3. 安装paramiko插件,安装命令如下:
```
pip3 install paramiko
```
安装成功提示如下:
```
Installing collected packages: pycparser, cffi, pynacl, bcrypt, cryptography, paramiko
Successfully installed bcrypt-3.2.0 cffi-1.14.4 cryptography-3.3.1 paramiko-2.7.2 pycparser-2.20 pynacl-1.4.0
```
4. 安装python的rsa插件,安装命令如下:
```
pip3 install rsa
```
安装成功提示如下:
```
Installing collected packages: pyasn1, rsa
Successfully installed pyasn1-0.4.8 rsa-4.7
```
5. 安装串口插件pyserial,安装命令如下:
```
pip3 install pyserial
```
安装成功提示如下:
```
Requirement already satisfied: pyserial in d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg (3.4)
```
6. 如果设备仅支持串口输出测试结果,则需要安装NFS Server
- Windows环境下安装,例如安装haneWIN NFS Server1.2.50。
- Linux环境下安装,安装命令如下:
```
sudo apt install nfs-kernel-server
```
安装成功提示如下:
```
Reading package lists... Done
Building dependency tree
Reading state information... Done
nfs-kernel-server is already the newest version (1:1.3.4-2.1ubuntu5.3).
0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.
```
7. 如果设备支持HDC连接,则需要安装HDC工具,安装流程请参考如下链接
https://gitee.com/openharmony/developtools_hdc_standard/blob/master/README_zh.md
## 安装环境检查
| 检查项 |操作 |满足环境 |
| --- | --- | --- |
| 检查python安装成功 |命令行窗口执行命令:python --version |版本不小于3.7.5即可 |
| 检查python扩展插件安装成功 |打开test/developertest目录,执行start.bat或start.sh| 可进入提示符“>>>”界面即可 |
|检查NFS Server启动状态(被测设备仅支持串口时检测) |通过串口登录开发板,执行mount命令挂载NFS |可正常挂载文件目录即可 |
|检查HDC安装成功 |命令行窗口执行命令:hdc_std -v |版本不小于1.1.0即可 |
...@@ -4,8 +4,89 @@ OpenHarmony为开发者提供了一套全面的自测试框架,开发者可根 ...@@ -4,8 +4,89 @@ OpenHarmony为开发者提供了一套全面的自测试框架,开发者可根
本文从基础环境构建,用例开发,编译以及执行等方面介绍OpenHarmony测试框架如何运行和使用。 本文从基础环境构建,用例开发,编译以及执行等方面介绍OpenHarmony测试框架如何运行和使用。
## 基础环境构建 ## 基础环境构建
测试框架依赖于python运行环境,在使用测试框架之前可参阅以下方式进行配置。 测试框架依赖于python运行环境,在使用测试框架之前可参阅以下方式进行配置。
- [环境配置](subsys-testguide-envbuild.md) [源码获取](../get-code/sourcecode-acquire.md)
- [源码获取](../get-code/sourcecode-acquire.md) ### 环境配置
#### 测试框架基础环境依赖
|环境依赖|操作系统|Linux系统扩展组件|python|python插件|NFS Server|HDC|
|------------|------------|------------|------------|------------|------------|------------|
|版本型号|Ubuntu18.04及以上|libreadline-dev|3.7.5版本及以上|pyserial 3.3及以上、paramiko2.7.1及以上、setuptools40.8.0及以上、rsa4.0及以上|haneWIN NFS Server 1.2.50及以上或者 NFS v4及以上| 1.1.0版本及以上 |
|详细说明|代码编译环境|命令行读取插件|测试框架语言 |pyserial:支持python的串口通信;paramiko:支持python使用SSH协议;setuptools:支持python方便创建和分发python包;rsa:支持python rsa加密 |支持设备通过串口连接| 支持设备通过HDC连接 |
#### 安装流程
1. 安装Linux扩展组件readline,安装命令如下:
```
sudo apt-get install libreadline-dev
```
安装成功提示如下:
```
Reading package lists... Done
Building dependency tree
Reading state information... Done
libreadline-dev is already the newest version (7.0-3).
0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.
```
2. 安装setuptools插件,安装命令如下:
```
pip3 install setuptools
```
安装成功提示如下:
```
Requirement already satisfied: setuptools in d:\programs\python37\lib\site-packages (41.2.0)
```
3. 安装paramiko插件,安装命令如下:
```
pip3 install paramiko
```
安装成功提示如下:
```
Installing collected packages: pycparser, cffi, pynacl, bcrypt, cryptography, paramiko
Successfully installed bcrypt-3.2.0 cffi-1.14.4 cryptography-3.3.1 paramiko-2.7.2 pycparser-2.20 pynacl-1.4.0
```
4. 安装python的rsa插件,安装命令如下:
```
pip3 install rsa
```
安装成功提示如下:
```
Installing collected packages: pyasn1, rsa
Successfully installed pyasn1-0.4.8 rsa-4.7
```
5. 安装串口插件pyserial,安装命令如下:
```
pip3 install pyserial
```
安装成功提示如下:
```
Requirement already satisfied: pyserial in d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg (3.4)
```
6. 如果设备仅支持串口输出测试结果,则需要安装NFS Server
- Windows环境下安装,例如安装haneWIN NFS Server1.2.50。
- Linux环境下安装,安装命令如下:
```
sudo apt install nfs-kernel-server
```
安装成功提示如下:
```
Reading package lists... Done
Building dependency tree
Reading state information... Done
nfs-kernel-server is already the newest version (1:1.3.4-2.1ubuntu5.3).
0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.
```
7. 如果设备支持HDC连接,则需要安装HDC工具,安装流程请参考如下链接
https://gitee.com/openharmony/developtools_hdc_standard/blob/master/README_zh.md
## 安装环境检查
| 检查项 |操作 |满足环境 |
| --- | --- | --- |
| 检查python安装成功 |命令行窗口执行命令:python --version |版本不小于3.7.5即可 |
| 检查python扩展插件安装成功 |打开test/developertest目录,执行start.bat或start.sh| 可进入提示符“>>>”界面即可 |
|检查NFS Server启动状态(被测设备仅支持串口时检测) |通过串口登录开发板,执行mount命令挂载NFS |可正常挂载文件目录即可 |
|检查HDC安装成功 |命令行窗口执行命令:hdc_std -v |版本不小于1.1.0即可 |
## 测试框架目录简介 ## 测试框架目录简介
...@@ -612,9 +693,9 @@ subsystem # 子系统 ...@@ -612,9 +693,9 @@ subsystem # 子系统
} }
``` ```
> **说明:** 进行条件分组的目的在于执行用例时可以选择性的执行某一种特定类型的用例。 > **说明:** 进行条件分组的目的在于执行用例时可以选择性的执行某一种特定类型的用例。
#### 编译入口配置文件ohos.build
#### 编译入口配置文件ohos.build
当完成用例编译配置文件编写后,需要进一步编写部件编译配置文件,以关联到具体的测试用例。 当完成用例编译配置文件编写后,需要进一步编写部件编译配置文件,以关联到具体的测试用例。
``` ```
"partA": { "partA": {
......
# 调测工具
- **[bytrace使用指导](subsys-toolchain-bytrace-guide.md)**
- **[hdc_std使用指导](subsys-toolchain-hdc-guide.md)**
- **[hiperf使用指导](subsys-toolchain-hiperf.md)**
\ No newline at end of file
# USB<a name="ZH-CN_TOPIC_0000001052857351"></a>
- **[USB服务子系统概述](subsys-usbservice-overview.md)**
- **[USB服务子系统使用指导](subsys-usbservice-guide.md)**
- **[USB服务子系统使用实例](subsys-usbservice-demo.md)**
\ No newline at end of file
# 公共基础
- **[公共基础库概述](subsys-utils-overview.md)**
- **[公共基础库开发指导](subsys-utils-guide.md)**
- **[公共基础库常见问题](subsys-utils-faqs.md)**
\ No newline at end of file
# 子系统
- **[编译构建](subsys-build.md)**
- **[分布式远程启动](subsys-remote-start.md)**
- **[图形图像](subsys-graphics.md)**
- **[媒体](subsys-multimedia.md)**
- **[公共基础](subsys-utils.md)**
- **[AI框架](subsys-aiframework.md)**
- **[数据管理](subsys-data.md)**
- **[Sensor服务](subsys-sensor.md)**
- **[USB](subsys-usbservice.md)**
- **[用户程序框架](subsys-application-framework.md)**
- **[升级服务](subsys-ota-guide.md)**
- **[电话服务](subsys-tel.md)**
- **[安全](subsys-security.md)**
- **[启动恢复](subsys-boot.md)**
- **[测试用例开发指导](subsys-testguide-test.md)**
- **[DFX](subsys-dfx.md)**
- **[调测工具](subsys-toolchain.md)**
- **[XTS认证用例开发指导](subsys-xts-guide.md)**
\ No newline at end of file
# OpenHarmony设备开发文档 # OpenHarmony设备开发文档
- [设备开发导读](device-dev-guide.md) - [设备开发导读](device-dev-guide.md)
- 快速开始 - 快速开始
- 轻量和小型系统快速入门(IDE方式,推荐) - 轻量和小型系统快速入门(IDE方式,推荐)
- [轻量与小型系统入门概述](quick-start/quickstart-ide-lite-overview.md)
- 准备轻量与小型系统环境 - [轻量与小型系统入门概述](quick-start/quickstart-ide-lite-overview.md)
- [搭建Windows+Ubuntu混合开发环境](quick-start/quickstart-ide-lite-env-setup-win-ubuntu.md)
- [获取源码](quick-start/quickstart-ide-lite-sourcecode-acquire.md) - 准备轻量与小型系统环境
- [导入源码工程](quick-start/quickstart-ide-lite-create-project.md)
- 运行“Hello World” - [搭建Windows+Ubuntu混合开发环境](quick-start/quickstart-ide-lite-env-setup-win-ubuntu.md)
- Hi3861开发板
- [编写“Hello World”程序](quick-start/quickstart-ide-lite-steps-hi3861-helloworld.md) - [获取源码](quick-start/quickstart-ide-lite-sourcecode-acquire.md)
- [编译](quick-start/quickstart-ide-lite-steps-hi3861-building.md)
- [烧录](quick-start/quickstart-ide-lite-steps-hi3861-burn.md) - [导入源码工程](quick-start/quickstart-ide-lite-create-project.md)
- [联网](quick-start/quickstart-ide-lite-steps-hi3861-netconfig.md)
- [调试验证](quick-start/quickstart-ide-lite-steps-hi3861-debug.md) - 运行“Hello World”
- [运行](quick-start/quickstart-ide-lite-steps-hi3861-running.md)
- Hi3516开发板 - Hi3861开发板
- [编写“Hello World”程序](quick-start/quickstart-ide-lite-steps-hi3516-helloworld.md)
- [编译](quick-start/quickstart-ide-lite-steps-hi3516-building.md) - [编写“Hello World”程序](quick-start/quickstart-ide-lite-steps-hi3861-helloworld.md)
- [烧录](quick-start/quickstart-ide-lite-steps-hi3516-burn.md)
- [运行](quick-start/quickstart-ide-lite-steps-hi3516-running.md) - [编译](quick-start/quickstart-ide-lite-steps-hi3861-building.md)
- 附录
- [Hi3861开发板介绍](quick-start/quickstart-ide-lite-introduction-hi3861.md) - [烧录](quick-start/quickstart-ide-lite-steps-hi3861-burn.md)
- [Hi3516开发板介绍](quick-start/quickstart-ide-lite-introduction-hi3516.md)
- [编译形态整体说明](quick-start/quickstart-build.md) - [联网](quick-start/quickstart-ide-lite-steps-hi3861-netconfig.md)
- [调试验证](quick-start/quickstart-ide-lite-steps-hi3861-debug.md)
- [运行](quick-start/quickstart-ide-lite-steps-hi3861-running.md)
- Hi3516开发板
- [编写“Hello World”程序](quick-start/quickstart-ide-lite-steps-hi3516-helloworld.md)
- [编译](quick-start/quickstart-ide-lite-steps-hi3516-building.md)
- [烧录](quick-start/quickstart-ide-lite-steps-hi3516-burn.md)
- [运行](quick-start/quickstart-ide-lite-steps-hi3516-running.md)
- 附录
- [Hi3861开发板介绍](quick-start/quickstart-ide-lite-introduction-hi3861.md)
- [Hi3516开发板介绍](quick-start/quickstart-ide-lite-introduction-hi3516.md)
- [编译形态整体说明](quick-start/quickstart-build.md)
- 轻量和小型系统快速入门(安装包方式) - 轻量和小型系统快速入门(安装包方式)
- [轻量与小型系统入门概述](quick-start/quickstart-lite-overview.md)
- [搭建轻量与小型系统环境](quick-start/quickstart-lite-env-setup.md) - [轻量与小型系统入门概述](quick-start/quickstart-lite-overview.md)
- 运行“Hello World”
- Hi3861开发板 - [搭建轻量与小型系统环境](quick-start/quickstart-lite-env-setup.md)
- [安装Hi3861开发板环境](quick-start/quickstart-lite-steps-hi3861-setting.md)
- [编写“Hello World”程序](quick-start/quickstart-lite-steps-hi3861-helloworld.md) - 运行“Hello World”
- [编译](quick-start/quickstart-lite-steps-hi3861-building.md)
- [烧录](quick-start/quickstart-lite-steps-hi3861-burn.md) - Hi3861开发板
- [联网](quick-start/quickstart-lite-steps-hi3861-netconfig.md)
- [调试验证](quick-start/quickstart-lite-steps-hi3861-debug.md) - [安装Hi3861开发板环境](quick-start/quickstart-lite-steps-hi3861-setting.md)
- [运行](quick-start/quickstart-lite-steps-hi3861-running.md)
- Hi3516开发板 - [编写“Hello World”程序](quick-start/quickstart-lite-steps-hi3861-helloworld.md)
- [安装Hi3516开发板环境](quick-start/quickstart-lite-steps-hi3516-setting.md)
- [编写“Hello World”程序](quick-start/quickstart-lite-steps-hi3516-helloworld.md) - [编译](quick-start/quickstart-lite-steps-hi3861-building.md)
- [编译](quick-start/quickstart-lite-steps-hi3516-building.md)
- [烧录](quick-start/quickstart-lite-steps-hi3516-burn.md) - [烧录](quick-start/quickstart-lite-steps-hi3861-burn.md)
- [运行](quick-start/quickstart-lite-steps-hi3516-running.md)
- 常见问题 - [联网](quick-start/quickstart-lite-steps-hi3861-netconfig.md)
- [hb安装异常](quick-start/quickstart-lite-faq-hb.md)
- [编译异常](quick-start/quickstart-lite-faq-compose.md) - [调试验证](quick-start/quickstart-lite-steps-hi3861-debug.md)
- [烧录异常](quick-start/quickstart-lite-faq-burning.md)
- 附录 - [运行](quick-start/quickstart-lite-steps-hi3861-running.md)
- 开发板介绍
- [Hi3861开发板介绍](quick-start/quickstart-lite-introduction-hi3861.md) - Hi3516开发板
- [Hi3516开发板介绍](quick-start/quickstart-lite-introduction-hi3516.md)
- [参考信息](quick-start/quickstart-lite-reference.md) - [安装Hi3516开发板环境](quick-start/quickstart-lite-steps-hi3516-setting.md)
- [使用HiTool烧录代码](quick-start/quickstart-lite-hitool.md)
- [编译形态整体说明](quick-start/quickstart-build.md) - [编写“Hello World”程序](quick-start/quickstart-lite-steps-hi3516-helloworld.md)
- [编译](quick-start/quickstart-lite-steps-hi3516-building.md)
- [烧录](quick-start/quickstart-lite-steps-hi3516-burn.md)
- [运行](quick-start/quickstart-lite-steps-hi3516-running.md)
- 常见问题
- [hb安装异常](quick-start/quickstart-lite-faq-hb.md)
- [编译异常](quick-start/quickstart-lite-faq-compose.md)
- [烧录异常](quick-start/quickstart-lite-faq-burning.md)
- 附录
- 开发板介绍
- [Hi3861开发板介绍](quick-start/quickstart-lite-introduction-hi3861.md)
- [Hi3516开发板介绍](quick-start/quickstart-lite-introduction-hi3516.md)
- [参考信息](quick-start/quickstart-lite-reference.md)
- [使用HiTool烧录代码](quick-start/quickstart-lite-hitool.md)
- [编译形态整体说明](quick-start/quickstart-build.md)
- 标准系统快速入门(IDE方式,推荐) - 标准系统快速入门(IDE方式,推荐)
- [标准系统入门概述](quick-start/quickstart-ide-standard-overview.md)
- 准备标准系统环境 - [标准系统入门概述](quick-start/quickstart-ide-standard-overview.md)
- [搭建Windows+Ubuntu混合开发环境](quick-start/quickstart-ide-standard-env-setup-win-ubuntu.md)
- [获取源码](quick-start/quickstart-ide-standard-sourcecode-acquire.md) - 准备标准系统环境
- [导入源码工程](quick-start/quickstart-ide-standard-create-project.md)
- 运行“Hello World” - [搭建Windows+Ubuntu混合开发环境](quick-start/quickstart-ide-standard-env-setup-win-ubuntu.md)
- Hi3516开发板
- [编写“Hello World”程序](quick-start/quickstart-ide-standard-running-hi3516-create.md) - [获取源码](quick-start/quickstart-ide-standard-sourcecode-acquire.md)
- [编译](quick-start/quickstart-ide-standard-running-hi3516-build.md)
- [烧录](quick-start/quickstart-ide-standard-running-hi3516-burning.md) - [导入源码工程](quick-start/quickstart-ide-standard-create-project.md)
- [运行](quick-start/quickstart-ide-standard-running-hi3516-running.md)
- RK3568开发板 - 运行“Hello World”
- [编写“Hello World”程序](quick-start/quickstart-ide-standard-running-rk3568-create.md)
- [编译](quick-start/quickstart-ide-standard-running-rk3568-build.md) - Hi3516开发板
- [烧录](quick-start/quickstart-ide-standard-running-rk3568-burning.md)
- [运行](quick-start/quickstart-ide-standard-running-rk3568-running.md) - [编写“Hello World”程序](quick-start/quickstart-ide-standard-running-hi3516-create.md)
- 附录
- [Hi3516开发板介绍](quick-start/quickstart-ide-standard-board-introduction-hi3516.md) - [编译](quick-start/quickstart-ide-standard-running-hi3516-build.md)
- [RK3568开发板介绍](quick-start/quickstart-ide-standard-board-introduction-rk3568.md)
- [编译形态整体说明](quick-start/quickstart-build.md) - [烧录](quick-start/quickstart-ide-standard-running-hi3516-burning.md)
- [运行](quick-start/quickstart-ide-standard-running-hi3516-running.md)
- RK3568开发板
- [编写“Hello World”程序](quick-start/quickstart-ide-standard-running-rk3568-create.md)
- [编译](quick-start/quickstart-ide-standard-running-rk3568-build.md)
- [烧录](quick-start/quickstart-ide-standard-running-rk3568-burning.md)
- [运行](quick-start/quickstart-ide-standard-running-rk3568-running.md)
- 附录
- [Hi3516开发板介绍](quick-start/quickstart-ide-standard-board-introduction-hi3516.md)
- [RK3568开发板介绍](quick-start/quickstart-ide-standard-board-introduction-rk3568.md)
- [编译形态整体说明](quick-start/quickstart-build.md)
- 标准系统快速入门(安装包方式) - 标准系统快速入门(安装包方式)
- [标准系统入门概述](quick-start/quickstart-standard-overview.md)
- [搭建标准系统环境](quick-start/quickstart-standard-env-setup.md)
- 运行“Hello World”
- Hi3516开发板
- [编写“Hello World”程序](quick-start/quickstart-std-3516-create.md)
- [编译](quick-start/quickstart-standard-running-hi3516-build.md)
- [烧录](quick-start/quickstart-standard-running-hi3516-burning.md)
- [运行](quick-start/quickstart-standard-running-hi3516-running.md)
- RK3568开发板
- [编写“Hello World”程序](quick-start/quickstart-standard-running-rk3568-create.md)
- [编译](quick-start/quickstart-standard-running-rk3568-build.md)
- [烧录](quick-start/quickstart-standard-running-rk3568-burning.md)
- [运行](quick-start/quickstart-standard-running-rk3568-running.md)
- 常见问题
- [hb安装异常](quick-start/quickstart-standard-faq-hb.md)
- [编译异常](quick-start/quickstart-standard-faq-compose.md)
- [烧录异常](quick-start/quickstart-standard-faq-burning.md)
- 附录
- 开发板介绍
- [Hi3516开发板介绍](quick-start/quickstart-standard-board-introduction-hi3516.md)
- [RK3568开发板介绍](quick-start/quickstart-standard-board-introduction-rk3568.md)
- [参考信息](quick-start/quickstart-standard-reference.md)
- [使用HiTool烧录代码](quick-start/quickstart-standard-hitool.md)
- [编译形态整体说明](quick-start/quickstart-build.md)
- [获取源码](get-code/sourcecode-acquire.md)
- 兼容性与安全 - [标准系统入门概述](quick-start/quickstart-standard-overview.md)
- [搭建标准系统环境](quick-start/quickstart-standard-env-setup.md)
- [隐私保护](security/security-privacy-protection.md) - 运行“Hello World”
- [安全指南](security/security-guidelines-overall.md)
- Hi3516开发板
- [编写“Hello World”程序](quick-start/quickstart-std-3516-create.md)
- [编译](quick-start/quickstart-standard-running-hi3516-build.md)
- [烧录](quick-start/quickstart-standard-running-hi3516-burning.md)
- [运行](quick-start/quickstart-standard-running-hi3516-running.md)
- RK3568开发板
- [编写“Hello World”程序](quick-start/quickstart-standard-running-rk3568-create.md)
- [编译](quick-start/quickstart-standard-running-rk3568-build.md)
- [烧录](quick-start/quickstart-standard-running-rk3568-burning.md)
- [运行](quick-start/quickstart-standard-running-rk3568-running.md)
- 常见问题
- [hb安装异常](quick-start/quickstart-standard-faq-hb.md)
- [编译异常](quick-start/quickstart-standard-faq-compose.md)
- [烧录异常](quick-start/quickstart-standard-faq-burning.md)
- 附录
- 开发板介绍
- [Hi3516开发板介绍](quick-start/quickstart-standard-board-introduction-hi3516.md)
- [RK3568开发板介绍](quick-start/quickstart-standard-board-introduction-rk3568.md)
- [参考信息](quick-start/quickstart-standard-reference.md)
- [使用HiTool烧录代码](quick-start/quickstart-standard-hitool.md)
- [编译形态整体说明](quick-start/quickstart-build.md)
- [获取源码](get-code/sourcecode-acquire.md)
- [隐私保护](security/security-privacy-protection.md)
- [安全指南](security/security-guidelines-overall.md)
- 移植 - 移植
- 轻量系统芯片移植指导 - 轻量系统芯片移植指导
- [概述](porting/porting-minichip-overview.md) - [概述](porting/porting-minichip-overview.md)
- [移植准备](porting/porting-minichip-prepare.md) - [移植准备](porting/porting-minichip-prepare.md)
- [移植内核](porting/porting-minichip-kernel.md) - [移植内核](porting/porting-minichip-kernel.md)
- 移植子系统 - 移植子系统
- [移植子系统概述](porting/porting-minichip-subsys-overview.md) - [移植子系统概述](porting/porting-minichip-subsys-overview.md)
- [移植启动恢复子系统](porting/porting-minichip-subsys-startup.md) - [移植启动恢复子系统](porting/porting-minichip-subsys-startup.md)
- [移植文件子系统](porting/porting-minichip-subsys-filesystem.md) - [移植文件子系统](porting/porting-minichip-subsys-filesystem.md)
- [移植安全子系统](porting/porting-minichip-subsys-security.md) - [移植安全子系统](porting/porting-minichip-subsys-security.md)
- [移植通信子系统](porting/porting-minichip-subsys-communication.md) - [移植通信子系统](porting/porting-minichip-subsys-communication.md)
- [移植外设驱动子系统](porting/porting-minichip-subsys-driver.md) - [移植外设驱动子系统](porting/porting-minichip-subsys-driver.md)
- [配置其他子系统](porting/porting-minichip-subsys-others.md) - [配置其他子系统](porting/porting-minichip-subsys-others.md)
- [移植验证](porting/porting-minichip-verification.md) - [移植验证](porting/porting-minichip-verification.md)
- [常见问题](porting/porting-chip-faqs.md) - [常见问题](porting/porting-chip-faqs.md)
- 小型系统芯片移植指导 - 小型系统芯片移植指导
- 移植准备 - 移植准备
- [移植须知](porting/porting-smallchip-prepare-needs.md) - [移植须知](porting/porting-smallchip-prepare-needs.md)
- [编译构建](porting/porting-smallchip-prepare-building.md) - [编译构建](porting/porting-smallchip-prepare-building.md)
- 移植内核 - 移植内核
- [LiteOS-A内核](porting/porting-smallchip-kernel-a.md) - [LiteOS-A内核](porting/porting-smallchip-kernel-a.md)
- [Linux内核](porting/porting-smallchip-kernel-linux.md) - [Linux内核](porting/porting-smallchip-kernel-linux.md)
- 驱动移植 - 驱动移植
- [移植概述](porting/porting-smallchip-driver-overview.md) - [移植概述](porting/porting-smallchip-driver-overview.md)
- [平台驱动移植](porting/porting-smallchip-driver-plat.md) - [平台驱动移植](porting/porting-smallchip-driver-plat.md)
- [器件驱动移植](porting/porting-smallchip-driver-oom.md) - [器件驱动移植](porting/porting-smallchip-driver-oom.md)
- 标准系统芯片移植指导 - 标准系统芯片移植指导
- [标准系统移植指南](porting/standard-system-porting-guide.md) - [标准系统移植指南](porting/standard-system-porting-guide.md)
- [一种快速移植OpenHarmony Linux内核的方法](porting/porting-linux-kernel.md) - [一种快速移植OpenHarmony Linux内核的方法](porting/porting-linux-kernel.md)
- 轻量和小型系统三方库移植指导 - 轻量和小型系统三方库移植指导
- [概述](porting/porting-thirdparty-overview.md) - [概述](porting/porting-thirdparty-overview.md)
- [CMake方式组织编译的库移植](porting/porting-thirdparty-cmake.md) - [CMake方式组织编译的库移植](porting/porting-thirdparty-cmake.md)
- [Makefile方式组织编译的库移植](porting/porting-thirdparty-makefile.md) - [Makefile方式组织编译的库移植](porting/porting-thirdparty-makefile.md)
- 轻量系统芯片移植案例 - 轻量系统芯片移植案例
- [带屏解决方案之恒玄芯片移植案例](porting/porting-bes2600w-on-minisystem-display-demo.md)
- [Combo解决方案之ASR芯片移植案例](porting/porting-asr582x-combo-demo.md) - [带屏解决方案之恒玄芯片移植案例](porting/porting-bes2600w-on-minisystem-display-demo.md)
- [物联网解决方案之芯海cst85芯片移植案例](porting/porting-cst85f01-combo-demo.md)
- [轻量系统STM32F407芯片移植案例](porting/porting-stm32f407-on-minisystem-eth.md) - [Combo解决方案之ASR芯片移植案例](porting/porting-asr582x-combo-demo.md)
- [Combo解决方案之W800芯片移植案例](porting/porting-w800-combo-demo.md)
- [物联网解决方案之芯海cst85芯片移植案例](porting/porting-cst85f01-combo-demo.md)
- [轻量系统STM32F407芯片移植案例](porting/porting-stm32f407-on-minisystem-eth.md)
- [Combo解决方案之W800芯片移植案例](porting/porting-w800-combo-demo.md)
- 小型系统芯片移植案例 - 小型系统芯片移植案例
- [小型设备STM32MP1芯片移植案例](porting/porting-stm32mp15xx-on-smallsystem.md)
- [小型设备STM32MP1芯片移植案例](porting/porting-stm32mp15xx-on-smallsystem.md)
- 标准系统芯片移植案例
- [标准系统方案之瑞芯微RK3568移植案例](porting/porting-dayu200-on_standard-demo.md)
- 子系统开发 - 子系统开发
- 内核 - 内核
- 轻量系统内核 - 轻量系统内核
- [内核概述](kernel/kernel-mini-overview.md) - [内核概述](kernel/kernel-mini-overview.md)
- 基础内核 - 基础内核
- [中断管理](kernel/kernel-mini-basic-interrupt.md) - [中断管理](kernel/kernel-mini-basic-interrupt.md)
- [任务管理](kernel/kernel-mini-basic-task.md) - [任务管理](kernel/kernel-mini-basic-task.md)
- 内存管理 - [内存管理](kernel/kernel-mini-basic-memory.md)
- [基本概念](kernel/kernel-mini-basic-memory-basic.md) - 内核通信机制
- [静态内存](kernel/kernel-mini-basic-memory-static.md) - [事件](kernel/kernel-mini-basic-ipc-event.md)
- [动态内存](kernel/kernel-mini-basic-memory-dynamic.md) - [互斥锁](kernel/kernel-mini-basic-ipc-mutex.md)
- 内核通信机制 - [消息队列](kernel/kernel-mini-basic-ipc-queue.md)
- [事件](kernel/kernel-mini-basic-ipc-event.md) - [信号量](kernel/kernel-mini-basic-ipc-sem.md)
- [互斥锁](kernel/kernel-mini-basic-ipc-mutex.md) - [时间管理](kernel/kernel-basic-mini-time.md)
- [消息队列](kernel/kernel-mini-basic-ipc-queue.md) - [软件定时器](kernel/kernel-mini-basic-soft.md)
- [信号量](kernel/kernel-mini-basic-ipc-sem.md) - 扩展组件
- [时间管理](kernel/kernel-basic-mini-time.md) - [C++支持](kernel/kernel-mini-extend-support.md)
- [软件定时器](kernel/kernel-mini-basic-soft.md) - [CPU占用率](kernel/kernel-mini-extend-cpup.md)
- 扩展组件 - [动态加载](kernel/kernel-mini-extend-dynamic-loading.md)
- [C++支持](kernel/kernel-mini-extend-support.md) - [文件系统](kernel/kernel-mini-extend-file.md)
- [CPU占用率](kernel/kernel-mini-extend-cpup.md) - 内核调测
- [动态加载](kernel/kernel-mini-extend-dynamic-loading.md) - [内存调测](kernel/kernel-mini-memory-debug.md)
- 文件系统 - [异常调测](kernel/kernel-mini-memory-exception.md)
- [FAT](kernel/kernel-mini-extend-file-fat.md) - [Trace调测](kernel/kernel-mini-memory-trace.md)
- [LittleFS](kernel/kernel-mini-extend-file-lit.md) - [LMS调测](kernel/kernel-mini-memory-lms.md)
- 内核调测 - 附录
- 内存调测 - [内核编码规范](kernel/kernel-mini-appx-code.md)
- [内存信息统计](kernel/kernel-mini-memory-debug-mes.md) - [双向链表](kernel/kernel-mini-appx-data-list.md)
- [内存泄漏检测](kernel/kernel-mini-memory-debug-det.md) - [标准库支持](kernel/kernel-mini-appx-lib.md)
- [踩内存检测](kernel/kernel-mini-memory-debug-cet.md) - 小型系统内核
- [异常调测](kernel/kernel-mini-memory-exception.md) - [内核概述](kernel/kernel-small-overview.md)
- [Trace调测](kernel/kernel-mini-memory-trace.md) - 内核启动
- [LMS调测](kernel/kernel-mini-memory-lms.md) - [内核态启动](kernel/kernel-small-start-kernel.md)
- 附录 - [用户态启动](kernel/kernel-small-start-user.md)
- [内核编码规范](kernel/kernel-mini-appx-code.md) - 基础内核
- [双向链表](kernel/kernel-mini-appx-data-list.md) - [中断及异常处理](kernel/kernel-small-basic-interrupt.md)
- 标准库支持 - 进程管理
- [CMSIS支持](kernel/kernel-mini-appx-lib-cmsis.md) - [进程](kernel/kernel-small-basic-process-process.md)
- [POSIX支持](kernel/kernel-mini-appx-lib-posix.md) - [任务](kernel/kernel-small-basic-process-thread.md)
- 小型系统内核 - [调度器](kernel/kernel-small-basic-process-scheduler.md)
- [内核概述](kernel/kernel-small-overview.md) - 内存管理
- 内核启动 - [堆内存管理](kernel/kernel-small-basic-memory-heap.md)
- [内核态启动](kernel/kernel-small-start-kernel.md) - [物理内存管理](kernel/kernel-small-basic-memory-physical.md)
- [用户态启动](kernel/kernel-small-start-user.md) - [虚拟内存管理](kernel/kernel-small-basic-memory-virtual.md)
- 基础内核 - [虚实映射](kernel/kernel-small-basic-inner-reflect.md)
- [中断及异常处理](kernel/kernel-small-basic-interrupt.md) - 内核通信机制
- 进程管理 - [事件](kernel/kernel-small-basic-trans-event.md)
- [进程](kernel/kernel-small-basic-process-process.md) - [信号量](kernel/kernel-small-basic-trans-semaphore.md)
- [任务](kernel/kernel-small-basic-process-thread.md) - [互斥锁](kernel/kernel-small-basic-trans-mutex.md)
- [调度器](kernel/kernel-small-basic-process-scheduler.md) - [消息队列](kernel/kernel-small-basic-trans-queue.md)
- 内存管理 - [读写锁](kernel/kernel-small-basic-trans-rwlock.md)
- [堆内存管理](kernel/kernel-small-basic-memory-heap.md) - [用户态快速互斥锁](kernel/kernel-small-basic-trans-user-mutex.md)
- [物理内存管理](kernel/kernel-small-basic-memory-physical.md) - [信号](kernel/kernel-small-basic-trans-user-signal.md)
- [虚拟内存管理](kernel/kernel-small-basic-memory-virtual.md) - [时间管理](kernel/kernel-small-basic-time.md)
- [虚实映射](kernel/kernel-small-basic-inner-reflect.md) - [软件定时器](kernel/kernel-small-basic-softtimer.md)
- 内核通信机制 - [原子操作](kernel/kernel-small-basic-atomic.md)
- [事件](kernel/kernel-small-basic-trans-event.md) - 扩展组件
- [信号量](kernel/kernel-small-basic-trans-semaphore.md) - [系统调用](kernel/kernel-small-bundles-system.md)
- [互斥锁](kernel/kernel-small-basic-trans-mutex.md) - [动态加载与链接](kernel/kernel-small-bundles-linking.md)
- [消息队列](kernel/kernel-small-basic-trans-queue.md) - [虚拟动态共享库](kernel/kernel-small-bundles-share.md)
- [读写锁](kernel/kernel-small-basic-trans-rwlock.md) - [轻量级进程间通信](kernel/kernel-small-bundles-ipc.md)
- [用户态快速互斥锁](kernel/kernel-small-basic-trans-user-mutex.md) - 文件系统
- [信号](kernel/kernel-small-basic-trans-user-signal.md) - [虚拟文件系统](kernel/kernel-small-bundles-fs-virtual.md)
- [时间管理](kernel/kernel-small-basic-time.md) - [支持的文件系统](kernel/kernel-small-bundles-fs-support.md)
- [软件定时器](kernel/kernel-small-basic-softtimer.md) - [适配新的文件系统](kernel/kernel-small-bundles-fs-new.md)
- [原子操作](kernel/kernel-small-basic-atomic.md) - 调测与工具
- 扩展组件 - Shell
- [系统调用](kernel/kernel-small-bundles-system.md) - [Shell介绍](kernel/kernel-small-debug-shell-overview.md)
- [动态加载与链接](kernel/kernel-small-bundles-linking.md) - [Shell命令开发指导](kernel/kernel-small-debug-shell-guide.md)
- [虚拟动态共享库](kernel/kernel-small-bundles-share.md) - [Shell命令编程实例](kernel/kernel-small-debug-shell-build.md)
- [轻量级进程间通信](kernel/kernel-small-bundles-ipc.md) - Shell命令使用详解
- 文件系统 - 系统命令
- [虚拟文件系统](kernel/kernel-small-bundles-fs-virtual.md) - [cpup](kernel/kernel-small-debug-shell-cmd-cpup.md)
- 支持的文件系统 - [date](kernel/kernel-small-debug-shell-cmd-date.md)
- [FAT](kernel/kernel-small-bundles-fs-support-fat.md) - [dmesg](kernel/kernel-small-debug-shell-cmd-dmesg.md)
- [JFFS2](kernel/kernel-small-bundles-fs-support-jffs2.md) - [exec](kernel/kernel-small-debug-shell-cmd-exec.md)
- [NFS](kernel/kernel-small-bundles-fs-support-nfs.md) - [free](kernel/kernel-small-debug-shell-cmd-free.md)
- [Ramfs](kernel/kernel-small-bundles-fs-support-ramfs.md) - [help](kernel/kernel-small-debug-shell-cmd-help.md)
- [Procfs](kernel/kernel-small-bundles-fs-support-procfs.md) - [hwi](kernel/kernel-small-debug-shell-cmd-hwi.md)
- [适配新的文件系统](kernel/kernel-small-bundles-fs-new.md) - [kill](kernel/kernel-small-debug-shell-cmd-kill.md)
- 调测与工具 - [log](kernel/kernel-small-debug-shell-cmd-log.md)
- Shell - [memcheck](kernel/kernel-small-debug-shell-cmd-memcheck.md)
- [Shell介绍](kernel/kernel-small-debug-shell-overview.md) - [oom](kernel/kernel-small-debug-shell-cmd-oom.md)
- [Shell命令开发指导](kernel/kernel-small-debug-shell-guide.md) - [pmm](kernel/kernel-small-debug-shell-cmd-pmm.md)
- [Shell命令编程实例](kernel/kernel-small-debug-shell-build.md) - [reset](kernel/kernel-small-debug-shell-cmd-reset.md)
- Shell命令使用详解 - [sem](kernel/kernel-small-debug-shell-cmd-sem.md)
- 系统命令 - [stack](kernel/kernel-small-debug-shell-cmd-stack.md)
- [cpup](kernel/kernel-small-debug-shell-cmd-cpup.md) - [su](kernel/kernel-small-debug-shell-cmd-su.md)
- [date](kernel/kernel-small-debug-shell-cmd-date.md) - [swtmr](kernel/kernel-small-debug-shell-cmd-swtmr.md)
- [dmesg](kernel/kernel-small-debug-shell-cmd-dmesg.md) - [systeminfo](kernel/kernel-small-debug-shell-cmd-sysinfo.md)
- [exec](kernel/kernel-small-debug-shell-cmd-exec.md) - [task](kernel/kernel-small-debug-shell-cmd-task.md)
- [free](kernel/kernel-small-debug-shell-cmd-free.md) - [uname](kernel/kernel-small-debug-shell-cmd-uname.md)
- [help](kernel/kernel-small-debug-shell-cmd-help.md) - [vmm](kernel/kernel-small-debug-shell-cmd-vmm.md)
- [hwi](kernel/kernel-small-debug-shell-cmd-hwi.md) - [watch](kernel/kernel-small-debug-shell-cmd-watch.md)
- [kill](kernel/kernel-small-debug-shell-cmd-kill.md) - [reboot](kernel/kernel-small-debug-shell-cmd-reboot.md)
- [log](kernel/kernel-small-debug-shell-cmd-log.md) - [top](kernel/kernel-small-debug-shell-cmd-top.md)
- [memcheck](kernel/kernel-small-debug-shell-cmd-memcheck.md) - 文件命令
- [oom](kernel/kernel-small-debug-shell-cmd-oom.md) - [cat](kernel/kernel-small-debug-shell-file-cat.md)
- [pmm](kernel/kernel-small-debug-shell-cmd-pmm.md) - [cd](kernel/kernel-small-debug-shell-file-cd.md)
- [reset](kernel/kernel-small-debug-shell-cmd-reset.md) - [chgrp](kernel/kernel-small-debug-shell-file-chgrp.md)
- [sem](kernel/kernel-small-debug-shell-cmd-sem.md) - [chmod](kernel/kernel-small-debug-shell-file-chmod.md)
- [stack](kernel/kernel-small-debug-shell-cmd-stack.md) - [chown](kernel/kernel-small-debug-shell-file-chown.md)
- [su](kernel/kernel-small-debug-shell-cmd-su.md) - [cp](kernel/kernel-small-debug-shell-file-cp.md)
- [swtmr](kernel/kernel-small-debug-shell-cmd-swtmr.md) - [format](kernel/kernel-small-debug-shell-file-format.md)
- [systeminfo](kernel/kernel-small-debug-shell-cmd-sysinfo.md) - [ls](kernel/kernel-small-debug-shell-file-ls.md)
- [task](kernel/kernel-small-debug-shell-cmd-task.md) - [lsfd](kernel/kernel-small-debug-shell-file-lsfd.md)
- [uname](kernel/kernel-small-debug-shell-cmd-uname.md) - [mkdir](kernel/kernel-small-debug-shell-file-mkdir.md)
- [vmm](kernel/kernel-small-debug-shell-cmd-vmm.md) - [mount](kernel/kernel-small-debug-shell-file-mount.md)
- [watch](kernel/kernel-small-debug-shell-cmd-watch.md) - [partinfo](kernel/kernel-small-debug-shell-file-partinfo.md)
- [reboot](kernel/kernel-small-debug-shell-cmd-reboot.md) - [partition](kernel/kernel-small-debug-shell-file-partition.md)
- [top](kernel/kernel-small-debug-shell-cmd-top.md) - [pwd](kernel/kernel-small-debug-shell-file-pwd.md)
- 文件命令 - [rm](kernel/kernel-small-debug-shell-file-rm.md)
- [cat](kernel/kernel-small-debug-shell-file-cat.md) - [rmdir](kernel/kernel-small-debug-shell-file-rmdir.md)
- [cd](kernel/kernel-small-debug-shell-file-cd.md) - [statfs](kernel/kernel-small-debug-shell-file-statfs.md)
- [chgrp](kernel/kernel-small-debug-shell-file-chgrp.md) - [sync](kernel/kernel-small-debug-shell-file-sync.md)
- [chmod](kernel/kernel-small-debug-shell-file-chmod.md) - [touch](kernel/kernel-small-debug-shell-file-touch.md)
- [chown](kernel/kernel-small-debug-shell-file-chown.md) - [writeproc](kernel/kernel-small-debug-shell-file-write.md)
- [cp](kernel/kernel-small-debug-shell-file-cp.md) - [umount](kernel/kernel-small-debug-shell-file-umount.md)
- [format](kernel/kernel-small-debug-shell-file-format.md) - [du](kernel/kernel-small-debug-shell-file-du.md)
- [ls](kernel/kernel-small-debug-shell-file-ls.md) - [mv](kernel/kernel-small-debug-shell-file-mv.md)
- [lsfd](kernel/kernel-small-debug-shell-file-lsfd.md) - 网络命令
- [mkdir](kernel/kernel-small-debug-shell-file-mkdir.md) - [arp](kernel/kernel-small-debug-shell-net-arp.md)
- [mount](kernel/kernel-small-debug-shell-file-mount.md) - [dhclient](kernel/kernel-small-debug-shell-net-dhclient.md)
- [partinfo](kernel/kernel-small-debug-shell-file-partinfo.md) - [ifconfig](kernel/kernel-small-debug-shell-net-ifconfig.md)
- [partition](kernel/kernel-small-debug-shell-file-partition.md) - [ipdebug](kernel/kernel-small-debug-shell-net-ipdebug.md)
- [pwd](kernel/kernel-small-debug-shell-file-pwd.md) - [netstat](kernel/kernel-small-debug-shell-net-netstat.md)
- [rm](kernel/kernel-small-debug-shell-file-rm.md) - [ntpdate](kernel/kernel-small-debug-shell-net-ntpdate.md)
- [rmdir](kernel/kernel-small-debug-shell-file-rmdir.md) - [ping](kernel/kernel-small-debug-shell-net-ping.md)
- [statfs](kernel/kernel-small-debug-shell-file-statfs.md) - [ping6](kernel/kernel-small-debug-shell-net-ping6.md)
- [sync](kernel/kernel-small-debug-shell-file-sync.md) - [telnet](kernel/kernel-small-debug-shell-net-telnet.md)
- [touch](kernel/kernel-small-debug-shell-file-touch.md) - [tftp](kernel/kernel-small-debug-shell-net-tftp.md)
- [writeproc](kernel/kernel-small-debug-shell-file-write.md) - [魔法键使用方法](kernel/kernel-small-debug-shell-magickey.md)
- [umount](kernel/kernel-small-debug-shell-file-umount.md) - [用户态异常信息说明](kernel/kernel-small-debug-shell-error.md)
- [du](kernel/kernel-small-debug-shell-file-du.md) - [Trace调测](kernel/kernel-small-debug-trace.md)
- [mv](kernel/kernel-small-debug-shell-file-mv.md) - [Perf调测](kernel/kernel-mini-memory-perf.md)
- 网络命令 - [LMS调测](kernel/kernel-small-memory-lms.md)
- [arp](kernel/kernel-small-debug-shell-net-arp.md) - [进程调测](kernel/kernel-small-debug-process-cpu.md)
- [dhclient](kernel/kernel-small-debug-shell-net-dhclient.md) - 内核态内存调测
- [ifconfig](kernel/kernel-small-debug-shell-net-ifconfig.md) - [内存信息统计](kernel/kernel-small-debug-memory-info.md)
- [ipdebug](kernel/kernel-small-debug-shell-net-ipdebug.md) - [内存泄漏检测](kernel/kernel-small-debug-memory-leak.md)
- [netstat](kernel/kernel-small-debug-shell-net-netstat.md) - [踩内存检测](kernel/kernel-small-debug-memory-corrupt.md)
- [ntpdate](kernel/kernel-small-debug-shell-net-ntpdate.md) - [用户态内存调测](kernel/kernel-small-debug-user.md)
- [ping](kernel/kernel-small-debug-shell-net-ping.md) - 其他内核调测手段
- [ping6](kernel/kernel-small-debug-shell-net-ping6.md) - [临终遗言](kernel/kernel-small-debug-trace-other-lastwords.md)
- [telnet](kernel/kernel-small-debug-shell-net-telnet.md) - [常见问题](kernel/kernel-small-debug-trace-other-faqs.md)
- [tftp](kernel/kernel-small-debug-shell-net-tftp.md) - 附录
- [魔法键使用方法](kernel/kernel-small-debug-shell-magickey.md) - 基本数据结构
- [用户态异常信息说明](kernel/kernel-small-debug-shell-error.md) - [双向链表](kernel/kernel-small-apx-dll.md)
- [Trace](kernel/kernel-small-debug-trace.md) - [位操作](kernel/kernel-small-apx-bitwise.md)
- [Perf调测](kernel/kernel-mini-memory-perf.md) - [标准库](kernel/kernel-small-apx-library.md)
- [LMS调测](kernel/kernel-small-memory-lms.md) - 标准系统内核
- [CPU占用率](kernel/kernel-small-debug-process-cpu.md) - [Linux内核概述](kernel/kernel-standard-overview.md)
- 内核态内存调测 - [OpenHarmony开发板Patch使用指导](kernel/kernel-standard-patch.md)
- [内存信息统计](kernel/kernel-small-debug-memory-info.md) - [Linux内核编译与构建指导](kernel/kernel-standard-build.md)
- [内存泄漏检测](kernel/kernel-small-debug-memory-leak.md) - 内核增强特性
- [踩内存检测](kernel/kernel-small-debug-memory-corrupt.md) - [Enhanced SWAP特性介绍](kernel/kernel-standard-mm-eswap.md)
- 用户态内存调测 - 任务调度
- [基本概念](kernel/kernel-small-debug-user-concept.md) - [关联线程组调度](kernel/kernel-standard-sched-rtg.md)
- [运行机制](kernel/kernel-small-debug-user-function.md) - [CPU轻量级隔离](kernel/kernel-standard-sched-cpuisolation.md)
- 使用指导 - 驱动
- [接口说明](kernel/kernel-small-debug-user-guide-api.md) - HDF驱动框架
- 使用说明 - [HDF开发概述](driver/driver-hdf-overview.md)
- [接口调用方式](kernel/kernel-small-debug-user-guide-use-api.md) - [驱动开发](driver/driver-hdf-development.md)
- [命令行参数方式](kernel/kernel-small-debug-user-guide-use-cli.md) - [驱动服务管理](driver/driver-hdf-servicemanage.md)
- [常见问题场景](kernel/kernel-small-debug-user-faqs.md) - [驱动消息机制管理](driver/driver-hdf-message-management.md)
- 其他内核调测手段 - [配置管理](driver/driver-hdf-manage.md)
- [临终遗言](kernel/kernel-small-debug-trace-other-lastwords.md) - [HDF开发实例](driver/driver-hdf-sample.md)
- [常见问题定位方法](kernel/kernel-small-debug-trace-other-faqs.md) - 平台驱动开发
- 附录 - [ADC](driver/driver-platform-adc-develop.md)
- 基本数据结构 - [DAC](driver/driver-platform-dac-develop.md)
- [双向链表](kernel/kernel-small-apx-dll.md) - [GPIO](driver/driver-platform-gpio-develop.md)
- [位操作](kernel/kernel-small-apx-bitwise.md) - [HDMI](driver/driver-platform-hdmi-develop.md)
- [标准库](kernel/kernel-small-apx-library.md) - [I2C](driver/driver-platform-i2c-develop.md)
- 标准系统内核 - [I3C](driver/driver-platform-i3c-develop.md)
- [Linux内核概述](kernel/kernel-standard-overview.md) - [MIPI CSI](driver/driver-platform-mipicsi-develop.md)
- [开发板Patch使用指导](kernel/kernel-standard-patch.md) - [MIPI DSI](driver/driver-platform-mipidsi-develop.md)
- [Linux内核编译与构建指导](kernel/kernel-standard-build.md) - [MMC](driver/driver-platform-mmc-develop.md)
- 内核增强特性 - [PIN](driver/driver-platform-pin-develop.md)
- [Enhanced SWAP特性介绍](kernel/kernel-standard-mm-eswap.md) - [PWM](driver/driver-platform-pwm-develop.md)
- 任务调度 - [Regulator](driver/driver-platform-regulator-develop.md)
- [关联线程组调度](kernel/kernel-standard-sched-rtg.md) - [RTC](driver/driver-platform-rtc-develop.md)
- [CPU轻量级隔离](kernel/kernel-standard-sched-cpuisolation.md) - [SDIO](driver/driver-platform-sdio-develop.md)
- 驱动 - [SPI](driver/driver-platform-spi-develop.md)
- HDF驱动框架 - [UART](driver/driver-platform-uart-develop.md)
- [HDF开发概述](driver/driver-hdf-overview.md) - [WatchDog](driver/driver-platform-watchdog-develop.md)
- [驱动开发](driver/driver-hdf-development.md) - 平台驱动使用
- [驱动服务管理](driver/driver-hdf-servicemanage.md) - [ADC](driver/driver-platform-adc-des.md)
- [驱动消息机制管理](driver/driver-hdf-message-management.md) - [DAC](driver/driver-platform-dac-des.md)
- [配置管理](driver/driver-hdf-manage.md) - [GPIO](driver/driver-platform-gpio-des.md)
- [HDF开发实例](driver/driver-hdf-sample.md) - [HDMI](driver/driver-platform-hdmi-des.md)
- 平台驱动开发 - [I2C](driver/driver-platform-i2c-des.md)
- [ADC](driver/driver-platform-adc-develop.md) - [I3C](driver/driver-platform-i3c-des.md)
- [DAC](driver/driver-platform-dac-develop.md) - [MIPI CSI](driver/driver-platform-mipicsi-des.md)
- [GPIO](driver/driver-platform-gpio-develop.md) - [MIPI DSI](driver/driver-platform-mipidsi-des.md)
- [HDMI](driver/driver-platform-hdmi-develop.md) - [PIN](driver/driver-platform-pin-des.md)
- [I2C](driver/driver-platform-i2c-develop.md) - [PWM](driver/driver-platform-pwm-des.md)
- [I3C](driver/driver-platform-i3c-develop.md) - [Regulator](driver/driver-platform-regulator-des.md)
- [MIPI CSI](driver/driver-platform-mipicsi-develop.md) - [RTC](driver/driver-platform-rtc-des.md)
- [MIPI DSI](driver/driver-platform-mipidsi-develop.md) - [SDIO](driver/driver-platform-sdio-des.md)
- [MMC](driver/driver-platform-mmc-develop.md) - [SPI](driver/driver-platform-spi-des.md)
- [PIN](driver/driver-platform-pin-develop.md) - [UART](driver/driver-platform-uart-des.md)
- [PWM](driver/driver-platform-pwm-develop.md) - [WatchDog](driver/driver-platform-watchdog-des.md)
- [Regulator](driver/driver-platform-regulator-develop.md) - 外设驱动使用
- [RTC](driver/driver-platform-rtc-develop.md) - [Audio](driver/driver-peripherals-audio-des.md)
- [SDIO](driver/driver-platform-sdio-develop.md) - [Camera](driver/driver-peripherals-camera-des.md)
- [SPI](driver/driver-platform-spi-develop.md) - [Face_auth](driver/driver-peripherals-face_auth-des.md)
- [UART](driver/driver-platform-uart-develop.md) - [Fingerprint_auth](driver/driver-peripherals-fingerprint_auth-des.md)
- [WatchDog](driver/driver-platform-watchdog-develop.md) - [LCD](driver/driver-peripherals-lcd-des.md)
- 平台驱动使用 - [Light](driver/driver-peripherals-light-des.md)
- [ADC](driver/driver-platform-adc-des.md) - [Pin_auth](driver/driver-peripherals-pinauth-des.md)
- [DAC](driver/driver-platform-dac-des.md) - [Sensor](driver/driver-peripherals-sensor-des.md)
- [GPIO](driver/driver-platform-gpio-des.md) - [Touchscreen](driver/driver-peripherals-touch-des.md)
- [HDMI](driver/driver-platform-hdmi-des.md) - [USB](driver/driver-peripherals-usb-des.md)
- [I2C](driver/driver-platform-i2c-des.md) - [User_auth](driver/driver-peripherals-user-auth-des.md)
- [I3C](driver/driver-platform-i3c-des.md) - [Vibrator](driver/driver-peripherals-vibrator-des.md)
- [MIPI CSI](driver/driver-platform-mipicsi-des.md) - [WLAN](driver/driver-peripherals-external-des.md)
- [MIPI DSI](driver/driver-platform-mipidsi-des.md) - 编译构建
- [PIN](driver/driver-platform-pin-des.md) - [编译构建指导](subsystems/subsys-build-all.md)
- [PWM](driver/driver-platform-pwm-des.md) - [构建系统编码规范与最佳实践](subsystems/subsys-build-gn-coding-style-and-best-practice.md)
- [Regulator](driver/driver-platform-regulator-des.md) - [编译构建Kconfig可视化配置指导](subsystems/subsys-build-gn-kconfig-visual-config-guide.md)
- [RTC](driver/driver-platform-rtc-des.md) - 编译构建相关操作
- [SDIO](driver/driver-platform-sdio-des.md) - [子系统配置规则](subsystems/subsys-build-subsystem.md#子系统配置规则)
- [SPI](driver/driver-platform-spi-des.md) - [产品配置规则](subsystems/subsys-build-product.md#产品配置规则)
- [UART](driver/driver-platform-uart-des.md) - [子系统配置规则](subsystems/subsys-build-subsystem.md#子系统配置规则)
- [WatchDog](driver/driver-platform-watchdog-des.md) - [部件配置规则](subsystems/subsys-build-component.md#部件配置规则)
- 外设驱动使用 - [模块配置规则](subsystems/subsys-build-module.md#模块配置规则)
- [Audio](driver/driver-peripherals-audio-des.md) - [芯片解决方案配置规则](subsystems/subsys-build-chip_solution.md#芯片解决方案配置规则)
- [Camera](driver/driver-peripherals-camera-des.md) - [特性配置规则](subsystems/subsys-build-feature.md#特性配置规则)
- [Face_auth](driver/driver-peripherals-face_auth-des.md) - [系统能力配置规则](subsystems/subsys-build-syscap.md#如何按需配置部件的系统能力)
- [Fingerprint_auth](driver/driver-peripherals-fingerprint_auth-des.md) - [关于deps、external_deps的使用](subsystems/subsys-build-reference.md#关于deps、external_deps的使用)
- [LCD](driver/driver-peripherals-lcd-des.md) - [开源软件Notice收集策略说明](subsystems/subsys-build-reference.md#开源软件notice收集策略说明)
- [Light](driver/driver-peripherals-light-des.md) - [加快本地编译的一些参数](subsystems/subsys-build-reference.md#加快本地编译的一些参数)
- [Pin_auth](driver/driver-peripherals-pinauth-des.md) - [查看NinjaTrace](subsystems/subsys-build-reference.md#查看ninjatrace)
- [Sensor](driver/driver-peripherals-sensor-des.md) - [HAP编译构建指导](subsystems/subsys-build-gn-hap-compilation-guide.md)
- [Touchscreen](driver/driver-peripherals-touch-des.md) - [ 常见问题](subsystems/subsys-build-FAQ.md)
- [USB](driver/driver-peripherals-usb-des.md) - [分布式远程启动](subsystems/subsys-remote-start.md)
- [User_auth](driver/driver-peripherals-user-auth-des.md) - 图形图像
- [Vibrator](driver/driver-peripherals-vibrator-des.md) - [图形图像概述](subsystems/subsys-graphics-overview.md)
- [WLAN](driver/driver-peripherals-external-des.md) - [容器类组件开发指导](subsystems/subsys-graphics-container-guide.md)
- 编译构建 - [布局容器类组件开发指导](subsystems/subsys-graphics-layout-guide.md)
- [编译构建指导](subsystems/subsys-build-all.md) - [普通组件开发指导](subsystems/subsys-graphics-common-guide.md)
- [构建系统编码规范和最佳实践指导](subsystems/subsys-build-gn-coding-style-and-best-practice.md) - [动画开发指导](subsystems/subsys-graphics-animation-guide.md)
- [编译构建Kconfig可视化配置指导](subsystems/subsys-build-gn-kconfig-visual-config-guide.md) - 媒体
- [分布式远程启动](subsystems/subsys-remote-start.md) - 相机
- 图形图像 - [相机开发概述](subsystems/subsys-multimedia-camera-overview.md)
- [图形图像概述](subsystems/subsys-graphics-overview.md) - [拍照开发指导](subsystems/subsys-multimedia-camera-photo-guide.md)
- [容器类组件开发指导](subsystems/subsys-graphics-container-guide.md) - [录像开发指导](subsystems/subsys-multimedia-camera-record-guide.md)
- [布局容器类组件开发指导](subsystems/subsys-graphics-layout-guide.md) - [预览开发指导](subsystems/subsys-multimedia-camera-preview-guide.md)
- [普通组件开发指导](subsystems/subsys-graphics-common-guide.md) - 音视频
- [动画开发指导](subsystems/subsys-graphics-animation-guide.md) - [音视频开发概述](subsystems/subsys-multimedia-video-overview.md)
- 媒体 - [音视频播放开发指导](subsystems/subsys-multimedia-video-play-guide.md)
- 相机 - [音视频录制开发指导](subsystems/subsys-multimedia-video-record-guide.md)
- [相机开发概述](subsystems/subsys-multimedia-camera-overview.md) - 公共基础
- [拍照开发指导](subsystems/subsys-multimedia-camera-photo-guide.md) - [公共基础库概述](subsystems/subsys-utils-overview.md)
- [录像开发指导](subsystems/subsys-multimedia-camera-record-guide.md) - [公共基础库开发指导](subsystems/subsys-utils-guide.md)
- [预览开发指导](subsystems/subsys-multimedia-camera-preview-guide.md) - [公共基础库常见问题](subsystems/subsys-utils-faqs.md)
- 音视频 - AI框架
- [音视频开发概述](subsystems/subsys-multimedia-video-overview.md) - [概述](subsystems/subsys-aiframework-guide.md)
- [音视频播放开发指导](subsystems/subsys-multimedia-video-play-guide.md) - [搭建环境](subsystems/subsys-aiframework-envbuild.md)
- [音视频录制开发指导](subsystems/subsys-multimedia-video-record-guide.md) - 技术规范
- 公共基础 - [代码管理规范](subsystems/subsys-aiframework-tech-codemanage.md)
- [公共基础库概述](subsystems/subsys-utils-overview.md) - [命名规范](subsystems/subsys-aiframework-tech-name.md)
- [公共基础库开发指导](subsystems/subsys-utils-guide.md) - [接口开发规范](subsystems/subsys-aiframework-tech-interface.md)
- [公共基础库常见问题](subsystems/subsys-utils-faqs.md) - 开发指导
- AI框架 - [SDK开发过程](subsystems/subsys-aiframework-devguide-sdk.md)
- [AI引擎框架开发指南](subsystems/subsys-aiframework-guide.md) - [插件的开发过程](subsystems/subsys-aiframework-devguide-plugin.md)
- [搭建环境](subsystems/subsys-aiframework-envbuild.md) - [配置文件的开发过程](subsystems/subsys-aiframework-devguide-conf.md)
- 技术规范 - 开发示例
- [代码管理规范](subsystems/subsys-aiframework-tech-codemanage.md) - [唤醒词识别SDK的开发示例](subsystems/subsys-aiframework-demo-sdk.md)
- [命名规范](subsystems/subsys-aiframework-tech-name.md) - [唤醒词识别插件的开发示例](subsystems/subsys-aiframework-demo-plugin.md)
- [接口开发规范](subsystems/subsys-aiframework-tech-interface.md) - [唤醒词识别配置文件的开发示例](subsystems/subsys-aiframework-demo-conf.md)
- 开发指导 - 数据管理
- [SDK开发过程](subsystems/subsys-aiframework-devguide-sdk.md) - 关系型数据库
- [插件的开发过程](subsystems/subsys-aiframework-devguide-plugin.md) - [关系型数据库概述](subsystems/subsys-data-relational-database-overview.md)
- [配置文件的开发过程](subsystems/subsys-aiframework-devguide-conf.md) - [关系型数据库开发指导](subsystems/subsys-data-relational-database-guide.md)
- 开发示例 - 轻量级数据存储
- [唤醒词识别SDK的开发示例](subsystems/subsys-aiframework-demo-sdk.md) - [轻量级数据存储概述](subsystems/subsys-data-storage-overview.md)
- [唤醒词识别插件的开发示例](subsystems/subsys-aiframework-demo-plugin.md) - [轻量级数据存储开发指导](subsystems/subsys-data-storage-guide.md)
- [唤醒词识别配置文件的开发示例](subsystems/subsys-aiframework-demo-conf.md) - Sensor服务
- 数据管理 - [Sensor服务概述](subsystems/subsys-sensor-overview.md)
- 关系型数据库 - [Sensor服务使用指导](subsystems/subsys-sensor-guide.md)
- [关系型数据库概述](subsystems/subsys-data-relational-database-overview.md) - [Sensor服务使用实例](subsystems/subsys-sensor-demo.md)
- [关系型数据库开发指导](subsystems/subsys-data-relational-database-guide.md) - USB服务
- 轻量级数据存储 - [USB服务概述](subsystems/subsys-usbservice-overview.md)
- [轻量级数据存储概述](subsystems/subsys-data-storage-overview.md) - [USB服务使用指导](subsystems/subsys-usbservice-guide.md)
- [轻量级数据存储开发指导](subsystems/subsys-data-storage-guide.md) - [USB服务使用实例](subsystems/subsys-usbservice-demo.md)
- Sensor服务 - 用户程序框架
- [Sensor服务概述](subsystems/subsys-sensor-overview.md) - [概述](subsystems/subsys-application-framework-overview.md)
- [Sensor服务使用指导](subsystems/subsys-sensor-guide.md) - [搭建环境](subsystems/subsys-application-framework-envbuild.md)
- [Sensor服务使用实例](subsystems/subsys-sensor-demo.md) - [开发指导](subsystems/subsys-application-framework-guide.md)
- USB服务子系统 - [开发实例](subsystems/subsys-application-framework-demo.md)
- [USB服务概述](subsystems/subsys-usbservice-overview.md) - [OTA升级](subsystems/subsys-ota-guide.md)
- [USB服务使用指导](subsystems/subsys-usbservice-guide.md) - 电话服务
- [USB服务使用实例](subsystems/subsys-usbservice-demo.md) - [电话服务概述](subsystems/subsys-tel-overview.md)
- 用户程序框架 - [电话服务开发指导](subsystems/subsys-tel-guide.md)
- [概述](subsystems/subsys-application-framework-overview.md) - 安全
- [搭建环境](subsystems/subsys-application-framework-envbuild.md) - [概述](subsystems/subsys-security-overview.md)
- [开发指导](subsystems/subsys-application-framework-guide.md) - [应用验签开发指导](subsystems/subsys-security-sigverify.md)
- [开发实例](subsystems/subsys-application-framework-demo.md) - [应用权限管理开发指导](subsystems/subsys-security-rightmanagement.md)
- [OTA升级](subsystems/subsys-ota-guide.md) - [IPC通信鉴权开发指导](subsystems/subsys-security-communicationverify.md)
- 电话服务 - [设备安全等级管理开发指导](subsystems/subsys-security-devicesecuritylevel.md)
- [电话服务概述](subsystems/subsys-tel-overview.md) - [OpenHarmony通用密钥库系统开发指导](subsystems/subsys-security-huks-guide.md)
- [电话服务开发指导](subsystems/subsys-tel-guide.md) - 启动恢复
- 安全 - [启动恢复子系统概述](subsystems/subsys-boot-overview.md)
- [概述](subsystems/subsys-security-overview.md) - init启动引导组件
- [应用验签开发指导](subsystems/subsys-security-sigverify.md) - [引导启动配置文件](subsystems/subsys-boot-init-cfg.md)
- [应用权限管理开发指导](subsystems/subsys-security-rightmanagement.md) - [jobs管理](subsystems/subsys-boot-init-jobs.md)
- [IPC通信鉴权开发指导](subsystems/subsys-security-communicationverify.md) - [服务管理](subsystems/subsys-boot-init-service.md)
- [设备安全等级管理开发指导](subsystems/subsys-security-devicesecuritylevel.md) - [系统参数](subsystems/subsys-boot-init-sysparam.md)
- 启动恢复 - [沙盒管理](subsystems/subsys-boot-init-sandbox.md)
- [启动恢复子系统概述](subsystems/subsys-boot-overview.md) - [插件](subsystems/subsys-boot-init-plugin.md)
- init启动引导组件 - [appspawn应用孵化组件](subsystems/subsys-boot-appspawn.md)
- [引导启动配置文件](subsystems/subsys-boot-init-cfg.md) - [bootstrap服务启动组件](subsystems/subsys-boot-bootstrap.md)
- [jobs管理](subsystems/subsys-boot-init-jobs.md) - [常见问题](subsystems/subsys-boot-faqs.md)
- [服务管理](subsystems/subsys-boot-init-service.md) - [参考](subsystems/subsys-boot-ref.md)
- [系统参数](subsystems/subsys-boot-init-sysparam.md) - DFX
- [沙盒管理](subsystems/subsys-boot-init-sandbox.md) - [DFX概述](subsystems/subsys-dfx-overview.md)
- [插件](subsystems/subsys-boot-init-plugin.md) - [HiLog开发指导](subsystems/subsys-dfx-hilog-rich.md)
- [appspawn应用孵化组件](subsystems/subsys-boot-appspawn.md) - [HiLog_Lite开发指导](subsystems/subsys-dfx-hilog-lite.md)
- [bootstrap服务启动组件](subsystems/subsys-boot-bootstrap.md) - [HiTrace开发指导](subsystems/subsys-dfx-hitrace.md)
- [常见问题](subsystems/subsys-boot-faqs.md) - [HiCollie开发指导](subsystems/subsys-dfx-hicollie.md)
- [参考](subsystems/subsys-boot-ref.md) - HiSysEvent开发指导
- DFX - [HiSysEvent打点配置指导](subsystems/subsys-dfx-hisysevent-logging-config.md)
- [DFX概述](subsystems/subsys-dfx-overview.md) - [HiSysEvent打点指导](subsystems/subsys-dfx-hisysevent-logging.md)
- [HiLog开发指导](subsystems/subsys-dfx-hilog-rich.md) - [HiSysEvent订阅指导](subsystems/subsys-dfx-hisysevent-listening.md)
- [HiLog\_Lite开发指导](subsystems/subsys-dfx-hilog-lite.md) - [HiSysEvent查询指导](subsystems/subsys-dfx-hisysevent-query.md)
- [HiTrace开发指导](subsystems/subsys-dfx-hitrace.md) - [HiSysEvent工具使用指导](subsystems/subsys-dfx-hisysevent-tool.md)
- [HiCollie开发指导](subsystems/subsys-dfx-hicollie.md) - [HiDumper开发指导](subsystems/subsys-dfx-hidumper.md)
- HiSysEvent开发指导 - [HiChecker开发指导](subsystems/subsys-dfx-hichecker.md)
- [HiSysEvent打点配置指导](subsystems/subsys-dfx-hisysevent-logging-config.md) - [Faultlogger开发指导](subsystems/subsys-dfx-faultlogger.md)
- [HiSysEvent打点指导](subsystems/subsys-dfx-hisysevent-logging.md) - [Hiview开发指导](subsystems/subsys-dfx-hiview.md)
- [HiSysEvent订阅指导](subsystems/subsys-dfx-hisysevent-listening.md) - [bytrace使用指导](subsystems/subsys-toolchain-bytrace-guide.md)
- [HiSysEvent查询指导](subsystems/subsys-dfx-hisysevent-query.md) - [hiperf使用指导](subsystems/subsys-toolchain-hiperf.md)
- [HiSysEvent工具使用指导](subsystems/subsys-dfx-hisysevent-tool.md) - [XTS测试用例开发指导](subsystems/subsys-xts-guide.md)
- [HiDumper开发指导](subsystems/subsys-dfx-hidumper.md)
- [HiChecker开发指导](subsystems/subsys-dfx-hichecker.md)
- [Faultlogger开发指导](subsystems/subsys-dfx-faultlogger.md)
- [Hiview开发指导](subsystems/subsys-dfx-hiview.md)
- 专题 - 专题
- HPM Part - HPM Part
- [HPM Part介绍](hpm-part/hpm-part-about.md) - [HPM Part介绍](hpm-part/hpm-part-about.md)
- [HPM Part开发指导](hpm-part/hpm-part-development.md) - [HPM Part开发指导](hpm-part/hpm-part-development.md)
- [HPM Part参考](hpm-part/hpm-part-reference.md) - [HPM Part参考](hpm-part/hpm-part-reference.md)
- 设备开发示例 - 设备开发示例
- 轻量和小型系统设备 - 轻量和小型系统设备
- WLAN连接类产品 - WLAN连接类产品
- [LED外设控制](guide/device-wlan-led-control.md) - [LED外设控制](guide/device-wlan-led-control.md)
- [集成三方SDK](guide/device-wlan-sdk.md) - [集成三方SDK](guide/device-wlan-sdk.md)
- 无屏摄像头类产品 - 无屏摄像头类产品
- 摄像头控制 - 摄像头控制
- [概述](guide/device-iotcamera-control-overview.md) - [概述](guide/device-iotcamera-control-overview.md)
- 示例开发 - 示例开发
- [拍照开发指导](guide/device-iotcamera-control-demo-photodevguide.md) - [拍照开发指导](guide/device-iotcamera-control-demo-photodevguide.md)
- [录像开发指导](guide/device-iotcamera-control-demo-videodevguide.md) - [录像开发指导](guide/device-iotcamera-control-demo-videodevguide.md)
- [应用实例](guide/device-iotcamera-control-example.md) - [应用实例](guide/device-iotcamera-control-example.md)
- 带屏摄像头类产品 - 带屏摄像头类产品
- 屏幕和摄像头控制 - 屏幕和摄像头控制
- [概述](guide/device-camera-control-overview.md) - [概述](guide/device-camera-control-overview.md)
- 示例开发 - 示例开发
- [拍照开发指导](guide/device-camera-control-demo-photoguide.md) - [拍照开发指导](guide/device-camera-control-demo-photoguide.md)
- [录像开发指导](guide/device-camera-control-demo-videoguide.md) - [录像开发指导](guide/device-camera-control-demo-videoguide.md)
- [预览开发指导](guide/device-camera-control-demo-previewguide.md) - [预览开发指导](guide/device-camera-control-demo-previewguide.md)
- [应用实例](guide/device-camera-control-example.md) - [应用实例](guide/device-camera-control-example.md)
- 视觉应用开发 - 视觉应用开发
- [概述](guide/device-camera-visual-overview.md) - [概述](guide/device-camera-visual-overview.md)
- [开发准备](guide/device-camera-visual-prepare.md) - [开发准备](guide/device-camera-visual-prepare.md)
- [添加页面](guide/device-camera-visual-addpage.md) - [添加页面](guide/device-camera-visual-addpage.md)
- [开发首页](guide/device-camera-visual-firstpage.md) - [开发首页](guide/device-camera-visual-firstpage.md)
- [开发详情页](guide/device-camera-visual-details.md) - [开发详情页](guide/device-camera-visual-details.md)
- [调试打包](guide/device-camera-visual-debug.md) - [调试打包](guide/device-camera-visual-debug.md)
- [真机运行](guide/device-camera-visual-run.md) - [真机运行](guide/device-camera-visual-run.md)
- [常见问题](guide/device-camera-visual-faqs.md) - [常见问题](guide/device-camera-visual-faqs.md)
- 标准系统设备 - 标准系统设备
- [时钟应用开发指导](guide/device-clock-guide.md) - [时钟应用开发指导](guide/device-clock-guide.md)
- [平台驱动开发示例](guide/device-driver-demo.md) - [平台驱动开发示例](guide/device-driver-demo.md)
- [外设驱动开发示例](guide/device-outerdriver-demo.md) - [外设驱动开发示例](guide/device-outerdriver-demo.md)
- 调测
- 调测
- [测试用例开发](subsystems/subsys-testguide-test.md) - [测试用例开发](subsystems/subsys-testguide-test.md)
- 调测工具 - 调测工具
- [bytrace使用指导](subsystems/subsys-toolchain-bytrace-guide.md) - [bytrace使用指导](subsystems/subsys-toolchain-bytrace-guide.md)
- [hdc\_std 使用指导](subsystems/subsys-toolchain-hdc-guide.md) - [hdc\_std 使用指导](subsystems/subsys-toolchain-hdc-guide.md)
- [hiperf 使用指南](subsystems/subsys-toolchain-hiperf.md) - [hiperf 使用指南](subsystems/subsys-toolchain-hiperf.md)
- [XTS认证](subsystems/subsys-xts-guide.md) - [XTS认证](subsystems/subsys-xts-guide.md)
- 工具 - 工具
- [Docker编译环境](get-code/gettools-acquire.md) - [Docker编译环境](get-code/gettools-acquire.md)
- [IDE集成开发环境](get-code/gettools-ide.md) - [IDE集成开发环境](get-code/gettools-ide.md)
- 示例教程 - 示例教程
- [Demo示例](https://growing.openharmony.cn/mainPlay/sample) - [Demo示例](https://growing.openharmony.cn/mainPlay/sample)
- [Codelabs](https://gitee.com/openharmony/codelabs/blob/master/README.md) - [Codelabs](https://gitee.com/openharmony/codelabs/blob/master/README.md)
- 参考
- [常见问题概述](faqs/faqs-overview.md)
- [环境搭建常见问题](faqs/faqs-environment-setup.md)
- [编译构建常见问题](faqs/faqs-building.md)
- [烧录常见问题](faqs/faqs-burning.md)
- [内核常见问题](faqs/faqs-kernel.md)
- [移植常见问题](faqs/faqs-porting.md)
- [启动恢复常见问题](faqs/faqs-startup.md)
- [系统应用常见问题](faqs/faqs-system-applications.md)
- 参考
- 常见问题
- [常见问题概述](faqs/faqs-overview.md)
- [环境搭建常见问题](faqs/faqs-environment-setup.md)
- [编译构建常见问题](faqs/faqs-building.md)
- [烧录常见问题](faqs/faqs-burning.md)
- [内核常见问题](faqs/faqs-kernel.md)
- [移植常见问题](faqs/faqs-porting.md)
- [启动恢复常见问题](faqs/faqs-startup.md)
- [系统应用常见问题](faqs/faqs-system-applications.md)
- HDI接口参考
- 模块
- [Audio](reference/hdi-apis/_audio.md)
- [Battery](reference/hdi-apis/battery.md)
- [Camera](reference/hdi-apis/_camera.md)
- [Codec](reference/hdi-apis/_codec.md)
- [Display](reference/hdi-apis/_display.md)
- [HdfFaceAuth](reference/hdi-apis/_hdf_face_auth.md)
- [Input](reference/hdi-apis/_input.md)
- [Light](reference/hdi-apis/_light.md)
- [HdfPinAuth](reference/hdi-apis/_hdf_pin_auth.md)
- [Power](reference/hdi-apis/power.md)
- [Sensor](reference/hdi-apis/_sensor.md)
- [Thermal](reference/hdi-apis/thermal.md)
- [USB](reference/hdi-apis/_u_s_b.md)
- [HdfUserAuth](reference/hdi-apis/_hdf_user_auth.md)
- [Vibrator](reference/hdi-apis/_vibrator.md)
- [WLAN](reference/hdi-apis/_w_l_a_n.md)
- 头文件和结构体
- 头文件
- [audio_adapter.h](reference/hdi-apis/audio__adapter_8h.md)
- [audio_attribute.h](reference/hdi-apis/audio__attribute_8h.md)
- [audio_capture.h](reference/hdi-apis/audio__capture_8h.md)
- [audio_control.h](reference/hdi-apis/audio__control_8h.md)
- [audio_manager.h](reference/hdi-apis/audio__manager_8h.md)
- [audio_render.h](reference/hdi-apis/audio__render_8h.md)
- [audio_scene.h](reference/hdi-apis/audio__scene_8h.md)
- [audio_types.h](reference/hdi-apis/audio__types_8h.md)
- [audio_volume.h](reference/hdi-apis/audio__volume_8h.md)
- [codec_callback_if.h](reference/hdi-apis/codec__callback__if_8h.md)
- [codec_common_type.h](reference/hdi-apis/codec__common__type_8h.md)
- [codec_component_if.h](reference/hdi-apis/codec__component__if_8h.md)
- [codec_component_manager.h](reference/hdi-apis/codec__component__manager_8h.md)
- [codec_component_type.h](reference/hdi-apis/codec__component__type_8h.md)
- [display_device.h](reference/hdi-apis/display__device_8h.md)
- [display_gfx.h](reference/hdi-apis/display__gfx_8h.md)
- [display_gralloc.h](reference/hdi-apis/display__gralloc_8h.md)
- [display_layer.h](reference/hdi-apis/display__layer_8h.md)
- [display_type.h](reference/hdi-apis/display__type_8h.md)
- [icamera_device_callback.h](reference/hdi-apis/icamera__device__callback_8h.md)
- [icamera_device.h](reference/hdi-apis/icamera__device_8h.md)
- [icamera_host_callback.h](reference/hdi-apis/icamera__host__callback_8h.md)
- [icamera_host.h](reference/hdi-apis/icamera__host_8h.md)
- [input_controller.h](reference/hdi-apis/input__controller_8h.md)
- [input_manager.h](reference/hdi-apis/input__manager_8h.md)
- [input_reporter.h](reference/hdi-apis/input__reporter_8h.md)
- [input_type.h](reference/hdi-apis/input__type_8h.md)
- [ioffline_stream_operator.h](reference/hdi-apis/ioffline__stream__operator_8h.md)
- [istream_operator_callback.h](reference/hdi-apis/istream__operator__callback_8h.md)
- [istream_operator.h](reference/hdi-apis/istream__operator_8h.md)
- [light_if.h](reference/hdi-apis/light__if_8h.md)
- [light_type.h](reference/hdi-apis/light_8typeh.md)
- [sensor_if.h](reference/hdi-apis/sensor__if_8h.md)
- [sensor_type.h](reference/hdi-apis/sensor__type_8h.md)
- [types.h](reference/hdi-apis/types_8h.md)
- [usb_info.h](reference/hdi-apis/usb__info_8h.md)
- [usbd_client.h](reference/hdi-apis/usbd__client_8h.md)
- [usbd_subscriber.h](reference/hdi-apis/usbd__subscriber_8h.md)
- [usbd_type.h](reference/hdi-apis/usbd__type_8h.md)
- [vibrator_if.h](reference/hdi-apis/vibrator__if_8h.md)
- [vibrator_type.h](reference/hdi-apis/vibrator__type_8h.md)
- [wifi_hal_ap_feature.h](reference/hdi-apis/wifi__hal__ap__feature_8h.md)
- [wifi_hal_base_feature.h](reference/hdi-apis/wifi__hal__base__feature_8h.md)
- [wifi_hal_sta_feature.h](reference/hdi-apis/wifi__hal__sta__feature_8h.md)
- [wifi_hal.h](reference/hdi-apis/wifi__hal_8h.md)
- [IExecutor.idl](reference/hdi-apis/face__auth_2_i_executor_8idl.md)
- [IExecutorCallback.idl](reference/hdi-apis/face__auth_2_i_executor_callback_8idl.md)
- [FaceAuthTypes.idl](reference/hdi-apis/_face_auth_types_8idl.md)
- [PinAuthTypes.idl](reference/hdi-apis/_pin_auth_types_8idl.md)
- [IBatteryCallback.idl](reference/hdi-apis/_i_battery_callback_8idl.md)
- [IBatteryInterface.idl](reference/hdi-apis/_i_battery_interface_8idl.md)
- [IExecutor.idl](reference/hdi-apis/pin__auth_2_i_executor_8idl.md)
- [IExecutorCallback.idl](reference/hdi-apis/pin__auth_2_i_executor_callback_8idl.md)
- [IFaceAuthInterface.idl](reference/hdi-apis/_i_face_auth_interface_8idl.md)
- [IPinAuthInterface.idl](reference/hdi-apis/_i_pin_auth_interface_8idl.md)
- [IPowerHdiCallback.idl](reference/hdi-apis/_i_power_hdi_callback_8idl.md)
- [IPowerInterface.idl](reference/hdi-apis/_i_power_interface_8idl.md)
- [IThermalInterface.idl](reference/hdi-apis/_i_thermal_interface_8idl.md)
- [IThermalCallback.idl](reference/hdi-apis/_i_thermal_callback_8idl.md)
- [IUserAuthInterface.idl](reference/hdi-apis/_i_user_auth_interface_8idl.md)
- [PowerTypes.idl](reference/hdi-apis/_power_types_8idl.md)
- [ThermalTypes.idl](reference/hdi-apis/_thermal_types_8idl.md)
- [Types.idl](reference/hdi-apis/_types_8idl.md)
- [UserAuthTypes.idl](reference/hdi-apis/_user_auth_types_8idl.md)
- 结构体
- [attribute](reference/hdi-apis/____attribute____.md)
- [Alignment](reference/hdi-apis/_alignment.md)
- [AllocInfo](reference/hdi-apis/_alloc_info.md)
- [AudioAdapter](reference/hdi-apis/_audio_adapter.md)
- [AudioAdapterDescriptor](reference/hdi-apis/_audio_adapter_descriptor.md)
- [AudioAttribute](reference/hdi-apis/_audio_attribute.md)
- [AudioCapture](reference/hdi-apis/_audio_capture.md)
- [AudioControl](reference/hdi-apis/_audio_control.md)
- [AudioDevExtInfo](reference/hdi-apis/_audio_dev_ext_info.md)
- [AudioDeviceDescriptor](reference/hdi-apis/_audio_device_descriptor.md)
- [AudioManager](reference/hdi-apis/_audio_manager.md)
- [AudioMixExtInfo](reference/hdi-apis/_audio_mix_ext_info.md)
- [AudioMmapBufferDescripter](reference/hdi-apis/_audio_mmap_buffer_descripter.md)
- [AudioPort](reference/hdi-apis/_audio_port.md)
- [AudioPortCap](reference/hdi-apis/_audio_port_cap.md)
- [AudioPortCapability](reference/hdi-apis/_audio_port_capability.md)
- [AudioRender](reference/hdi-apis/_audio_render.md)
- [AudioRoute](reference/hdi-apis/_audio_route.md)
- [AudioRouteNode](reference/hdi-apis/_audio_route_node.md)
- [AudioSampleAttributes](reference/hdi-apis/_audio_sample_attributes.md)
- [AudioScene](reference/hdi-apis/_audio_scene.md)
- [AudioSceneDescriptor](reference/hdi-apis/_audio_scene_descriptor.md)
- [AudioSceneDescriptor::SceneDesc](reference/hdi-apis/union_audio_scene_descriptor_1_1_scene_desc.md)
- [AudioSessionExtInfo](reference/hdi-apis/_audio_session_ext_info.md)
- [AudioSubPortCapability](reference/hdi-apis/_audio_sub_port_capability.md)
- [AudioTimeStamp](reference/hdi-apis/_audio_time_stamp.md)
- [AudioVolume](reference/hdi-apis/_audio_volume.md)
- [AuthResultInfo](reference/hdi-apis/_auth_result_info.md)
- [AuthSolution](reference/hdi-apis/_auth_solution.md)
- [BatteryInfo](reference/hdi-apis/_battery_info.md)
- [BufferData](reference/hdi-apis/_buffer_data.md)
- [CodecCallbackType](reference/hdi-apis/_codec_callback_type.md)
- [CodecCompCapability](reference/hdi-apis/_codec_comp_capability.md)
- [CodecComponentManager](reference/hdi-apis/_codec_component_manager.md)
- [CodecComponentType](reference/hdi-apis/_codec_component_type.md)
- [CompVerInfo](reference/hdi-apis/_comp_ver_info.md)
- [CredentialInfo](reference/hdi-apis/_credential_info.md)
- [DeviceFuncs](reference/hdi-apis/_device_funcs.md)
- [DisplayCapability](reference/hdi-apis/_display_capability.md)
- [DisplayInfo](reference/hdi-apis/_display_info.md)
- [DisplayModeInfo](reference/hdi-apis/_display_mode_info.md)
- [EnrolledInfo](reference/hdi-apis/_enrolled_info.md)
- [EnrollParam](reference/hdi-apis/_enroll_param.md)
- [EnrollResultInfo](reference/hdi-apis/_enroll_resultinfo.md)
- [EventInfo](reference/hdi-apis/_event_info.md)
- [ExecutorInfo](reference/hdi-apis/_executor_info.md)
- [ExecutorInfo](reference/hdi-apis/_user_executor_info.md)
- [ExecutorRegisterInfo](reference/hdi-apis/_executor_register_info.md)
- [ExecutorSendMsg](reference/hdi-apis/_executor_send_msg.md)
- [GetBufferHandleUsageParams](reference/hdi-apis/_get_buffer_handle_usage_params.md)
- [GfxFuncs](reference/hdi-apis/_gfx_funcs.md)
- [GfxOpt](reference/hdi-apis/_gfx_opt.md)
- [GrallocFuncs](reference/hdi-apis/_gralloc_funcs.md)
- [HdfThermalCallbackInfo](reference/hdi-apis/_hdf_thermal_callback_info.md)
- [HDRCapability](reference/hdi-apis/_h_d_r_capability.md)
- [HDRMetaData](reference/hdi-apis/_h_d_r_meta_data.md)
- [IBatteryCallback](reference/hdi-apis/interface_i_battery_callback.md)
- [IBatteryInterface](reference/hdi-apis/interface_i_battery_interface.md)
- [ICircle](reference/hdi-apis/_i_circle.md)
- [IdentifyResultInfo](reference/hdi-apis/_identify_result_info.md)
- [IExecutor](reference/hdi-apis/interface_i_executor.md)
- [IExecutor](reference/hdi-apis/interface_pin_i_executor.md)
- [IExecutorCallback](reference/hdi-apis/interface_i_executor_callback.md)
- [IExecutorCallback](reference/hdi-apis/interface_pin_i_executor_callback.md)
- [IFaceAuthInterface](reference/hdi-apis/interface_i_face_auth_interface.md)
- [IInputInterface](reference/hdi-apis/_i_input_interface.md)
- [ILine](reference/hdi-apis/_i_line.md)
- [InputController](reference/hdi-apis/_input_controller.md)
- [InputDevAbility](reference/hdi-apis/_input_dev_ability.md)
- [InputDevAttr](reference/hdi-apis/_input_dev_attr.md)
- [InputDevDesc](reference/hdi-apis/_input_dev_desc.md)
- [InputDevIdentify](reference/hdi-apis/_input_dev_identify.md)
- [InputDeviceInfo](reference/hdi-apis/_device_info.md)
- [InputDimensionInfo](reference/hdi-apis/_input_dimension_info.md)
- [InputEventCb](reference/hdi-apis/_input_report_event_cb.md)
- [InputEventPackage](reference/hdi-apis/_event_package.md)
- [InputExtraCmd](reference/hdi-apis/_input_extra_cmd.md)
- [InputHostCb](reference/hdi-apis/_input_host_cb.md)
- [InputHotPlugEvent](reference/hdi-apis/_input_hotplug_event.md)
- [InputManager](reference/hdi-apis/_input_manager.md)
- [InputReporter](reference/hdi-apis/_input_reporter.md)
- [IPinAuthInterface](reference/hdi-apis/interface_i_pin_auth_interface.md)
- [IPowerHdiCallback](reference/hdi-apis/interface_i_power_hdi_callback.md)
- [IPowerInterface](reference/hdi-apis/interface_i_power_interface.md)
- [IRect](reference/hdi-apis/_i_rect.md)
- [ISurface](reference/hdi-apis/_i_surface.md)
- [IThermalCallback](reference/hdi-apis/interface_i_thermal_callback.md)
- [IThermalInterface](reference/hdi-apis/interface_i_thermal_interface.md)
- [IUserAuthInterface](reference/hdi-apis/interface_i_user_auth_interface.md)
- [IWiFi](reference/hdi-apis/_i_wi_fi.md)
- [IWiFiAp](reference/hdi-apis/_i_wi_fi_ap.md)
- [IWiFiBaseFeature](reference/hdi-apis/_i_wi_fi_base_feature.md)
- [IWiFiSta](reference/hdi-apis/_i_wi_fi_sta.md)
- [LayerAlpha](reference/hdi-apis/_layer_alpha.md)
- [LayerBuffer](reference/hdi-apis/_layer_buffer.md)
- [LayerFuncs](reference/hdi-apis/_layer_funcs.md)
- [LayerInfo](reference/hdi-apis/_layer_info.md)
- [LightEffect](reference/hdi-apis/_light_effect.md)
- [LightFlashEffect](reference/hdi-apis/_light_flash_effect.md)
- [LightInfo](reference/hdi-apis/_light_info.md)
- [LightInterface](reference/hdi-apis/_light_interface.md)
- [OHOS::Camera::CaptureEndedInfo](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_capture_ended_info.md)
- [OHOS::Camera::CaptureErrorInfo](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_capture_error_info.md)
- [OHOS::Camera::CaptureInfo](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_capture_info.md)
- [OHOS::Camera::ICameraDevice](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_i_camera_device.md)
- [OHOS::Camera::ICameraDeviceCallback](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_i_camera_device_callback.md)
- [OHOS::Camera::ICameraHost](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_i_camera_host.md)
- [OHOS::Camera::ICameraHostCallback](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_i_camera_host_callback.md)
- [OHOS::Camera::IOfflineStreamOperator](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_i_offline_stream_operator.md)
- [OHOS::Camera::IStreamOperator](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_i_stream_operator.md)
- [OHOS::Camera::IStreamOperatorCallback](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_i_stream_operator_callback.md)
- [OHOS::Camera::StreamAttribute](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_stream_attribute.md)
- [OHOS::Camera::StreamInfo](reference/hdi-apis/_o_h_o_s_1_1_camera_1_1_stream_info.md)
- [OHOS::USB::UsbCtrlTransfer](reference/hdi-apis/_o_h_o_s_1_1_u_s_b_1_1_usb_ctrl_transfer.md)
- [OHOS::USB::UsbdClient](reference/hdi-apis/_o_h_o_s_1_1_u_s_b_1_1_usbd_client.md)
- [OHOS::USB::UsbDev](reference/hdi-apis/_o_h_o_s_1_1_u_s_b_1_1_usb_dev.md)
- [OHOS::USB::USBDeviceInfo](reference/hdi-apis/_o_h_o_s_1_1_u_s_b_1_1_u_s_b_device_info.md)
- [OHOS::USB::UsbdSubscriber](reference/hdi-apis/_o_h_o_s_1_1_u_s_b_1_1_usbd_subscriber.md)
- [OHOS::USB::UsbInfo](reference/hdi-apis/_o_h_o_s_1_1_u_s_b_1_1_usb_info.md)
- [OHOS::USB::UsbPipe](reference/hdi-apis/_o_h_o_s_1_1_u_s_b_1_1_usb_pipe.md)
- [OmxCodecBuffer](reference/hdi-apis/_omx_codec_buffer.md)
- [PortCap](reference/hdi-apis/union_port_cap.md)
- [PresentTimestamp](reference/hdi-apis/_present_timestamp.md)
- [PropertyObject](reference/hdi-apis/_property_object.md)
- [RangeValue](reference/hdi-apis/_range_value.md)
- [Rect](reference/hdi-apis/_rect.md)
- [Rectangle](reference/hdi-apis/_rectangle.md)
- [ScheduleInfo](reference/hdi-apis/_schedule_info.md)
- [SensorEvents](reference/hdi-apis/_sensor_events.md)
- [SensorInformation](reference/hdi-apis/_sensor_information.md)
- [SensorInterface](reference/hdi-apis/_sensor_interface.md)
- [StaInfo](reference/hdi-apis/_sta_info.md)
- [SupportBufferType](reference/hdi-apis/_support_buffer_type.md)
- [TemplateInfo](reference/hdi-apis/_template_info.md)
- [ThermalZoneInfo](reference/hdi-apis/_thermal_zone_info.md)
- [UseBufferType](reference/hdi-apis/_use_buffer_type.md)
- [VerifyAllocInfo](reference/hdi-apis/_verify_alloc_info.md)
- [VibratorInterface](reference/hdi-apis/_vibrator_interface.md)
- [VideoPortCap](reference/hdi-apis/_video_port_cap.md)
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册