RT-Thead SHELL 命令段定义实现方法

来源:互联网 发布:翻墙 mac 免费 2017 编辑:程序博客网 时间:2024/06/05 20:20
typedef long (*syscall_func)();#include <stdarg.h>//段定义#define SECTION(x)                  __attribute__((section(x)))/* system call table */struct finsh_syscall{    const char*     name;       /* the name of system call */    const char*     desc;       /* description of system call */    syscall_func func;      /* the function address of system call */};#define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc)      \        const char __fsym_##cmd##_name[] SECTION(".rodata.name") = #cmd;   \        const char __fsym_##cmd##_desc[] SECTION(".rodata.name") = #desc;  \        const struct finsh_syscall __fsym_##cmd SECTION("FSymTab")= \        {                           \                __fsym_##cmd##_name,    \                __fsym_##cmd##_desc,    \                (syscall_func)&name     \        };#define FINSH_FUNCTION_EXPORT(name, desc)   \    FINSH_FUNCTION_EXPORT_CMD(name, name, desc)static void enc28j60(void){}FINSH_FUNCTION_EXPORT(enc28j60, dump enc28j60 registers);       extern const int FSymTab$$Base;extern const int FSymTab$$Limit;struct finsh_syscall *_syscall_table_begin  = NULL;struct finsh_syscall *_syscall_table_end    = NULL;void finsh_system_function_init(const void *begin, const void *end){    _syscall_table_begin = (struct finsh_syscall *) begin;    _syscall_table_end = (struct finsh_syscall *) end;    __fsym_enc28j60.func();}const struct finsh_syscall *P;int finsh_system_init(void){finsh_system_function_init(&FSymTab$$Base, &FSymTab$$Limit);    P = &__fsym_enc28j60;   }
0 0
原创粉丝点击