记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。

LiSun

记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、参考资料

keil 之Image

linux的initcall机制(针对编译进内核的驱动)

二、使用举例

#include "modules.h"
int main(void) {

    // System Initialization
    SystemCoreClockUpdate();
    McuCpuInit();
    // os系统初始化
    os_kernel_initialize();
    modules_setup(); // 初始化硬件
    // 系统启动
    os_kernel_start();
    for (;;) {
    }
}
/**
  * @brief  [线程回调函数][主任务] 用于接收信号量并处理
  */
void app_main(void const *argument) {
    modules_setup_os(); // 初始化带OS功能的函数,比如软定时器
    os_event event;
    os_timer_start(timer_tpwdg_id, 1000);
//    os_timer_start(timer_wdg_id, 100);
    while (1) {
        event = os_signal_wait(0, OS_WAIT_FOREVER);
        if (event.status != OS_EVENT_SIGNAL)
            continue;
    }
}

使用方式


void core_test(void) {
}
void basic_test(void) {
}
void driver_test(void) {
}
void subsys_test(void) {
}
void device_test(void) {
}
void app_test(void) {
}
void late_test(void) {
}
void os_test(void) {
}
CORE_INITCALL("core_test", core_test);
BASIC_INITCALL("basic_test", basic_test);
DRIVER_INITCALL("driver_test", driver_test);
SUBSYS_INITCALL("subsys_test", subsys_test);
DEVICE_INITCALL("device_test", device_test);
APP_INITCALL("app_test", app_test);
LATE_INITCALL("late_test", late_test);

OS_INITCALL("os_test", os_test);

三、代码

#include <stdint.h>

#include "edebug.h"
#include "modules.h"

extern initcall_t initcall0init$$Base;
extern initcall_t initcall0init$$Limit;
extern initcall_t initcall1init$$Base;
extern initcall_t initcall1init$$Limit;
extern initcall_t initcall2init$$Base;
extern initcall_t initcall2init$$Limit;
extern initcall_t initcall3init$$Base;
extern initcall_t initcall3init$$Limit;
extern initcall_t initcall4init$$Base;
extern initcall_t initcall4init$$Limit;
extern initcall_t initcall5init$$Base;
extern initcall_t initcall5init$$Limit;
extern initcall_t initcall6init$$Base;
extern initcall_t initcall6init$$Limit;
extern initcall_t initcall7init$$Base;
extern initcall_t initcall7init$$Limit;

extern initcall_t initcall8init$$Base;
extern initcall_t initcall8init$$Limit;

void modules_setup(void) {
    initcall_t *call;
    for (call = &initcall0init$$Base; call < &initcall0init$$Limit; call++)
         call->initcall();
    for (call = &initcall1init$$Base; call < &initcall1init$$Limit; call++)
         call->initcall();
    for (call = &initcall2init$$Base; call < &initcall2init$$Limit; call++)
         call->initcall();
    for (call = &initcall3init$$Base; call < &initcall3init$$Limit; call++)
         call->initcall();
    for (call = &initcall4init$$Base; call < &initcall4init$$Limit; call++)
         call->initcall();
    for (call = &initcall5init$$Base; call < &initcall5init$$Limit; call++)
         call->initcall();
    for (call = &initcall6init$$Base; call < &initcall6init$$Limit; call++)
         call->initcall();
    for (call = &initcall7init$$Base; call < &initcall7init$$Limit; call++)
         call->initcall();
}

void modules_setup_os(void) {
    initcall_t *call;
    for (call = &initcall8init$$Base; call < &initcall8init$$Limit; call++)
         call->initcall();
}

/* 不可删除,这些函数用于占位,不然KEIL不会自动创建。(为了不改动keil的sct) */
void core_test(void) {
}
void basic_test(void) {
}
void driver_test(void) {
}
void subsys_test(void) {
}
void device_test(void) {
}
void app_test(void) {
}
void late_test(void) {
}
void os_test(void) {
}
CORE_INITCALL("core_test", core_test);
BASIC_INITCALL("basic_test", basic_test);
DRIVER_INITCALL("driver_test", driver_test);
SUBSYS_INITCALL("subsys_test", subsys_test);
DEVICE_INITCALL("device_test", device_test);
APP_INITCALL("app_test", app_test);
LATE_INITCALL("late_test", late_test);

OS_INITCALL("os_test", os_test);

/********************************************************************************
 * @file    modules.h
 * @author  jianqiang.xue
 * @Version V1.0.0
 * @Date    2022-11-21
 * @brief
 ********************************************************************************/

#ifndef __MODULES_H
#define __MODULES_H

#include <stdint.h>

void modules_setup(void);
void modules_setup_os(void);

/*
 * INIT_CALL
 */
typedef struct {
    char* name;
    void (*initcall)(void);
} initcall_t;

#define __define_initcall(name, level, fn)  \
    static const initcall_t __initcall_##fn __attribute__((used, section("initcall" #level "init"))) = { name, fn }


//  比如 log 或 RTT等。方便下级服务初始化时,能够调试,KV键值
#define CORE_INITCALL(name, fn)     __define_initcall(name, 0, fn)
// gpio配置 bsp层
#define BASIC_INITCALL(name, fn)    __define_initcall(name, 1, fn)
// 预留
#define SERVE_INITCALL(name, fn)    __define_initcall(name, 2, fn)
// 设备层 比如总功能模组
#define DRIVER_INITCALL(name, fn)   __define_initcall(name, 3, fn)
// 子系统,比如文件系统/USB/网络
#define SUBSYS_INITCALL(name, fn)   __define_initcall(name, 4, fn)
// 驱动层 各类传感器和外设模组
#define DEVICE_INITCALL(name, fn)   __define_initcall(name, 5, fn)
// APP层 功能初始化
#define APP_INITCALL(name, fn)      __define_initcall(name, 6, fn)
// 结束层 预留
#define LATE_INITCALL(name, fn)     __define_initcall(name, 7, fn)
// OS层
#define OS_INITCALL(name, fn)       __define_initcall(name, 8, fn)
#endif

posted on 2022-12-30 00:00  嵌入式单片机实验室  阅读(122)  评论(0)    收藏  举报  来源
记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。