先贴上优化结果

 

启动时间从3.9秒直接缩短到2.87秒,注意每个开发板可能加了不同的驱动,对于稳定性的影响请自己验证。

下面直接贴出优化内容,纯干货:

触摸屏RegisterTouchChipDevice异步优化

openharmony/drivers/hdf_core/framework/model/input/driver/hdf_touch.c


int DoRegisterTouchChipDevice(void * data){
    ChipDevice *chipDev =(ChipDevice *) data;
    int32_t ret;
    InputDevice *inputDev = NULL;
    if ((chipDev == NULL) || (chipDev->chipCfg == NULL)) {
        return HDF_ERR_INVALID_PARAM;
    }

    ret = DeviceBindDriver(chipDev);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("%s: chip device match driver failed", __func__);
        return HDF_FAILURE;
    }

    ret = ChipDriverInit(chipDev);
    if (ret != HDF_SUCCESS) {
        goto EXIT;
    }

    inputDev = InputDeviceInstance(chipDev);
    if (inputDev == NULL) {
        return HDF_ERR_MALLOC_FAIL;
    }

    ret = RegisterInputDevice(inputDev);
    if (ret != HDF_SUCCESS) {
        goto EXIT1;
    }
    chipDev->driver->inputDev = inputDev;
    chipDev->ops->SetAbility(chipDev);
    return HDF_SUCCESS;

EXIT1:
    OsalMemFree(inputDev);
EXIT:
    chipDev->driver->device = NULL;
    return HDF_FAILURE;
}

int32_t RegisterTouchChipDevice(ChipDevice *chipDev)
{
    struct task_struct *task;
    task = kthread_run(DoRegisterTouchChipDevice, chipDev, "RegisterTouchChipDevicThread");
    return HDF_SUCCESS;
}

此优化在于将触摸屏注册异步线程执行,触摸屏的慢的原因在于i2c通讯中有sleep,用异步方式进行优化。

tracer_init_tracefs异步优化

https://patchwork.kernel.org/project/linux-mediatek/patch/20220311112656.25348-1-mark-pk.tsai@mediatek.com/raw/

当存在大量的trace_event的时候初始化tracefs文件系统也很慢,同样用异步处理,当然也可以直接禁用此功能。

网卡驱动加载异步优化

openharmony/kernel/linux/linux-5.10/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c

注意次优化需要按照之前 https://laval.csdn.net/6645d58c931dbe49ec6d1eca.html 文章来验证,直接修改源码会导致补丁patch失败,而且无法编译。

static int do_rk_gmac_probe(void * de)
{
    struct platform_device *pdev = de;
    struct plat_stmmacenet_data *plat_dat;
    struct stmmac_resources stmmac_res;
    const struct rk_gmac_ops *data;
    int ret;

    data = of_device_get_match_data(&pdev->dev);
    if (!data) {
        dev_err(&pdev->dev, "no of match data provided\n");
        return -EINVAL;
    }

    ret = stmmac_get_platform_resources(pdev, &stmmac_res);
    if (ret)
        return ret;

    plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
    if (IS_ERR(plat_dat))
        return PTR_ERR(plat_dat);

    if (!of_device_is_compatible(pdev->dev.of_node, "snps,dwmac-4.20a"))
        plat_dat->has_gmac = true;

    plat_dat->fix_mac_speed = rk_fix_speed;
    plat_dat->get_eth_addr = rk_get_eth_addr;

    plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data);
    if (IS_ERR(plat_dat->bsp_priv)) {
        ret = PTR_ERR(plat_dat->bsp_priv);
        goto err_remove_config_dt;
    }

    ret = rk_gmac_clk_init(plat_dat);
    if (ret)
        goto err_remove_config_dt;

    ret = rk_gmac_powerup(plat_dat->bsp_priv);
    if (ret)
        goto err_remove_config_dt;

    ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
    if (ret)
        goto err_gmac_powerdown;

    ret = dwmac_rk_create_loopback_sysfs(&pdev->dev);
    if (ret)
        goto err_gmac_powerdown;
    printk("xuzhenhai %s:%d",__FILE__,__LINE__);
    return 0;

    err_gmac_powerdown:
    printk("xuzhenhai %s:%d",__FILE__,__LINE__);
    rk_gmac_powerdown(plat_dat->bsp_priv);
    err_remove_config_dt:
    printk("xuzhenhai %s:%d",__FILE__,__LINE__);
    stmmac_remove_config_dt(pdev, plat_dat);

    return ret;
}

static int rk_gmac_probe(struct platform_device *pdev)
{
    struct task_struct *task;
    task = kthread_run(do_rk_gmac_probe, pdev, "rk_gmac_probe_thread");
    return 0;
}

此补丁也是对网卡的probe进行异步处理,特别是多个网卡的开发板,目前不确定是否存在多线程问题。

audio优化

openharmony/drivers/hdf_core/framework/model/audio/common/src/audio_codec_base.c

#include "audio_codec_base.h"
#include "i2c_if.h"
#include "audio_driver_log.h"
#include "audio_parse.h"
#include "audio_sapm.h"
#include "osal_time.h"

#define HDF_LOG_TAG HDF_AUDIO_KADM

#define COMM_SHIFT_8BIT     8
#define COMM_MASK_FF        0xFF
#define COMM_WAIT_TIMES     1  // ms

#define I2C_REG_LEN         1
#define I2C_REG_MSGLEN      3
#define I2C_MSG_NUM         2
#define I2C_MSG_BUF_SIZE_1  1
#define I2C_MSG_BUF_SIZE_2  2

COMM_WAIT_TIMES的值调整小,目前在设置寄存器的时候回进入循环sleep逻辑,这样会导致无谓的cpu浪费。

CONFIG_INITRD_ASYNC内核选项

打开CONFIG_INITRD_ASYNC选项

 

上述补丁在其他平台上的效果请自己验证确认。

 

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐