From ac397f58f8667c5dd18b4a1897e2ddf2c783d820 Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Thu, 15 Dec 2022 18:17:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=B3=BB=E7=BB=9F=E9=87=8D?= =?UTF-8?q?=E5=90=AF=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 4 +- .vscode/settings.json | 9 +- CMakeLists.txt | 1 + mkrtos_real/inc/arch/arch.h | 66 ++-- mkrtos_real/inc/mkrtos/sys.h | 358 +++++++++---------- mkrtos_real/ipc/knl_msg.c | 15 +- mkrtos_real/ipc/sys_msg.c | 605 ++++++++++++++++++--------------- mkrtos_real/knl/arch.c | 237 +++++++------ mkrtos_real/knl/sched.c | 6 +- mkrtos_real/knl/sys.c | 360 ++++++++++++-------- mkrtos_real/knl/syscall.c | 25 +- mkrtos_reboot/CMakeLists.txt | 39 +++ mkrtos_reboot/link.lds | 119 +++++++ mkrtos_reboot/setting.cmake | 0 mkrtos_reboot/src/heap_stack.c | 17 + mkrtos_reboot/src/main.c | 44 +++ stm32f205rft6_build.sh | 7 +- 17 files changed, 1152 insertions(+), 760 deletions(-) create mode 100644 mkrtos_reboot/CMakeLists.txt create mode 100644 mkrtos_reboot/link.lds create mode 100644 mkrtos_reboot/setting.cmake create mode 100644 mkrtos_reboot/src/heap_stack.c create mode 100644 mkrtos_reboot/src/main.c diff --git a/.vscode/launch.json b/.vscode/launch.json index 140b1730f..aadf90cb1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,13 +4,13 @@ "name": "(gdb) 启动", "type": "cppdbg", "request": "launch", - "program": "/home/zhangzheng/mkrtos-real/build/mkrtos/mkrtos_real/mkrtos_real.elf", + "program": "/home/ubuntu/zhangzheng/mkrtos-real/build/mkrtos/mkrtos_real/mkrtos_real.elf", "args": [], "stopAtEntry": true, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, - "miDebuggerPath": "/home/zhangzheng/mkrtos-real/toolchains/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb", + "miDebuggerPath": "/home/ubuntu/zhangzheng/mkrtos-real/toolchains/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb", "miDebuggerServerAddress": "127.0.0.1:3333", "MIMode": "gdb", "setupCommands": [ diff --git a/.vscode/settings.json b/.vscode/settings.json index 3ce97deb1..846718b04 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -69,7 +69,12 @@ "atomic.h": "c", "slist.h": "c", "exec.h": "c", - "bitset": "c" + "bitset": "c", + "knl_mutex.h": "c", + "knl_msg.h": "c", + "msg.h": "c", + "reboot.h": "c" }, - "cortex-debug.showRTOS": false + "cortex-debug.showRTOS": false, + "editor.formatOnSave": true } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 0772d9d89..1d94ad6a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,7 @@ add_subdirectory(mkrtos_ls) add_subdirectory(mkrtos_ym) add_subdirectory(mkrtos_shell) add_subdirectory(mkrtos_test) +add_subdirectory(mkrtos_reboot) # add_custom_target( # gen_system_cpio # ALL diff --git a/mkrtos_real/inc/arch/arch.h b/mkrtos_real/inc/arch/arch.h index 62388c197..525dd5986 100644 --- a/mkrtos_real/inc/arch/arch.h +++ b/mkrtos_real/inc/arch/arch.h @@ -10,46 +10,44 @@ /** * @brief OS周期的ms */ -#define OS_WORK_PERIOD_MS ((1000/OS_WORK_HZ)) +#define OS_WORK_PERIOD_MS ((1000 / OS_WORK_HZ)) int32_t arch_init(void); extern void kprint(const char *fmt, ...); -extern int int_cn_; + +void arch_reboot(void); /** * @brief 关闭cpu中断 * @return 返回之前得中断使能状态 */ -static inline uint32_t dis_cpu_intr(void) { +static inline uint32_t dis_cpu_intr(void) +{ uint32_t res; __asm__ __volatile__( - "MRS %0, PRIMASK\n" - "CPSID I\n" - :"=r"(res) - : - : - ); - int_cn_++; + "MRS %0, PRIMASK\n" + "CPSID I\n" + : "=r"(res) + : + :); return res; } /** * @brief 恢复cpu中断状态 */ -static inline void restore_cpu_intr(uint32_t s) { +static inline void restore_cpu_intr(uint32_t s) +{ __asm__ __volatile__( - "MSR PRIMASK, %0\n" - : - :"r"(s) - : - ); - int_cn_--; - + "MSR PRIMASK, %0\n" + : + : "r"(s) + :); } -void set_psp(void* new_psp); +void set_psp(void *new_psp); uint32_t get_psp(void); /** -* @brief 如何在用户级进行任务切换,手动触发PendSv -*/ + * @brief 如何在用户级进行任务切换,手动触发PendSv + */ void to_schedule(void); /** * 在用户层面执行函数,需要在psp栈上模拟值 @@ -58,23 +56,23 @@ void to_schedule(void); * @param memStack * @return */ -void* set_into_user_stack(void *callFunc,void *arg0,uint32_t *memStack,void* resAddr); +void *set_into_user_stack(void *callFunc, void *arg0, uint32_t *memStack, void *resAddr); uint32_t *os_task_set_reg1(uint32_t *mem_stack, - int32_t (*task_fun)(void *arg0, void *arg1), void *prg0, void *prg1, - void *prg2, void (*thread_exit_func)(void)); + int32_t (*task_fun)(void *arg0, void *arg1), void *prg0, void *prg1, + void *prg2, void (*thread_exit_func)(void)); /** -* @brief 填充寄存器 -* @param mem 栈内存 -* @param taskFun 任务函数 -* @param prg0 需要传递的参数0 -* @param prg1需要传递的参数1 -* @return 栈顶地址 -*/ -uint32_t* os_task_set_reg(uint32_t *mem_stack, - int32_t (*task_fun)(void *arg0, void *arg1), void *prg0, void *prg1, - void *prg2, void (*thread_exit_func)(void),void *ram); + * @brief 填充寄存器 + * @param mem 栈内存 + * @param taskFun 任务函数 + * @param prg0 需要传递的参数0 + * @param prg1需要传递的参数1 + * @return 栈顶地址 + */ +uint32_t *os_task_set_reg(uint32_t *mem_stack, + int32_t (*task_fun)(void *arg0, void *arg1), void *prg0, void *prg1, + void *prg2, void (*thread_exit_func)(void), void *ram); /** * @brief 获取中断号 */ diff --git a/mkrtos_real/inc/mkrtos/sys.h b/mkrtos_real/inc/mkrtos/sys.h index e0cf6d7fa..ec5119484 100644 --- a/mkrtos_real/inc/mkrtos/sys.h +++ b/mkrtos_real/inc/mkrtos/sys.h @@ -87,56 +87,57 @@ extern int sys_symlink(); // 83 - 建立符号链接。 (fs/nam extern int sys_lstat(); // 84 - 取符号链接文件状态。 (fs/stat.c,47) extern int sys_readlink(); // 85 - 读取符号链接文件信息。 (fs/stat.c,69) extern int sys_uselib(); // 86 - 选择共享库。 -extern int sys_mmap(); // 90 - 选择共享库。 -extern int sys_munmap(); //91 -extern int sys_truncate();//92 -extern int sys_ftruncate();//93 -extern int sys_fchown();//95 -extern int sys_getpriority(); //96 -extern int sys_setpriority(); //97 +extern int sys_reboot(); // 88 - 重启系统 +extern int sys_mmap(); // 90 - 选择共享库。 +extern int sys_munmap(); // 91 +extern int sys_truncate(); // 92 +extern int sys_ftruncate(); // 93 +extern int sys_fchown(); // 95 +extern int sys_getpriority(); // 96 +extern int sys_setpriority(); // 97 extern int sys_socketcall(); -extern int sys_wait4(); //114-wait4 -extern int sys_ipc(); //117 +extern int sys_wait4(); // 114-wait4 +extern int sys_ipc(); // 117 extern int sys_fsync(); extern int sys_getdents(); -extern int sys_clone(); //120 +extern int sys_clone(); // 120 extern int sys_sigprocmask(); -extern int sys_sched_yield();//158 -extern int sys_nanosleep(); //162 -extern int sys_mremap();//163 -extern int sys_poll();//168 -extern int sys_rt_sigaction(); //174 +extern int sys_sched_yield(); // 158 +extern int sys_nanosleep(); // 162 +extern int sys_mremap(); // 163 +extern int sys_poll(); // 168 +extern int sys_rt_sigaction(); // 174 extern int sys_rt_sigprocmask(); -extern int sys_rt_sigsuspend();//179 -extern int sys_getcwd();//183 +extern int sys_rt_sigsuspend(); // 179 +extern int sys_getcwd(); // 183 extern int sys_getenv(); -extern int sys_rt_sigreturn(void* psp); +extern int sys_rt_sigreturn(void *psp); extern int sys_mmap2(); extern int sys_readdir(); int sys_fchmod(unsigned int fd, mode_t mode); extern int sys_fchdir(); -int sys_statfs(const char * path, struct statfs * buf); -int sys_fstatfs(unsigned int fd, struct statfs * buf); +int sys_statfs(const char *path, struct statfs *buf); +int sys_fstatfs(unsigned int fd, struct statfs *buf); extern int sys_sigreturn(); -extern int sys_socket();//281 -extern int sys_bind();//282 -extern int sys_connect();//283 -extern int sys_listen();//284 -extern int sys_accept();//285 -extern int sys_getsockname();//286 -extern int sys_getpeername();//287 -extern int sys_socketpair();//288 -extern int sys_send();//289 -extern int sys_sendto();//290 -extern int sys_recv();//291 -extern int sys_recvfrom();//292 -extern int sys_shutdown();//293 -extern int sys_setsockopt();//294 -extern int sys_getsockopt();//295 -extern int sys_sendmsg();//296 -extern int sys_recvmsg();//297 +extern int sys_socket(); // 281 +extern int sys_bind(); // 282 +extern int sys_connect(); // 283 +extern int sys_listen(); // 284 +extern int sys_accept(); // 285 +extern int sys_getsockname(); // 286 +extern int sys_getpeername(); // 287 +extern int sys_socketpair(); // 288 +extern int sys_send(); // 289 +extern int sys_sendto(); // 290 +extern int sys_recv(); // 291 +extern int sys_recvfrom(); // 292 +extern int sys_shutdown(); // 293 +extern int sys_setsockopt(); // 294 +extern int sys_getsockopt(); // 295 +extern int sys_sendmsg(); // 296 +extern int sys_recvmsg(); // 297 extern int sys_subscribe_msg(); extern int sys_publish_msg(); @@ -146,145 +147,146 @@ extern int slot_reg(void); extern int fork_exec(void); const sys_call_func sys_call_table[] = { - [0]=sys_setup,//实现 - [1]=sys_exit,//实现 - [2]=sys_fork,//实现 - [3]=sys_read,//实现 - [4]=sys_write,//实现 - [5]=sys_open,//实现 - [6]=sys_close,//实现 - [7]=sys_waitpid,//实现 - [8]= sys_creat,//实现 - [9]=sys_link,//实现 - [10]=sys_unlink,//实现 - [11]=sys_execve, - [12]=sys_chdir,//实现 - [13]=sys_time,// - [14]=sys_mknod, - [15]=sys_chmod, - [16]= NULL,//sys_chown - [17]=sys_break, - [18]=sys_stat, - [19]=sys_lseek, - [20]=sys_getpid, - [21]=sys_mount, - [22]=NULL,//sys_umount, - [23]=sys_setuid, - [24]=sys_getuid, - [25]=sys_stime, - [26]=sys_ptrace, - [27]=sys_alarm, - [28]=sys_fstat, - [29]=sys_pause, - [30]=sys_utime, - [31]=sys_stty, - [32]=sys_gtty, - [33]=sys_access, - [34]=sys_nice, - [35]=sys_ftime, - [36]=sys_sync, - [37]=sys_kill, - [38]=sys_rename, - [39]=sys_mkdir, - [40]=sys_rmdir, - [41]=sys_dup, - [42]=sys_pipe, - [43]=sys_times, - [44]=sys_prof, - [45]=sys_brk, - [46]=sys_setgid, - [47]=sys_getgid, - [48]=sys_signal, - [49]=sys_geteuid, - [50]=sys_getegid, - [51]=sys_acct, - [52]NULL,//sys_phys, - [53]=sys_lock, - [54]=sys_ioctl, - [55]=sys_fcntl, - [56]=sys_mpx, - [57]=sys_setpgid, - [58]=sys_ulimit, - [59]=sys_uname, - [60]=sys_umask, - [61]=sys_chroot, - [62]=sys_ustat, - [63]=sys_dup2, - [64]=sys_getppid, - [65]=sys_getpgrp, - [66]=sys_setsid, - [67]=sys_sigaction, - [68]=sys_sgetmask, - [69]=sys_ssetmask, - [70]=sys_setreuid, - [71]=sys_setregid, - [72]=sys_sigsuspend, -// sys_sigpending, -// sys_sethostname, -// sys_setrlimit, -// sys_getrlimit, -// sys_getrusage, - [78]=sys_gettimeofday, - [79]=sys_settimeofday, -// sys_getgroups, -// sys_setgroups, - [82]=sys_select, - [83]=sys_symlink, - [84]=sys_lstat, -// sys_readlink, -// sys_uselib, - [89]=sys_readdir, - [90]=sys_mmap, - [91]=sys_munmap, - [92]=sys_truncate, - [93]=sys_ftruncate, - [94]=sys_fchmod, - [95]=sys_fchown, - [96]=sys_getpriority, - [97]=sys_setpriority, - [99]=sys_statfs, - [100]=sys_fstatfs, - [102]=sys_socketcall, - [106]=sys_stat, - [107]=sys_lstat, - [114]=sys_wait4, - [117]=sys_ipc, - [118]=sys_fsync, - [119]=sys_sigreturn, - [120]=sys_clone, - [122]=sys_uname, - [126]=sys_sigprocmask, - [133]=sys_fchdir, - [141]=sys_getdents, - [158]=sys_sched_yield, - [162]=sys_nanosleep, - [163]=NULL,//sys_mremap, - [168]=sys_poll, - [173]=sys_rt_sigreturn, - [174]=sys_rt_sigaction, - [175]=sys_rt_sigprocmask, - [179]=sys_rt_sigsuspend, - [182]=sys_chown, - [183]=sys_getcwd, - [192]=sys_mmap2, - [281]=sys_socket, - [282]=sys_bind, - [283]=sys_connect, - [284]=sys_listen, - [285]=sys_accept, - [286]=sys_getsockname, - [287]=sys_getpeername, - [288]=sys_socketpair, - [289]=sys_send, - [290]=sys_sendto, - [291]=sys_recv, - [292]=sys_recvfrom, - [293]=sys_shutdown, - [294]=sys_setsockopt, - [295]=sys_getsockopt, - [296]=sys_sendmsg, - [297]=sys_recvmsg, - [395]=sys_p2c_addr, - [396]=slot_reg, - [397]=fork_exec, + [0] = sys_setup, // 实现 + [1] = sys_exit, // 实现 + [2] = sys_fork, // 实现 + [3] = sys_read, // 实现 + [4] = sys_write, // 实现 + [5] = sys_open, // 实现 + [6] = sys_close, // 实现 + [7] = sys_waitpid, // 实现 + [8] = sys_creat, // 实现 + [9] = sys_link, // 实现 + [10] = sys_unlink, // 实现 + [11] = sys_execve, + [12] = sys_chdir, // 实现 + [13] = sys_time, // + [14] = sys_mknod, + [15] = sys_chmod, + [16] = NULL, // sys_chown + [17] = sys_break, + [18] = sys_stat, + [19] = sys_lseek, + [20] = sys_getpid, + [21] = sys_mount, + [22] = NULL, // sys_umount, + [23] = sys_setuid, + [24] = sys_getuid, + [25] = sys_stime, + [26] = sys_ptrace, + [27] = sys_alarm, + [28] = sys_fstat, + [29] = sys_pause, + [30] = sys_utime, + [31] = sys_stty, + [32] = sys_gtty, + [33] = sys_access, + [34] = sys_nice, + [35] = sys_ftime, + [36] = sys_sync, + [37] = sys_kill, + [38] = sys_rename, + [39] = sys_mkdir, + [40] = sys_rmdir, + [41] = sys_dup, + [42] = sys_pipe, + [43] = sys_times, + [44] = sys_prof, + [45] = sys_brk, + [46] = sys_setgid, + [47] = sys_getgid, + [48] = sys_signal, + [49] = sys_geteuid, + [50] = sys_getegid, + [51] = sys_acct, + [52] NULL, // sys_phys, + [53] = sys_lock, + [54] = sys_ioctl, + [55] = sys_fcntl, + [56] = sys_mpx, + [57] = sys_setpgid, + [58] = sys_ulimit, + [59] = sys_uname, + [60] = sys_umask, + [61] = sys_chroot, + [62] = sys_ustat, + [63] = sys_dup2, + [64] = sys_getppid, + [65] = sys_getpgrp, + [66] = sys_setsid, + [67] = sys_sigaction, + [68] = sys_sgetmask, + [69] = sys_ssetmask, + [70] = sys_setreuid, + [71] = sys_setregid, + [72] = sys_sigsuspend, + // sys_sigpending, + // sys_sethostname, + // sys_setrlimit, + // sys_getrlimit, + // sys_getrusage, + [78] = sys_gettimeofday, + [79] = sys_settimeofday, + // sys_getgroups, + // sys_setgroups, + [82] = sys_select, + [83] = sys_symlink, + [84] = sys_lstat, + // sys_readlink, + // sys_uselib, + [88] = sys_reboot, + [89] = sys_readdir, + [90] = sys_mmap, + [91] = sys_munmap, + [92] = sys_truncate, + [93] = sys_ftruncate, + [94] = sys_fchmod, + [95] = sys_fchown, + [96] = sys_getpriority, + [97] = sys_setpriority, + [99] = sys_statfs, + [100] = sys_fstatfs, + [102] = sys_socketcall, + [106] = sys_stat, + [107] = sys_lstat, + [114] = sys_wait4, + [117] = sys_ipc, + [118] = sys_fsync, + [119] = sys_sigreturn, + [120] = sys_clone, + [122] = sys_uname, + [126] = sys_sigprocmask, + [133] = sys_fchdir, + [141] = sys_getdents, + [158] = sys_sched_yield, + [162] = sys_nanosleep, + [163] = NULL, // sys_mremap, + [168] = sys_poll, + [173] = sys_rt_sigreturn, + [174] = sys_rt_sigaction, + [175] = sys_rt_sigprocmask, + [179] = sys_rt_sigsuspend, + [182] = sys_chown, + [183] = sys_getcwd, + [192] = sys_mmap2, + [281] = sys_socket, + [282] = sys_bind, + [283] = sys_connect, + [284] = sys_listen, + [285] = sys_accept, + [286] = sys_getsockname, + [287] = sys_getpeername, + [288] = sys_socketpair, + [289] = sys_send, + [290] = sys_sendto, + [291] = sys_recv, + [292] = sys_recvfrom, + [293] = sys_shutdown, + [294] = sys_setsockopt, + [295] = sys_getsockopt, + [296] = sys_sendmsg, + [297] = sys_recvmsg, + [395] = sys_p2c_addr, + [396] = slot_reg, + [397] = fork_exec, }; diff --git a/mkrtos_real/ipc/knl_msg.c b/mkrtos_real/ipc/knl_msg.c index 82bd32447..56557b232 100644 --- a/mkrtos_real/ipc/knl_msg.c +++ b/mkrtos_real/ipc/knl_msg.c @@ -1,10 +1,9 @@ // // Created by Administrator on 2022/3/27. // -//ںʹõmsgposixֻΪٶ #include "ipc/knl_msg.h" - +#include #include #include @@ -114,24 +113,21 @@ int msg_get(struct msg_hdl*msg,uint8_t *data,uint32_t wait){ times.tv_sec=wait/1000; times.tv_nsec=(wait%1000)*1000*1000; again_sleep: - //ȡ ret=do_nanosleep(&msg->get_slp,×,&rem,&(msg->is_empty),1); if(ret==-EINTR){ - //Ҫ趨ʱ times.tv_nsec=rem.tv_nsec; times.tv_sec=rem.tv_sec; rem.tv_sec=0; rem.tv_nsec=0; goto again_sleep; } - //ʣʱŵwait wait=rem.tv_sec*1000+rem.tv_nsec/1000/1000; goto again; } }else{ spin_lock(&(msg->slh)); msg->front=(msg->front+1)%msg->max_len; - memcpy(data, + mkrtos_memcpy(data, msg->msg+ msg->front * msg->msg_size ,msg->msg_size); if(msg_is_empty(msg)){ @@ -155,7 +151,6 @@ int msg_put(struct msg_hdl *msg,uint8_t *data,uint32_t wait){ old_wait=wait; again: if(atomic_test(&msg->is_full,1)){ - /*ˣʧܣ߲ȴͷ*/ if(wait==0){ return -1; }else{ @@ -166,25 +161,21 @@ int msg_put(struct msg_hdl *msg,uint8_t *data,uint32_t wait){ int ret; again_sleep: - //ȡ ret=do_nanosleep(&msg->put_slp,×,&rem,&(msg->is_full),1); if(ret==-EINTR){ - //Ҫ趨ʱ times.tv_nsec=rem.tv_nsec; times.tv_sec=rem.tv_sec; rem.tv_sec=0; rem.tv_nsec=0; goto again_sleep; } - //ʣʱŵwait wait=rem.tv_sec*1000+rem.tv_nsec/1000/1000; goto again; } }else{ spin_lock(&msg->slh); msg->rear=(msg->rear+1)%msg->max_len ; - memcpy( - /*Ŀʼַ*/ + mkrtos_memcpy( msg->msg+ msg->rear * msg->msg_size ,data ,msg->msg_size diff --git a/mkrtos_real/ipc/sys_msg.c b/mkrtos_real/ipc/sys_msg.c index 9e2723bff..fa957736c 100644 --- a/mkrtos_real/ipc/sys_msg.c +++ b/mkrtos_real/ipc/sys_msg.c @@ -10,259 +10,315 @@ #include #define MSG_NUM 4 -static struct msqid_ds msgid_ds_ls[MSG_NUM]={ - [0].msg_qbytes=2048 -}; -static struct atomic msgid_ds_used[MSG_NUM]={0}; -static struct atomic msg_list_lk={0}; +static struct msqid_ds msgid_ds_ls[MSG_NUM] = { + [0].msg_qbytes = 2048}; +static struct atomic msgid_ds_used[MSG_NUM] = {0}; +static struct atomic msg_list_lk = {0}; -static struct atomic msg_locks[MSG_NUM]={0}; -struct s_msg{ +static struct atomic msg_locks[MSG_NUM] = {0}; +struct s_msg +{ long mtype; char mtext[1]; }; #define DATA_SIZE 512 -static void lock_msg(int id){ - while(!atomic_test_set(&msg_locks[id],1)); +static void lock_msg(int id) +{ + while (!atomic_test_set(&msg_locks[id], 1)) + ; } -static void unlock_msg(int id){ - atomic_set(&msg_locks[id],0); +static void unlock_msg(int id) +{ + atomic_set(&msg_locks[id], 0); } -static struct msg* do_find_msg(struct msg* newmsg,int type){ +static struct msg *do_find_msg(struct msg *newmsg, int type) +{ - //type㣬ֱӷصһ - if(!type){ + if (!type) + { return newmsg; - }else if(type>0) { - while (newmsg) { - if (newmsg->msg_type == type) { + } + else if (type > 0) + { + while (newmsg) + { + if (newmsg->msg_type == type) + { return newmsg; } newmsg = newmsg->next; } - }else { - //type<0 - //ֵСϢֱӷصһΪ밴typeС + } + else + { return newmsg; } return NULL; } -//typeĴСϢIJ -static void insert_msg(struct msg** head,struct msg* ins){ - struct msg *temp=*head; - struct msg *prev=NULL; +static void insert_msg(struct msg **head, struct msg *ins) +{ + struct msg *temp = *head; + struct msg *prev = NULL; - do{ - if(!temp && !prev){//ûκϢ - *head=ins; + do + { + if (!temp && !prev) + { + *head = ins; break; - }else if(!temp->next){ //һϢ - if(!prev){//ֻһϢ - //ͷ - ins->next=temp; - *head=ins; - }else{ - ins->next=temp; - prev->next=ins; + } + else if (!temp->next) + { + if (!prev) + { + + ins->next = temp; + *head = ins; + } + else + { + ins->next = temp; + prev->next = ins; } break; - }else{ - if(temp->msg_type>=ins->msg_type) { - if(!prev){//ֻһϢ - //ͷ - ins->next=temp; - *head=ins; - }else{ - ins->next=temp; - prev->next=ins; + } + else + { + if (temp->msg_type >= ins->msg_type) + { + if (!prev) + { + ins->next = temp; + *head = ins; + } + else + { + ins->next = temp; + prev->next = ins; } break; } } - prev=temp; - temp=temp->next; - }while(temp); + prev = temp; + temp = temp->next; + } while (temp); } -static void do_remove_msg(struct msg** head,struct msg* remmsg){ - struct msg *prev=NULL; - struct msg *temp=*head; +static void do_remove_msg(struct msg **head, struct msg *remmsg) +{ + struct msg *prev = NULL; + struct msg *temp = *head; uint32_t t; - while(temp){ - if(temp==remmsg) { - if (prev==NULL) { - //ɾĵһ - *head=temp->next; + while (temp) + { + if (temp == remmsg) + { + if (prev == NULL) + { + *head = temp->next; free(temp->data); free(temp); break; - }else{ - prev->next=temp->next; + } + else + { + prev->next = temp->next; break; } } - prev=temp; - temp=temp->next; + prev = temp; + temp = temp->next; } } -static void do_remove_all_msg(struct msg* head){ - struct msg *temp=head; +static void do_remove_all_msg(struct msg *head) +{ + struct msg *temp = head; uint32_t t; - while(temp){ + while (temp) + { struct msg *next; - next=temp->next; + next = temp->next; free(temp->data); free(temp); - temp=next; + temp = next; } } -static int32_t inner_find_msg(key_t key){ +static int32_t inner_find_msg(key_t key) +{ int i; - while(!atomic_test_set(&msg_list_lk,1)); - for(i=0;iegid; - msgid_ds_ls[i].msg_perm.cuid=get_current_task()->euid; - msgid_ds_ls[i].msg_perm.gid=get_current_task()->rgid; - msgid_ds_ls[i].msg_perm.uid=get_current_task()->ruid; - msgid_ds_ls[i].msg_perm.key=key; - msgid_ds_ls[i].msg_perm.mode=flag; - msgid_ds_ls[i].msg_perm.seq=0; + msgid_ds_ls[i].msg_perm.cgid = get_current_task()->egid; + msgid_ds_ls[i].msg_perm.cuid = get_current_task()->euid; + msgid_ds_ls[i].msg_perm.gid = get_current_task()->rgid; + msgid_ds_ls[i].msg_perm.uid = get_current_task()->ruid; + msgid_ds_ls[i].msg_perm.key = key; + msgid_ds_ls[i].msg_perm.mode = flag; + msgid_ds_ls[i].msg_perm.seq = 0; - msgid_ds_ls[i].msg_first=0; /* first message on queue,unused */ - msgid_ds_ls[i].msg_last=0; /* last message in queue,unused */ - msgid_ds_ls[i].msg_stime=0; /* last msgsnd time */ - msgid_ds_ls[i].msg_rtime=0; /* last msgrcv time */ - msgid_ds_ls[i].msg_ctime=0; /* last change time */ - msgid_ds_ls[i].msg_lcbytes=0; /* Reuse junk fields for 32 bit */ - msgid_ds_ls[i].msg_lqbytes=0; /* ditto */ - msgid_ds_ls[i].msg_cbytes=0; /* current number of bytes on queue */ - msgid_ds_ls[i].msg_qnum=0; /* number of messages in queue */ - msgid_ds_ls[i].msg_qbytes=2048; /* max number of bytes on queue */ - msgid_ds_ls[i].msg_lspid=0; /* pid of last msgsnd */ - msgid_ds_ls[i].msg_lrpid=0; /* last receive pid */ - msgid_ds_ls[i].w_wait=0; /* last receive pid */ - msgid_ds_ls[i].r_wait=0; /* last receive pid */ + msgid_ds_ls[i].msg_first = 0; /* first message on queue,unused */ + msgid_ds_ls[i].msg_last = 0; /* last message in queue,unused */ + msgid_ds_ls[i].msg_stime = 0; /* last msgsnd time */ + msgid_ds_ls[i].msg_rtime = 0; /* last msgrcv time */ + msgid_ds_ls[i].msg_ctime = 0; /* last change time */ + msgid_ds_ls[i].msg_lcbytes = 0; /* Reuse junk fields for 32 bit */ + msgid_ds_ls[i].msg_lqbytes = 0; /* ditto */ + msgid_ds_ls[i].msg_cbytes = 0; /* current number of bytes on queue */ + msgid_ds_ls[i].msg_qnum = 0; /* number of messages in queue */ + msgid_ds_ls[i].msg_qbytes = 2048; /* max number of bytes on queue */ + msgid_ds_ls[i].msg_lspid = 0; /* pid of last msgsnd */ + msgid_ds_ls[i].msg_lrpid = 0; /* last receive pid */ + msgid_ds_ls[i].w_wait = 0; /* last receive pid */ + msgid_ds_ls[i].r_wait = 0; /* last receive pid */ return i; } -//Ѷе -void msg_wake_up(struct msg_queue *queue//,int32_t msgtype - ){ +void msg_wake_up(struct msg_queue *queue //,int32_t msgtype +) +{ uint32_t t; - t=dis_cpu_intr(); - while(queue){ - if(queue->task){ - if( - //( msgtype<0 || queue->msgtype==msgtype) - // && - queue->task->status==TASK_SUSPEND - ||queue->task->status==TASK_UNINTR - ) + t = dis_cpu_intr(); + while (queue) + { + if (queue->task) + { + if ( + //( msgtype<0 || queue->msgtype==msgtype) + // && + queue->task->status == TASK_SUSPEND || queue->task->status == TASK_UNINTR) { task_run_1(queue->task); } } - queue=queue->next; + queue = queue->next; } restore_cpu_intr(t); } -//һȴ -void msg_add_wait_queue(struct msg_queue** queue,struct msg_queue* add_queue){ +void msg_add_wait_queue(struct msg_queue **queue, struct msg_queue *add_queue) +{ uint32_t t; - t=dis_cpu_intr(); - if(*queue==NULL){ - *queue=add_queue; - }else{ + t = dis_cpu_intr(); + if (*queue == NULL) + { + *queue = add_queue; + } + else + { add_queue->next = (*queue); - *queue=add_queue; + *queue = add_queue; } restore_cpu_intr(t); } -//Ƴһȴ -void msg_remove_wait_queue(struct msg_queue ** queue,struct msg_queue* add_queue){ - struct msg_queue *temp=*queue; - struct msg_queue *prev=NULL; +void msg_remove_wait_queue(struct msg_queue **queue, struct msg_queue *add_queue) +{ + struct msg_queue *temp = *queue; + struct msg_queue *prev = NULL; uint32_t t; - if(!add_queue){ - return ; + if (!add_queue) + { + return; } - t=dis_cpu_intr(); - while(temp){ - if(temp==add_queue) { - if (prev==NULL) { - //ɾĵһ - *queue=temp->next; + t = dis_cpu_intr(); + while (temp) + { + if (temp == add_queue) + { + if (prev == NULL) + { + *queue = temp->next; break; - }else{ - prev->next=temp->next; + } + else + { + prev->next = temp->next; break; } } - prev=temp; - temp=temp->next; + prev = temp; + temp = temp->next; } restore_cpu_intr(t); } /** - * ȡϢ + * * @param key * @param flag * @return */ -int sys_msgget(key_t key,int flag){ +int sys_msgget(key_t key, int flag) +{ int id; - if(key==IPC_PRIVATE){ - id=inner_msg_creat(key,flag); + if (key == IPC_PRIVATE) + { + id = inner_msg_creat(key, flag); return id; - }else{ - id=inner_find_msg(key); - if(!flag){ - if(id<0) { + } + else + { + id = inner_find_msg(key); + if (!flag) + { + if (id < 0) + { return -ENOENT; } return id; - }else { - //ȡһڵ - if (flag & IPC_CREAT) { - if (flag & IPC_EXCL) { - if(id>=0) { + } + else + { + if (flag & IPC_CREAT) + { + if (flag & IPC_EXCL) + { + if (id >= 0) + { return -ENOENT; } - id=inner_msg_creat(key,flag); + id = inner_msg_creat(key, flag); return id; } - if(id>=0){ + if (id >= 0) + { return id; } - id=inner_msg_creat(key,flag); + id = inner_msg_creat(key, flag); return id; } return id; @@ -270,174 +326,187 @@ int sys_msgget(key_t key,int flag){ } return -ENOMEM; } -int sys_msgctl(int msgid,int cmd,struct msqid_ds *buf){ +int sys_msgctl(int msgid, int cmd, struct msqid_ds *buf) +{ struct msqid_ds *msq; - if(msgid<0||msgid>=MSG_NUM){ + if (msgid < 0 || msgid >= MSG_NUM) + { return -EINVAL; } - if(!buf){ + if (!buf) + { return -EFAULT; } - if(atomic_test(&msgid_ds_used[msgid],0)){ + if (atomic_test(&msgid_ds_used[msgid], 0)) + { return -EIDRM; } - msq=&msgid_ds_ls[msgid]; - switch(cmd){ - case IPC_STAT: - lock_msg(msgid); - mkrtos_memcpy(buf,msq,sizeof(struct msqid_ds)); - lock_msg(msgid); - break; - case IPC_SET: - if(get_current_task()->euid==msq->msg_perm.cuid - ||get_current_task()->euid==msq->msg_perm.uid + msq = &msgid_ds_ls[msgid]; + switch (cmd) + { + case IPC_STAT: + lock_msg(msgid); + mkrtos_memcpy(buf, msq, sizeof(struct msqid_ds)); + lock_msg(msgid); + break; + case IPC_SET: + if (get_current_task()->euid == msq->msg_perm.cuid || get_current_task()->euid == msq->msg_perm.uid //||get_current_task()->is_s_user - ){ - lock_msg(msgid); - msq->msg_perm.uid=buf->msg_perm.uid; - msq->msg_perm.gid=buf->msg_perm.gid; - msq->msg_perm.mode=buf->msg_perm.mode; - msq->msg_qbytes=buf->msg_qbytes; - unlock_msg(msgid); - } - break; - case IPC_RMID: - if(get_current_task()->euid==msq->msg_perm.cuid - ||get_current_task()->euid==msq->msg_perm.uid - // ||get_current_task()->is_s_user - ) { - lock_msg(msgid); - do_remove_all_msg(msgid_ds_ls[msgid].msg_first); - //ɾе - atomic_set(&msgid_ds_used[msgid], 0); - unlock_msg(msgid); - //ɾеϢ - //еڵȴд񣬸ɾ - msg_wake_up(msgid_ds_ls[msgid].r_wait); - msg_wake_up(msgid_ds_ls[msgid].w_wait); - } - break; - default: - return -EINVAL; + ) + { + lock_msg(msgid); + msq->msg_perm.uid = buf->msg_perm.uid; + msq->msg_perm.gid = buf->msg_perm.gid; + msq->msg_perm.mode = buf->msg_perm.mode; + msq->msg_qbytes = buf->msg_qbytes; + unlock_msg(msgid); + } + break; + case IPC_RMID: + if (get_current_task()->euid == msq->msg_perm.cuid || get_current_task()->euid == msq->msg_perm.uid + // ||get_current_task()->is_s_user + ) + { + lock_msg(msgid); + do_remove_all_msg(msgid_ds_ls[msgid].msg_first); + atomic_set(&msgid_ds_used[msgid], 0); + unlock_msg(msgid); + msg_wake_up(msgid_ds_ls[msgid].r_wait); + msg_wake_up(msgid_ds_ls[msgid].w_wait); + } + break; + default: + return -EINVAL; } return 0; } -int sys_msgrcv(int msgid,void *ptr,size_t nbytes,long type,int flag){ +int sys_msgrcv(int msgid, void *ptr, size_t nbytes, long type, int flag) +{ struct s_msg *s_msg; struct msqid_ds *msq; - struct msg* newmsg; - struct msg * f_msg; + struct msg *newmsg; + struct msg *f_msg; - if(msgid<0||msgid>=MSG_NUM){ + if (msgid < 0 || msgid >= MSG_NUM) + { return -EINVAL; } - if(!ptr){ + if (!ptr) + { return -EFAULT; } - if(atomic_test(&msgid_ds_used[msgid],0)){ + if (atomic_test(&msgid_ds_used[msgid], 0)) + { return -EIDRM; } - s_msg=ptr; - msq=&msgid_ds_ls[msgid]; - uint32_t rsize=nbytes; - again_find: + s_msg = ptr; + msq = &msgid_ds_ls[msgid]; + uint32_t rsize = nbytes; +again_find: lock_msg(msgid); - f_msg = do_find_msg(msq->msg_first,type); - if(!f_msg){ + f_msg = do_find_msg(msq->msg_first, type); + if (!f_msg) + { unlock_msg(msgid); - if(flag&IPC_NOWAIT) { + if (flag & IPC_NOWAIT) + { return -ENOMSG; } - struct msg_queue msg_wait={get_current_task(),NULL}; - msg_add_wait_queue(&msq->r_wait,&msg_wait); + struct msg_queue msg_wait = {get_current_task(), NULL}; + msg_add_wait_queue(&msq->r_wait, &msg_wait); task_suspend(); task_sche(); task_run(); - msg_remove_wait_queue(&msq->r_wait,&msg_wait); + msg_remove_wait_queue(&msq->r_wait, &msg_wait); - //Ϣɾˣ򷵻ERMID - if(atomic_test(&msgid_ds_used[msgid],0)){ + if (atomic_test(&msgid_ds_used[msgid], 0)) + { return -ERMID; } - if(get_current_task()->sig_bmp[0] - ||get_current_task()->sig_bmp[1] - ){ + if (get_current_task()->sig_bmp[0] || get_current_task()->sig_bmp[1]) + { return -EINTR; } goto again_find; } - if(f_msg->msg_size>nbytes){ - if(!(flag&MSG_NOERROR)){ + if (f_msg->msg_size > nbytes) + { + if (!(flag & MSG_NOERROR)) + { unlock_msg(msgid); return -E2BIG; } - }else{ - rsize=f_msg->msg_size; } - // - mkrtos_memcpy(s_msg->mtext,f_msg->data,rsize); - //ɾǰ - do_remove_msg(&msq->msg_first,f_msg); - msq->msg_cbytes-=f_msg->msg_size; + else + { + rsize = f_msg->msg_size; + } + mkrtos_memcpy(s_msg->mtext, f_msg->data, rsize); + do_remove_msg(&msq->msg_first, f_msg); + msq->msg_cbytes -= f_msg->msg_size; msq->msg_qnum--; - msq->msg_lrpid=get_current_task()->pid; + msq->msg_lrpid = get_current_task()->pid; unlock_msg(msgid); - //ѵȴ͵Ϣ msg_wake_up(msq->w_wait); return rsize; } -int sys_msgsnd(int msgid,const void *ptr,size_t nbytes,int flag){ +int sys_msgsnd(int msgid, const void *ptr, size_t nbytes, int flag) +{ struct s_msg *s_msg; struct msqid_ds *msq; - struct msg* newmsg; + struct msg *newmsg; - if(msgid<0||msgid>=MSG_NUM){ + if (msgid < 0 || msgid >= MSG_NUM) + { return -EINVAL; } - if(!ptr){ + if (!ptr) + { return -EFAULT; } - if(atomic_test(&msgid_ds_used[msgid],0)){ + if (atomic_test(&msgid_ds_used[msgid], 0)) + { return -EIDRM; } - s_msg=(struct s_msg *)ptr; - if(s_msg->mtype<0){ + s_msg = (struct s_msg *)ptr; + if (s_msg->mtype < 0) + { return -EINVAL; } - msq=&msgid_ds_ls[msgid]; + msq = &msgid_ds_ls[msgid]; - if(nbytes>DATA_SIZE){ - if(!(flag&IPC_NOERROR)){ - return -E2BIG; + if (nbytes > DATA_SIZE) + { + if (!(flag & IPC_NOERROR)) + { + return -E2BIG; } - //ض - nbytes=DATA_SIZE-nbytes; + nbytes = DATA_SIZE - nbytes; } - //ȴпеĿռд - again_e: +again_e: lock_msg(msgid); - if(nbytes+msq->msg_cbytes>msq->msg_qbytes){ + if (nbytes + msq->msg_cbytes > msq->msg_qbytes) + { unlock_msg(msgid); - //ϢСˣȴ - if(flag&IPC_NOWAIT){ + if (flag & IPC_NOWAIT) + { return -EAGAIN; } - //msgtypeΪ-1ͺˣΪдҪȴij - struct msg_queue msg_wait={get_current_task(),NULL}; + struct msg_queue msg_wait = {get_current_task(), NULL}; - msg_add_wait_queue(&msq->w_wait,&msg_wait); + msg_add_wait_queue(&msq->w_wait, &msg_wait); task_suspend(); task_sche(); task_run(); - msg_remove_wait_queue(&msq->w_wait,&msg_wait); + msg_remove_wait_queue(&msq->w_wait, &msg_wait); - //Ϣɾˣ򷵻ERMID - if(atomic_test(&msgid_ds_used[msgid],0)){ + if (atomic_test(&msgid_ds_used[msgid], 0)) + { return -ERMID; } - if(get_current_task()->sig_bmp[0] - ||get_current_task()->sig_bmp[1]){ + if (get_current_task()->sig_bmp[0] || get_current_task()->sig_bmp[1]) + { return -EINTR; } @@ -445,35 +514,35 @@ int sys_msgsnd(int msgid,const void *ptr,size_t nbytes,int flag){ } unlock_msg(msgid); - newmsg=malloc(sizeof(struct msg)); - if(!newmsg){ + newmsg = malloc(sizeof(struct msg)); + if (!newmsg) + { return -ENOMEM; } - newmsg->data=malloc(nbytes); - if(!newmsg->data){ + newmsg->data = malloc(nbytes); + if (!newmsg->data) + { free(newmsg); return -ENOMEM; } - newmsg->next=NULL; - newmsg->msg_size=nbytes; - newmsg->msg_type=s_msg->mtype; - mkrtos_memcpy(newmsg->data,s_msg->mtext,nbytes); + newmsg->next = NULL; + newmsg->msg_size = nbytes; + newmsg->msg_type = s_msg->mtype; + mkrtos_memcpy(newmsg->data, s_msg->mtext, nbytes); lock_msg(msgid); - insert_msg(&msq->msg_first,newmsg); -// //浽ͷ -// if(!msq->msg_first){ -// msq->msg_first=newmsg; -// newmsg->next=NULL; -// }else{ -// newmsg->next=msq->msg_first; -// msq->msg_first=newmsg; -// } + insert_msg(&msq->msg_first, newmsg); + // if(!msq->msg_first){ + // msq->msg_first=newmsg; + // newmsg->next=NULL; + // }else{ + // newmsg->next=msq->msg_first; + // msq->msg_first=newmsg; + // } msq->msg_qnum++; - msq->msg_cbytes+=nbytes; - msq->msg_lspid=get_current_task()->pid; + msq->msg_cbytes += nbytes; + msq->msg_lspid = get_current_task()->pid; unlock_msg(msgid); - //ڵȴĶ msg_wake_up(msgid_ds_ls[msgid].r_wait); return nbytes; diff --git a/mkrtos_real/knl/arch.c b/mkrtos_real/knl/arch.c index 18d2d20f5..aa626bfc3 100644 --- a/mkrtos_real/knl/arch.c +++ b/mkrtos_real/knl/arch.c @@ -8,11 +8,10 @@ #include #include -int int_cn_ = 0; - void SysTick_Handler(void); -int32_t bsp_init(void) { +int32_t bsp_init(void) +{ return 0; } INIT_LV0(bsp_init); @@ -20,28 +19,29 @@ INIT_LV0(bsp_init); /** * 在sched.c中调用,查看sche_start函数 */ -int32_t arch_init(void) { +int32_t arch_init(void) +{ extern uint32_t SystemCoreClock; - //注册中断函数 + // 注册中断函数 reg_isr_func(SysTick_Handler, 0, 0); SysTick_Config(SystemCoreClock / OS_WORK_HZ); return 0; } uint32_t *os_task_set_reg1(uint32_t *mem_stack, - int32_t (*task_fun)(void *arg0, void *arg1), void *prg0, void *prg1, - void *prg2, void (*thread_exit_func)(void)) + int32_t (*task_fun)(void *arg0, void *arg1), void *prg0, void *prg1, + void *prg2, void (*thread_exit_func)(void)) { /* Registers stacked as if auto-saved on exception */ - *(mem_stack) = (uint32_t) 0x01000000L; /* xPSR */ - *(--mem_stack) = ((uint32_t) task_fun); /* Entry Point */ + *(mem_stack) = (uint32_t)0x01000000L; /* xPSR */ + *(--mem_stack) = ((uint32_t)task_fun); /* Entry Point */ /* R14 (LR) (init value will cause fault if ever used)*/ - *(--mem_stack) = (uint32_t) thread_exit_func; - *(--mem_stack) = (uint32_t) 0x12121212L; /* R12*/ - *(--mem_stack) = (uint32_t) 0x03030303L; /* R3 */ - *(--mem_stack) = (uint32_t) prg2; /* R2 */ - *(--mem_stack) = (uint32_t) prg1; /* R1 */ - *(--mem_stack) = (uint32_t) prg0; /* R0 : argument */ + *(--mem_stack) = (uint32_t)thread_exit_func; + *(--mem_stack) = (uint32_t)0x12121212L; /* R12*/ + *(--mem_stack) = (uint32_t)0x03030303L; /* R3 */ + *(--mem_stack) = (uint32_t)prg2; /* R2 */ + *(--mem_stack) = (uint32_t)prg1; /* R1 */ + *(--mem_stack) = (uint32_t)prg0; /* R0 : argument */ return mem_stack; } @@ -53,144 +53,155 @@ uint32_t *os_task_set_reg1(uint32_t *mem_stack, * @param prg1需要传递的参数1 * @return 栈顶地址 */ -uint32_t* os_task_set_reg(uint32_t *mem_stack, - int32_t (*task_fun)(void *arg0, void *arg1), void *prg0, void *prg1, - void *prg2, void (*thread_exit_func)(void),void *ram) { +uint32_t *os_task_set_reg(uint32_t *mem_stack, + int32_t (*task_fun)(void *arg0, void *arg1), void *prg0, void *prg1, + void *prg2, void (*thread_exit_func)(void), void *ram) +{ extern void task_end(void); #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - u32 i; - *(mem_stack) = (uint32_t)0x00000000uL; - *(--mem_stack) = (uint32_t)0x00000000uL; + u32 i; + *(mem_stack) = (uint32_t)0x00000000uL; + *(--mem_stack) = (uint32_t)0x00000000uL; - for (i = 0; i < 16; ++i) - { - *(--mem_stack) = (uint32_t)(0x00000000uL); - } + for (i = 0; i < 16; ++i) + { + *(--mem_stack) = (uint32_t)(0x00000000uL); + } - *(--mem_stack) = (uint32_t)0x01000000uL; // xPSR - *(--mem_stack) = (uint32_t)taskFun; // Entry Point - *(--mem_stack) = (uint32_t)OSTaskEnd; // R14 (LR) - *(--mem_stack) = (uint32_t)0x12121212uL; // R12 - *(--mem_stack) = (uint32_t)0x03030303uL; // R3 - *(--mem_stack) = (uint32_t)0x02020202uL; // R2 - *(--mem_stack) = (uint32_t)prg1; // R1 - *(--mem_stack) = (uint32_t)prg0; // R0 : argument + *(--mem_stack) = (uint32_t)0x01000000uL; // xPSR + *(--mem_stack) = (uint32_t)taskFun; // Entry Point + *(--mem_stack) = (uint32_t)OSTaskEnd; // R14 (LR) + *(--mem_stack) = (uint32_t)0x12121212uL; // R12 + *(--mem_stack) = (uint32_t)0x03030303uL; // R3 + *(--mem_stack) = (uint32_t)0x02020202uL; // R2 + *(--mem_stack) = (uint32_t)prg1; // R1 + *(--mem_stack) = (uint32_t)prg0; // R0 : argument - // Remaining registers saved on process stack - *(--mem_stack) = (uint32_t)0x11111111uL; // R11 - *(--mem_stack) = (uint32_t)0x10101010uL; // R10 - *(--mem_stack) = (uint32_t)0x09090909uL; // R9 - *(--mem_stack) = (uint32_t)0x08080808uL; // R8 - *(--mem_stack) = (uint32_t)0x07070707uL; // R7 - *(--mem_stack) = (uint32_t)0x06060606uL; // R6 - *(--mem_stack) = (uint32_t)0x05050505uL; // R5 - *(--mem_stack) = (uint32_t)0x04040404uL; // R4 + // Remaining registers saved on process stack + *(--mem_stack) = (uint32_t)0x11111111uL; // R11 + *(--mem_stack) = (uint32_t)0x10101010uL; // R10 + *(--mem_stack) = (uint32_t)0x09090909uL; // R9 + *(--mem_stack) = (uint32_t)0x08080808uL; // R8 + *(--mem_stack) = (uint32_t)0x07070707uL; // R7 + *(--mem_stack) = (uint32_t)0x06060606uL; // R6 + *(--mem_stack) = (uint32_t)0x05050505uL; // R5 + *(--mem_stack) = (uint32_t)0x04040404uL; // R4 - for (i = 0; i < 16; ++i) - { - *(--mem_stack) = (uint32_t)(0x00000000uL); - } + for (i = 0; i < 16; ++i) + { + *(--mem_stack) = (uint32_t)(0x00000000uL); + } #else /* Registers stacked as if auto-saved on exception */ - *(mem_stack) = (uint32_t) 0x01000000L; /* xPSR */ - *(--mem_stack) = ((uint32_t) task_fun); /* Entry Point */ + *(mem_stack) = (uint32_t)0x01000000L; /* xPSR */ + *(--mem_stack) = ((uint32_t)task_fun); /* Entry Point */ /* R14 (LR) (init value will cause fault if ever used)*/ - *(--mem_stack) = (uint32_t) thread_exit_func; - *(--mem_stack) = (uint32_t) 0x12121212L; /* R12*/ - *(--mem_stack) = (uint32_t) 0x03030303L; /* R3 */ - *(--mem_stack) = (uint32_t) prg2; /* R2 */ - *(--mem_stack) = (uint32_t) prg1; /* R1 */ - *(--mem_stack) = (uint32_t) prg0; /* R0 : argument */ + *(--mem_stack) = (uint32_t)thread_exit_func; + *(--mem_stack) = (uint32_t)0x12121212L; /* R12*/ + *(--mem_stack) = (uint32_t)0x03030303L; /* R3 */ + *(--mem_stack) = (uint32_t)prg2; /* R2 */ + *(--mem_stack) = (uint32_t)prg1; /* R1 */ + *(--mem_stack) = (uint32_t)prg0; /* R0 : argument */ /* Remaining registers saved on process stack */ - *(--mem_stack) = (uint32_t) 0x11111111L; /* R11 */ - *(--mem_stack) = (uint32_t) 0x10101010L; /* R10 */ - *(--mem_stack) = (uint32_t) ram; /* R9 */ - *(--mem_stack) = (uint32_t) 0x08080808L; /* R8 */ - *(--mem_stack) = (uint32_t) 0x07070707L; /* R7 */ - *(--mem_stack) = (uint32_t) 0x06060606L; /* R6 */ - *(--mem_stack) = (uint32_t) 0x05050505L; /* R5 */ - *(--mem_stack) = (uint32_t) 0x04040404L; /* R4 */ + *(--mem_stack) = (uint32_t)0x11111111L; /* R11 */ + *(--mem_stack) = (uint32_t)0x10101010L; /* R10 */ + *(--mem_stack) = (uint32_t)ram; /* R9 */ + *(--mem_stack) = (uint32_t)0x08080808L; /* R8 */ + *(--mem_stack) = (uint32_t)0x07070707L; /* R7 */ + *(--mem_stack) = (uint32_t)0x06060606L; /* R6 */ + *(--mem_stack) = (uint32_t)0x05050505L; /* R5 */ + *(--mem_stack) = (uint32_t)0x04040404L; /* R4 */ #endif return mem_stack; } -//当要执行用户进程的函数时,先在栈顶放入模拟值 -void* set_into_user_stack(void *callFunc, void *arg0, uint32_t *mem_stack, - void *resAddr) { +// 当要执行用户进程的函数时,先在栈顶放入模拟值 +void *set_into_user_stack(void *callFunc, void *arg0, uint32_t *mem_stack, + void *resAddr) +{ /* Registers stacked as if auto-saved on exception */ - *(mem_stack) = (uint32_t) 0x01000000L; /* xPSR */ - *(--mem_stack) = ((uint32_t) callFunc); /* Entry Point */ + *(mem_stack) = (uint32_t)0x01000000L; /* xPSR */ + *(--mem_stack) = ((uint32_t)callFunc); /* Entry Point */ /* R14 (LR) (init value will cause fault if ever used)*/ - *(--mem_stack) = (uint32_t) resAddr;/*LR*/ - *(--mem_stack) = (uint32_t) 0x12121212L; /* R12*/ - *(--mem_stack) = (uint32_t) 0x03030303L; /* R3 */ - *(--mem_stack) = (uint32_t) 0x02020202L; /* R2 */ - *(--mem_stack) = (uint32_t) 0x01010101L; /* R1 */ - *(--mem_stack) = (uint32_t) arg0; /* R0 : argument */ + *(--mem_stack) = (uint32_t)resAddr; /*LR*/ + *(--mem_stack) = (uint32_t)0x12121212L; /* R12*/ + *(--mem_stack) = (uint32_t)0x03030303L; /* R3 */ + *(--mem_stack) = (uint32_t)0x02020202L; /* R2 */ + *(--mem_stack) = (uint32_t)0x01010101L; /* R1 */ + *(--mem_stack) = (uint32_t)arg0; /* R0 : argument */ return mem_stack; } - -void set_psp(void *new_psp) { +void set_psp(void *new_psp) +{ __asm__ __volatile__( - "MSR PSP, %0\n" - : - :"r"(new_psp) - : - ); + "MSR PSP, %0\n" + : + : "r"(new_psp) + :); } -uint32_t get_psp(void) { +uint32_t get_psp(void) +{ uint32_t ret; __asm__ __volatile__( - "MRS %0, PSP\n" - :"=r"(ret) - : - : - ); + "MRS %0, PSP\n" + : "=r"(ret) + : + :); return ret; } - +void arch_reboot(void) +{ + __asm__ __volatile__( + "mov r0,#1\n" + "msr FAULTMASK,R0\n" + "ldr r0, =0xE000ED0C\n" + "ldr r1, =0x05FA0004\n" + "str r1,[r0]\n" + "b ."); +} /** * @brief 手动触发PendSv进行任务切换 */ -void to_schedule(void) { +void to_schedule(void) +{ __asm__ __volatile__( - "LDR R0, =0xE000ED04\n" - "LDR R1, =0x10000000\n" - "STR R1, [R0]\n" - "DSB \n" - "ISB \n" - : - : - : - ); + "LDR R0, =0xE000ED04\n" + "LDR R1, =0x10000000\n" + "STR R1, [R0]\n" + "DSB \n" + "ISB \n" + : + : + :); } -//只能够在特权模式调用 -//获取中断号 -uint32_t get_isr_num(void) { +// 只能够在特权模式调用 +// 获取中断号 +uint32_t get_isr_num(void) +{ uint32_t num; __asm__ __volatile__( - "mrs %0,IPSR" - :"=r"(num) - : - : - ); + "mrs %0,IPSR" + : "=r"(num) + : + :); return num; } extern void tasks_check(void); extern void task_sche(void); -//sleep.c -//extern void do_check_sleep_tim(void); +// sleep.c +// extern void do_check_sleep_tim(void); #include -//#include -//#include -void SysTick_Handler(void) { -// check_msg_time(); -// check_sem_time(); +// #include +// #include +void SysTick_Handler(void) +{ + // check_msg_time(); + // check_sem_time(); // check_mutex_time(); - do_check_sleep_tim(); + do_check_sleep_tim(); tasks_check(); task_sche(); } diff --git a/mkrtos_real/knl/sched.c b/mkrtos_real/knl/sched.c index 2ba7677ac..84f5c34c6 100644 --- a/mkrtos_real/knl/sched.c +++ b/mkrtos_real/knl/sched.c @@ -132,13 +132,14 @@ void sche_unlock(void) { } /** * 获取调度器的锁计数 + * @return 调度器锁,等于零代表解锁 */ uint32_t sche_lock_cn_get(void) { return atomic_read(&(sys_tasks_info.sche_lock)); } /** - * @brief 任务调度,如果调度关闭,则调用无效 + * @brief 任务调度,如果调度关闭,则无法调度 */ void task_sche(void) { uint32_t t; @@ -341,13 +342,14 @@ int32_t add_task(struct task *p_task_block, uint32_t into_all_ls) { */ void tasks_check(void) { struct task *ptb; + sys_tasks_info.sys_run_count++; //检测所有的定时器信号 slist_foreach(ptb, &sys_tasks_info.all_tk_list, all_node) { if(ptb->status==TASK_RUNNING && ptb->alarm){ //时间到了 - if(ptb->alarmalarm < sys_tasks_info.sys_run_count){ //发送指定信号 inner_set_sig(SIGALRM); ptb->alarm = 0; diff --git a/mkrtos_real/knl/sys.c b/mkrtos_real/knl/sys.c index 7685da958..3a429d9f9 100644 --- a/mkrtos_real/knl/sys.c +++ b/mkrtos_real/knl/sys.c @@ -12,226 +12,270 @@ #include #include -char* sys_getenv(char *key) { +#include + +char *sys_getenv(char *key) +{ return NULL; } -int sys_vhangup(void) { +int sys_vhangup(void) +{ return -ENOSYS; } -// -int sys_ftime() { +// 废弃了 +int sys_ftime() +{ return -ENOSYS; } -// -int sys_break() { +// 废弃了 +int sys_break() +{ return -ENOSYS; } -// ڵǰ̶ӽ̽е(degugging) -int sys_ptrace(int request, int pid, int addr, int data) { +// 用于当前进程对子进程进行调试(degugging)。 +int sys_ptrace(int request, int pid, int addr, int data) +{ return -ENOSYS; } -// ı䲢ӡնá -int sys_stty() { +// 改变并打印终端行设置。 +int sys_stty() +{ return -ENOSYS; } -// ȡնϢ -int sys_gtty() { +// 取终端行设置信息。 +int sys_gtty() +{ return -ENOSYS; } -int sys_prof() { +int sys_prof() +{ return -ENOSYS; } -int sys_setregid(int rgid, int egid) { +int sys_setregid(int rgid, int egid) +{ return -ENOSYS; } -// ý(gid)ûгûȨʹsetgid()Чgid -// effective gidΪ䱣gid(saved gid)ʵgid(real gid) -// ûȨʵgidЧgid ͱgid óɲָgid -int sys_setgid(gid_t gid) { -// if (get_current_task()->is_s_user) { -// get_current_task()->egid = gid; -// get_current_task()->rgid = gid; -// get_current_task()->sgid = gid; -// } else +// 设置进程组号(gid)。如果任务没有超级用户特权,它可以使用setgid()将其有效gid +// (effective gid)设置为成其保留gid(saved gid)或其实际gid(real gid)。如果任务有 +// 超级用户特权,则实际gid、有效gid 和保留gid 都被设置成参数指定的gid。 +int sys_setgid(gid_t gid) +{ + // if (get_current_task()->is_s_user) { + // get_current_task()->egid = gid; + // get_current_task()->rgid = gid; + // get_current_task()->sgid = gid; + // } else { - if (gid == get_current_task()->rgid - || gid == get_current_task()->sgid) { + if (gid == get_current_task()->rgid || gid == get_current_task()->sgid) + { get_current_task()->egid = gid; - } else { + } + else + { return -EPERM; } } return 0; } -// 򿪻رս̼ʹܡ -int sys_acct() { +// 打开或关闭进程计帐功能。 +int sys_acct() +{ return -ENOSYS; } -// ӳڴ浽̵ַռ䡣 -int sys_phys() { +// 映射任意物理内存到进程的虚拟地址空间。 +int sys_phys() +{ return -ENOSYS; } -int sys_lock() { +int sys_lock() +{ return -ENOSYS; } -int sys_mpx() { +int sys_mpx() +{ return -ENOSYS; } -int sys_ulimit() { +int sys_ulimit() +{ return -ENOSYS; } -//extern uint32_t rtc_set_tick(uint32_t tick); -//extern uint32_t rtc_get_tick(void); -//extern uint32_t rtc_get_msofsec(void); -// ش1970 1 1 00:00:00 GMT ʼʱʱֵ룩tloc Ϊnullʱֵ -// Ҳ洢 -int sys_time(time_t *tloc) { +// extern uint32_t rtc_set_tick(uint32_t tick); +// extern uint32_t rtc_get_tick(void); +// extern uint32_t rtc_get_msofsec(void); +// 返回从1970 年1 月1 日00:00:00 GMT 开始计时的时间值(秒)。如果tloc 不为null,则时间值 +// 也存储在那里。 +int sys_time(time_t *tloc) +{ time_t tick = 0; - //Ӧʹrtc豸rtc.c + // 后面应该使用rtc驱动设备,但是这样是最快的rtc.c -// tick = rtc_get_tick(); -// if (tloc) { -// *tloc = tick; -// } + // tick = rtc_get_tick(); + // if (tloc) { + // *tloc = tick; + // } return tick; } -int sys_setreuid(uid_t ruid, uid_t euid) { +int sys_setreuid(uid_t ruid, uid_t euid) +{ - if (ruid != -1) { + if (ruid != -1) + { get_current_task()->ruid = ruid; } - if (euid != -1) { + if (euid != -1) + { get_current_task()->euid = euid; } return -ENOSYS; } -//ûid -int sys_setuid(uid_t uid) { -// if (get_current_task()->is_s_user) { -// get_current_task()->euid = uid; -// get_current_task()->ruid = uid; -// get_current_task()->suid = uid; -// } else +// 设置用户id +int sys_setuid(uid_t uid) +{ + // if (get_current_task()->is_s_user) { + // get_current_task()->euid = uid; + // get_current_task()->ruid = uid; + // get_current_task()->suid = uid; + // } else { - if (uid == get_current_task()->ruid - || uid == get_current_task()->suid) { + if (uid == get_current_task()->ruid || uid == get_current_task()->suid) + { get_current_task()->euid = uid; - } else { + } + else + { return -EPERM; } } return 0; } -int sys_stime(time_t *tptr) { - if (!tptr) { +int sys_stime(time_t *tptr) +{ + if (!tptr) + { return -EINVAL; } -// if (!get_current_task()->is_s_user) { -// return -EPERM; -// } - //rtc.c -// extern uint32_t rtc_set_tick(uint32_t tick); -// rtc_set_tick(*tptr); + // if (!get_current_task()->is_s_user) { + // return -EPERM; + // } + // rtc.c + // extern uint32_t rtc_set_tick(uint32_t tick); + // rtc_set_tick(*tptr); return -ENOSYS; } -// ȡǰʱ䡣tms ṹаûʱ䡢ϵͳʱ䡢ӽûʱ䡢ӽϵͳʱ䡣 -int sys_times(struct tms *tbuf) { - if (!tbuf) { +// 获取当前任务时间。tms 结构中包括用户时间、系统时间、子进程用户时间、子进程系统时间。 +int sys_times(struct tms *tbuf) +{ + if (!tbuf) + { return -EINVAL; } tbuf->tms_utime = get_current_task()->run_count; - //˵ɣںûɶ + // 下面三个后面再说吧,现在好像没啥用 tbuf->tms_cstime = 0; tbuf->tms_cutime = 0; tbuf->tms_stime = 0; return -ENOSYS; } -int sys_settimeofday(struct timeval *tv, struct timezone *tz) { - if (!tv) { +int sys_settimeofday(struct timeval *tv, struct timezone *tz) +{ + if (!tv) + { return -EINVAL; } -// if (!get_current_task()->is_s_user) { -// return -EPERM; -// } + // if (!get_current_task()->is_s_user) { + // return -EPERM; + // } -// rtc_set_tick(tv->tv_sec + tv->tv_usec / 1000 / 1000); + // rtc_set_tick(tv->tv_sec + tv->tv_usec / 1000 / 1000); return 0; } -int sys_gettimeofday(struct timeval *tv, struct timezone *tz) { +int sys_gettimeofday(struct timeval *tv, struct timezone *tz) +{ - if (!tv) { + if (!tv) + { return -EINVAL; } - time_t r_tim = { 0 }; -// r_tim = rtc_get_tick(); + time_t r_tim = {0}; + // r_tim = rtc_get_tick(); tv->tv_sec = r_tim; - //tv->tv_usec = rtc_get_msofsec() * 1000; -// DST_NONE /* not on DST */ -// DST_USA /* USA style DST */ -// DST_AUST /* Australian style DST */ -// DST_WET /* Western European DST */ -// DST_MET /* Middle European DST */ -// DST_EET /* Eastern European DST */ -// DST_CAN /* Canada */ -// DST_GB /* Great Britain and Eire */ -// DST_RUM /* Romania */ -// DST_TUR /* Turkey */ -// DST_AUSTALT /* Australian style with shift in 1986 */ - if (tz) { + // tv->tv_usec = rtc_get_msofsec() * 1000; + // DST_NONE /* not on DST */ + // DST_USA /* USA style DST */ + // DST_AUST /* Australian style DST */ + // DST_WET /* Western European DST */ + // DST_MET /* Middle European DST */ + // DST_EET /* Eastern European DST */ + // DST_CAN /* Canada */ + // DST_GB /* Great Britain and Eire */ + // DST_RUM /* Romania */ + // DST_TUR /* Turkey */ + // DST_AUSTALT /* Australian style with shift in 1986 */ + if (tz) + { tz->tz_dsttime = 0; tz->tz_minuteswest = -480; } return -ENOSYS; } -// end_data_seg ֵϵͳȷʵ㹻ڴ棬ҽûгԽݶδС -// ʱúݶĩβΪend_data_seg ֵֵָڴβҪСڶջ -// β16KBֵݶε½βֵֵҪֵͬд -// úûֱӵãlibc ⺯аװҷֵҲһ -int sys_brk(unsigned long end_data_seg) { - //ûڴĸֱӷسɹ +// 当参数end_data_seg 数值合理,并且系统确实有足够的内存,而且进程没有超越其最大数据段大小 +// 时,该函数设置数据段末尾为end_data_seg 指定的值。该值必须大于代码结尾并且要小于堆栈 +// 结尾16KB。返回值是数据段的新结尾值(如果返回值与要求值不同,则表明有错发生)。 +// 该函数并不被用户直接调用,而由libc 库函数进行包装,并且返回值也不一样。 +int sys_brk(unsigned long end_data_seg) +{ + // 没有虚拟内存的概念,直接返回成功 return 0; } /** - * ID + * 设置组ID * @param pid * @param pgid * @return */ -int32_t sys_setpgid(int32_t pid, int32_t pgid) { +int32_t sys_setpgid(int32_t pid, int32_t pgid) +{ uint32_t t; struct task *md_task; t = dis_cpu_intr(); md_task = task_find(pid); - if (!pgid) { + if (!pgid) + { md_task->pgid = md_task->pid; - } else { + } + else + { md_task->pgid = pgid; } restore_cpu_intr(t); return -ENOSYS; } -int sys_getpgrp(void) { +int sys_getpgrp(void) +{ return -ENOSYS; } -int sys_setsid(void) { +int sys_setsid(void) +{ return -ENOSYS; } -int sys_uname(struct utsname *name) { - if (!name) { +int sys_uname(struct utsname *name) +{ + if (!name) + { return -1; } mkrtos_strncpy(name->sysname, SYS_NAME, _UTSNAME_LENGTH); @@ -243,78 +287,114 @@ int sys_uname(struct utsname *name) { return -ENOSYS; } /** - * ڽ̴һļĿ¼ʱһʹļʽ (3 . 33 . 4ڣ - * ˵ o p e nc r e a tһ m o d eָļĴȡ - * Ȩλ)ǽ4 . 2 0˵δһĿ¼ļʽΪ 1λ - * ļm o d eеӦλһת0 + * 在进程创建一个新文件或新目录时,就一定会使用文件方式创建屏蔽字 (回忆3 . 3和3 . 4节, + * 在那里我们说明了 o p e n和c r e a t函数。这两个函数都有一个参数 m o d e,它指定了新文件的存取 + * 许可权位)。我们将在4 . 2 0节说明如何创建一个新目录,在文件方式创建屏蔽字中为 1的位,在 + * 文件m o d e中的相应位则一定被转成0。 */ -mode_t sys_umask(mode_t mask) { +mode_t sys_umask(mode_t mask) +{ mode_t old_mask; old_mask = get_current_task()->mask; get_current_task()->mask = mask; return old_mask; } -int sys_seteuid(uid_t uid) { -// if (get_current_task()->is_s_user) { -// get_current_task()->euid = uid; -// } else +int sys_seteuid(uid_t uid) +{ + // if (get_current_task()->is_s_user) { + // get_current_task()->euid = uid; + // } else { - if (uid == get_current_task()->ruid - || uid == get_current_task()->suid) { + if (uid == get_current_task()->ruid || uid == get_current_task()->suid) + { get_current_task()->euid = uid; - } else { + } + else + { return -EPERM; } } return 0; } -int sys_setegid(gid_t gid) { -// if (get_current_task()->is_s_user) { -// get_current_task()->egid = gid; -// } else +int sys_setegid(gid_t gid) +{ + // if (get_current_task()->is_s_user) { + // get_current_task()->egid = gid; + // } else { - if (gid == get_current_task()->ruid - || gid == get_current_task()->egid) { + if (gid == get_current_task()->ruid || gid == get_current_task()->egid) + { get_current_task()->euid = gid; - } else { + } + else + { return -EPERM; } } return 0; } -// ȡǰ̺pid -int32_t sys_getpid(void) { +// 取当前进程号pid。 +int32_t sys_getpid(void) +{ return get_current_task()->pid; } -// ȡ̺ppid -int32_t sys_getppid(void) { - if (get_current_task()->parent_task) { +// 取父进程号ppid。 +int32_t sys_getppid(void) +{ + if (get_current_task()->parent_task) + { return get_current_task()->parent_task->pid; - } else { + } + else + { return -1; } } -// ȡûuid -int32_t sys_getuid(void) { +// 取用户号uid。 +int32_t sys_getuid(void) +{ return get_current_task()->ruid; } -// ȡeuid -int32_t sys_geteuid(void) { +// 取euid。 +int32_t sys_geteuid(void) +{ return get_current_task()->euid; } -// ȡgid -int32_t sys_getgid(void) { +// 取组号gid。 +int32_t sys_getgid(void) +{ return get_current_task()->rgid; } -// ȡegid -int32_t sys_getegid(void) { +// 取egid。 +int32_t sys_getegid(void) +{ return get_current_task()->egid; } - +int32_t sys_reboot(uint32_t magic1, uint32_t magic2, uint32_t cmd) +{ + int32_t ret = -EINVAL; + if (magic1 != LINUX_REBOOT_MAGIC1 || magic2 != LINUX_REBOOT_MAGIC2) + { + goto end; + } + switch (cmd) + { + case LINUX_REBOOT_CMD_RESTART: + kprint("reboot sys\n"); + arch_reboot(); + ret = 0; + break; + default: + ret = -ENOSYS; + break; + } +end: + return ret; +} diff --git a/mkrtos_real/knl/syscall.c b/mkrtos_real/knl/syscall.c index ae1626b8f..4f668d5c5 100644 --- a/mkrtos_real/knl/syscall.c +++ b/mkrtos_real/knl/syscall.c @@ -32,23 +32,32 @@ /** * 吧父进程地址指针映射到子进程 */ -int sys_p2c_addr(void *addr) { +int sys_p2c_addr(void *addr) +{ struct task *curr_task = get_current_task(); return ((uint32_t)addr) + curr_task->parent_ram_offset; } -int syscall_none(void){ +int syscall_none(void) +{ return -ENOSYS; } -static const int syscall_func_number=sizeof(sys_call_table)/sizeof(sys_call_func); +static const int syscall_func_number = sizeof(sys_call_table) / sizeof(sys_call_func); -void* get_syscall_handler(void* sp,int32_t call_num){ - if(call_num<0 || call_num >= syscall_func_number){ - return (void*)syscall_none; - }else{ - MKRTOS_ASSERT(sys_call_table[call_num]); +void *get_syscall_handler(void *sp, int32_t call_num) +{ + if (call_num < 0 || call_num >= syscall_func_number) + { + return (void *)syscall_none; + } + else if (sys_call_table[call_num]) + { return sys_call_table[call_num]; } + else + { + return syscall_none; + } } diff --git a/mkrtos_reboot/CMakeLists.txt b/mkrtos_reboot/CMakeLists.txt new file mode 100644 index 000000000..0c9284579 --- /dev/null +++ b/mkrtos_reboot/CMakeLists.txt @@ -0,0 +1,39 @@ +cmake_minimum_required(VERSION 3.13) + +include(setting.cmake) +project(mkrtos_reboot) + +# if (BOARD STREQUAL "stm32f103rc") +# set(CMAKE_C_FLAGS "${GLOBAL_C_FLAG} -fPIC -n -pie -fpie -fPIC -fpic\ +# -msingle-pic-base -mno-pic-data-is-text-relative \ +# -fmessage-length=0 -Wall -Xlinker --cref \ +# -D__dietlibc__ -D__arm__ \ +# " ) +# elseif (BOARD STREQUAL "stm32f205rft6") + set(CMAKE_C_FLAGS "${GLOBAL_C_FLAG} -fPIC -n -pie -fpie -fPIC -fpic\ + -msingle-pic-base -mno-pic-data-is-text-relative \ + -fmessage-length=0 -Wall -Xlinker --cref \ + -D__dietlibc__ -D__arm__ \ + " ) +# endif() + +set(CMAKE_CXX_FLAGS CMAKE_C_FLAGS) +set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS}) + +message("mkrtos-shell CMAKE_CFLAGS:${CMAKE_C_FLAGS}") + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) +include_directories(${CMAKE_SOURCE_DIR}/mkrtos_sdk/src/dietlibc-0.34/include) + +set(CMAKE_GEN_ELF ${CMAKE_PROJECT_NAME}_reboot.elf) +file(GLOB_RECURSE deps **/*.c **/*.S *.c *.S) + +add_executable(${CMAKE_GEN_ELF} + ${deps} +) +target_link_libraries(${CMAKE_GEN_ELF} ${CMAKE_SOURCE_DIR}/build/mkrtos/mkrtos_sdk/libmkrtos_sdk.a) +set_target_properties(${CMAKE_GEN_ELF} PROPERTIES LINK_FLAGS "-T ${CMAKE_CURRENT_SOURCE_DIR}/link.lds -pie") + +message("link: ${CMAKE_C_LINK_EXECUTABLE}") + \ No newline at end of file diff --git a/mkrtos_reboot/link.lds b/mkrtos_reboot/link.lds new file mode 100644 index 000000000..04212be3b --- /dev/null +++ b/mkrtos_reboot/link.lds @@ -0,0 +1,119 @@ +ENTRY(_start_) +_system_stack_size = 0x100; +SECTIONS +{ + .text : { + . = ALIGN(4); + __text_start__ = .; + KEEP(*(.first)) + *(.text) + *(.text.*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(SORT(.rodata.*)) + *(.rodata) + + KEEP(*(.eh_frame*)) + + . = ALIGN(4); + __rel_start__ = .; + *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) + __rel_end__ = .; + } + .ARM.exidx : { + . = ALIGN(4); + __exdix_start = .; + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + /* This is used by the startup in order to initialize the .data secion */ + __exdix_end = .; + } + + .permissions_table : { + . = ALIGN(4); + __permissions_table_start__ = .; + KEEP(*(.permissions_table)) + __permissions_table_end__ = .; + } + + + PROVIDE(__ram_size__ = __bss_end__ - __data_start__); + .data : { + . = ALIGN(4); + __data_start__ = .; + __got_start__ = .; + *(.got) + __got_end__ = .; + . = ALIGN(4); + *(.data) + *(.data.*) + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + } + + PROVIDE(__heap_size__ = __heap_end__ - __heap_start__); + PROVIDE(__stack_size__ = __stack_end__ - __stack_start__); + .bss : { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + __bss_start__ = .; + *(.bss) + *(COMMON) + + . = ALIGN(4); + __heap_start__ = .; + KEEP(*(.bss.heap)) + __heap_end__ = .; + + . = ALIGN(4); + __stack_start__ = .; + KEEP(*(.bss.stack)) + __stack_end__ = .; + + *(.bss.*) + /* This is used by the startup in order to initialize the .bss secion */ + . = ALIGN(4); + __bss_end__ = .; + } + _end = .; +} diff --git a/mkrtos_reboot/setting.cmake b/mkrtos_reboot/setting.cmake new file mode 100644 index 000000000..e69de29bb diff --git a/mkrtos_reboot/src/heap_stack.c b/mkrtos_reboot/src/heap_stack.c new file mode 100644 index 000000000..8a948202a --- /dev/null +++ b/mkrtos_reboot/src/heap_stack.c @@ -0,0 +1,17 @@ + +#define HEAP_SIZE 1024*2 +#define STACK_SIZE 1024*2 + +#if defined(__CC_ARM) +#define HEAP_ATTR SECTION("HEAP") __attribute__((zero_init)) +#define STACK_ATTR SECTION("STACK") __attribute__((zero_init)) +#elif defined(__GNUC__) +#define HEAP_ATTR +#define STACK_ATTR +#elif defined(__IAR_SYSTEMS_ICC__) +#define HEAP_ATTR +#define STACK_ATTR +#endif + +__attribute__((used)) HEAP_ATTR static char heap[HEAP_SIZE]; +__attribute__((used)) STACK_ATTR static char stack[STACK_SIZE]; diff --git a/mkrtos_reboot/src/main.c b/mkrtos_reboot/src/main.c new file mode 100644 index 000000000..b8abd8a68 --- /dev/null +++ b/mkrtos_reboot/src/main.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include +// #include "str.h" + +#define ABORTMSG "hard-reboot: Aborted.\n" +#define USAGE "Say \"hard-reboot (RESTART|HALT|POWER_OFF)\" if you really mean it.\n" + +void usage(void) +{ + write(2, ABORTMSG, strlen(ABORTMSG)); + write(2, USAGE, strlen(USAGE)); + exit(1); +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) + usage(); + + sync(); + sync(); + sync(); + if (strcmp(argv[1], "RESTART") == 0) + { + reboot(RB_AUTOBOOT); + } + else if (strcmp(argv[1], "HALT") == 0) + { + reboot(RB_HALT_SYSTEM); + } + else if (strcmp(argv[1], "POWER_OFF") == 0) + { + reboot(RB_POWER_OFF); + } + else + { + usage(); + } + + while (1) + sleep(10); +} diff --git a/stm32f205rft6_build.sh b/stm32f205rft6_build.sh index 0fe27f993..554ee5cd9 100755 --- a/stm32f205rft6_build.sh +++ b/stm32f205rft6_build.sh @@ -36,13 +36,18 @@ $CMAKE_SIZE build/mkrtos/$TEST_NAME/$TEST_NAME.elf $CMAKE_OBJCOPY -O binary build/mkrtos/$TEST_NAME/$TEST_NAME.elf build/mkrtos/$TEST_NAME/test sudo cp build/mkrtos/$TEST_NAME/test build/bin/ +export REBOOT_NAME=reboot +$CMAKE_SIZE build/mkrtos/mkrtos_$REBOOT_NAME/mkrtos_$REBOOT_NAME.elf +$CMAKE_OBJCOPY -O binary build/mkrtos/mkrtos_$REBOOT_NAME/mkrtos_$REBOOT_NAME.elf build/mkrtos/mkrtos_$REBOOT_NAME/$REBOOT_NAME +sudo cp build/mkrtos/mkrtos_$REBOOT_NAME/$REBOOT_NAME build/bin/ + $CMAKE_SIZE build/mkrtos/mkrtos_real/mkrtos_real.elf $CMAKE_OBJCOPY -O binary build/mkrtos/mkrtos_real/mkrtos_real.elf build/mkrtos/mkrtos_real/kernel.bin sudo cp build/mkrtos/mkrtos_real/kernel.bin build/bin cd build/bin # cpio的文件名长度必须要是n*4+2,文件的长度必须是4的整数倍 -ls zh ls ym test | cpio -H newc -o > rootfs.cpio +ls zh ls ym test reboot | cpio -H newc -o > rootfs.cpio srec_cat -output kernel.img -binary \ mkrtos_bootstrap.bin -binary\ kernel.bin -binary -offset 0x00004000\