system_init 的调用

frameworks/base/services/jni/com_android_server_SystemServer.cpp


extern "C" int system_init();

static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
    system_init();
}

/*
 * JNI registration.
 */
static JNINativeMethod gMethods[] = {
    /* name, signature, funcPtr */
    { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
};

int register_android_server_SystemServer(JNIEnv* env)
{
    return jniRegisterNativeMethods(env, "com/android/server/SystemServer",
            gMethods, NELEM(gMethods));
}

}; // namespace android

SystemServer 通过 system_init() 来初始化。


extern "C" status_t system_init()
{
    ALOGI("Entered system_init()");

    sp<ProcessState> proc(ProcessState::self());

    sp<IServiceManager> sm = defaultServiceManager();
    ALOGI("ServiceManager: %p\n", sm.get());

    sp<GrimReaper> grim = new GrimReaper();
    sm->asBinder()->linkToDeath(grim, grim.get(), 0);

    char propBuf[PROPERTY_VALUE_MAX];
    property_get("system_init.startsurfaceflinger", propBuf, "1");
    if (strcmp(propBuf, "1") == 0) {
        // Start the SurfaceFlinger
        SurfaceFlinger::instantiate();
    }

    property_get("system_init.startsensorservice", propBuf, "1");
    if (strcmp(propBuf, "1") == 0) {
        // Start the sensor service
        SensorService::instantiate();
    }

    // And now start the Android runtime.  We have to do this bit
    // of nastiness because the Android runtime initialization requires
    // some of the core system services to already be started.
    // All other servers should just start the Android runtime at
    // the beginning of their processes's main(), before calling
    // the init function.
    ALOGI("System server: starting Android runtime.\n");
    AndroidRuntime* runtime = AndroidRuntime::getRuntime();

    ALOGI("System server: starting Android services.\n");
    JNIEnv* env = runtime->getJNIEnv();
    if (env == NULL) {
        return UNKNOWN_ERROR;
    }
    jclass clazz = env->FindClass("com/android/server/SystemServer");
    if (clazz == NULL) {
        return UNKNOWN_ERROR;
    }
    jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V");
    if (methodId == NULL) {
        return UNKNOWN_ERROR;
    }
    env->CallStaticVoidMethod(clazz, methodId);

    ALOGI("System server: entering thread pool.\n");
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
    ALOGI("System server: exiting thread pool.\n");

    return NO_ERROR;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
hc32l13x的SYSTEM_INIT函数主要用于芯片初始化,在这个函数中会对芯片的各种模块进行初始化,例如时钟、GPIO、UART、ADC、DAC等。以下是一个示例: ```c #include "hc32l13x.h" void SYSTEM_INIT(void) { // 使能内部晶振 CLK_XtalIEn(); // 设置系统时钟源为内部晶振 CLK_SetSysClkSrc(CLK_SYSCLKSOURCE_XTALI); // 设置系统时钟分频为1 CLK_SetSysclkDiv(CLK_SYSCLK_DIV1); // 初始化GPIO模块 GPIO_Init(GPIO_PORT_1, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_SLOW); // 初始化UART模块 M0P_UART->SCON_f.SM = 0; // 8位数据位 M0P_UART->SCON_f.REN = 1; // 允许接收 M0P_UART->SCON_f.PM = 0; // 无校验位 M0P_UART->SCON_f.FE = 0; // 无帧错误 M0P_UART->SCON_f.RI = 0; // 接收数据标志位清零 M0P_UART->SCON_f.TI = 0; // 发送数据标志位清零 M0P_UART->BGR = 0x0037; // 波特率为9600 // 初始化ADC模块 ADC_Init(ADC_UNIT_1, ADC_CH0, ADC_RESOLUTION_12B, ADC_TRGEN_EVENT_NONE, ADC_SA_NORMAL_MODE, NULL); // 初始化DAC模块 DAC_Init(DAC_CH_1, 0, DAC_ALIGN_RIGHT); } ``` 在以上代码中,我们首先使能了内部晶振,并将系统时钟源设置为内部晶振。然后,我们初始化了GPIO模块,将P1.0引脚设置为输出模式,并设置初始电平为低电平。接下来,我们初始化了UART模块,将波特率设置为9600,数据位数为8位,无校验位和帧错误。然后,我们初始化了ADC模块,将ADC单元设置为ADC_UNIT_1,通道选择为ADC_CH0,分辨率设置为12位,触发源设置为无,采样模式设置为普通模式,最后一个参数为中断回调函数指针,这里我们设置为NULL。最后,我们初始化了DAC模块,将DAC通道设置为DAC_CH_1,对齐方式为右对齐,初始输出值为0。 需要注意的是,hc32l13x的SYSTEM_INIT函数是由启动文件startup_hc32l13x.s中的Reset_Handler函数调用的,因此在使用SYSTEM_INIT函数之前,需要先在启动文件中配置Reset_Handler函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值