一、参考资料
keil 之Image
linux的initcall机制(针对编译进内核的驱动)
二、使用举例
#include "modules.h"
int main(void) {
SystemCoreClockUpdate();
McuCpuInit();
os_kernel_initialize();
modules_setup();
os_kernel_start();
for (;;) {
}
}
void app_main(void const *argument) {
modules_setup_os();
os_event event;
os_timer_start(timer_tpwdg_id, 1000);
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();
}
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);
#ifndef __MODULES_H
#define __MODULES_H
#include <stdint.h>
void modules_setup(void);
void modules_setup_os(void);
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 }
#define CORE_INITCALL(name, fn) __define_initcall(name, 0, fn)
#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)
#define SUBSYS_INITCALL(name, fn) __define_initcall(name, 4, fn)
#define DEVICE_INITCALL(name, fn) __define_initcall(name, 5, fn)
#define APP_INITCALL(name, fn) __define_initcall(name, 6, fn)
#define LATE_INITCALL(name, fn) __define_initcall(name, 7, fn)
#define OS_INITCALL(name, fn) __define_initcall(name, 8, fn)
#endif