Hi, Bernard
以下是我们遇到的一些问题和不明白的地方。
Regards~
Alex Guo
Credo Semi.
-------- Forwarded Message --------
Subject: rtt problem Date: Mon, 22 Sep 2014 05:06:08 -0400 (EDT) From: sjy...@credosemi.com To: xf...@credosemi.com <xf...@credosemi.com>
1. rt_hw_context_switch_interrupt 函数的作用 调用位置rt_schedule: if (rt_interrupt_nest == 0) { rt_hw_context_switch((rt_uint32_t)&from_thread->sp, (rt_uint32_t)&to_thread->sp); } else { RT_DEBUG_LOG(RT_DEBUG_SCHEDULER, ("switch in interrupt\n")); rt_hw_context_switch_interrupt((rt_uint32_t)&from_thread->sp, (rt_uint32_t)&to_thread->sp); } 由此可见是在进入中断中执行任务切换的时候才会调用这句。事实上,我觉得中断退出才会切换到最高优先级任务,而在中断过程是不允许发生任务切换的,原因有两个,第一中断处理比较紧急,第二中断过程切换任务,那哪时候切换回来中断,中断上下文又保存在哪里。rt_thread_switch_interrupt_flag 在汇编代码中看意思是判断被中断的任务,在中断结束后是否恢复运行,也就是说被中断的任务是否是最高优先级的任务。 问题是什么样的中断会执行这段代码rt_hw_context_switch_interrupt()。 2. finsh链接不到libc 即使我在rtconfig.h 定义了libc(RT_USING_NEWLIB or RT_USING_MINILIBC), 也出现隐式调用, 如果自己去定义 size_t, 则会出现strncmp,strlen等未定义 以下打印信息是未做任何代码改动。 --------------output infomation------------- opt/work_rtt/rt-thread/components/finsh/cmd.c: In function 'list': /opt/work_rtt/rt-thread/components/finsh/cmd.c:643:4: warning: implicit declaration of function 'strncmp' [-Wimplicit-function-declaration] if (strncmp((char*)index->name, "__", 2) == 0) continue; ^ /opt/work_rtt/rt-thread/components/finsh/cmd.c: In function 'list_prefix': /opt/work_rtt/rt-thread/components/finsh/cmd.c:752:25: warning: implicit declaration of function 'strlen' [-Wimplicit-function-declaration] min_length = strlen(name_ptr); ^ /opt/work_rtt/rt-thread/components/finsh/cmd.c:752:38: warning: incompatible implicit declaration of built-in function 'strlen' min_length = strlen(name_ptr); /opt/work_rtt/rt-thread/components/finsh/cmd.c:789:34: warning: incompatible implicit declaration of built-in function 'strlen' min_length = strlen(name_ptr); ^ /opt/work_rtt/rt-thread/components/finsh/cmd.c:826:38: warning: incompatible implicit declaration of built-in function 'strlen' min_length = strlen(name_ptr); ^ /opt/work_rtt/rt-thread/components/finsh/cmd.c:864:34: warning: incompatible implicit declaration of built-in function 'strlen' min_length = strlen(name_ptr); ^ CC build/components/finsh/finsh_compiler.o /opt/work_rtt/rt-thread/components/finsh/finsh_compiler.c: In function 'finsh_compiler_run': /opt/work_rtt/rt-thread/components/finsh/finsh_compiler.c:911:5: warning: implicit declaration of function 'memset' [-Wimplicit-function-declaration] memset(&text_segment[0], 0, sizeof(text_segment)); ^ /opt/work_rtt/rt-thread/components/finsh/finsh_compiler.c:911:5: warning: incompatible implicit declaration of built-in function 'memset' CC build/components/finsh/finsh_error.o CC build/components/finsh/finsh_heap.o /opt/work_rtt/rt-thread/components/finsh/finsh_heap.c:52:66: error: unknown type name 'size_t' static void finsh_block_split(struct finsh_block_header* header, size_t size); ^ /opt/work_rtt/rt-thread/components/finsh/finsh_heap.c: In function 'finsh_heap_init': /opt/work_rtt/rt-thread/components/finsh/finsh_heap.c:58:2: warning: implicit declaration of function 'memset' [-Wimplicit-function-declaration] memset(&finsh_heap[0], 0, sizeof(finsh_heap)); ^ /opt/work_rtt/rt-thread/components/finsh/finsh_heap.c:58:2: warning: incompatible implicit declaration of built-in function 'memset' /opt/work_rtt/rt-thread/components/finsh/finsh_heap.c: At top level: /opt/work_rtt/rt-thread/components/finsh/finsh_heap.c:73:27: error: unknown type name 'size_t' void* finsh_heap_allocate(size_t size) ^ /opt/work_rtt/rt-thread/components/finsh/finsh_heap.c:232:59: error: unknown type name 'size_t' void finsh_block_split(struct finsh_block_header* header, size_t size) ^ /opt/work_rtt/rt-thread/components/finsh/finsh_heap.c:133:13: warning: 'finsh_heap_gc' defined but not used [-Wunused-function] static void finsh_heap_gc(void) ^ scons: *** [build/components/finsh/finsh_heap.o] Error 1 scons: building terminated because of errors. ------------------------------------------------------------------------- 3. CC build/kernel/components/finsh/finsh_token.o In file included from /opt/orx/orxsys/staging_dir/toolchain-or1k/or1k-elf/include/stdlib.h:16:0, from /opt/rt-thread/components/finsh/finsh_token.c:31: /opt/orx/orxsys/staging_dir/toolchain-or1k/lib/gcc/or1k-elf/4.9.0/include/stddef.h:212:23: error: conflicting types for 'size_t' 修正错误:在注释components/finsh/finsh_token.c //#include <stdlib.h>,在finsh.h添加size_t的定义 2和3总的修正: 添加libc,里面包含 ----------------tinylibc.h------------------ typedef unsigned int size_t; char * strncat(char *dst, const char *src, unsigned int c); char *strncpy(char *dst, const char *src, unsigned int c); int strcmp(const char *a, const char *b); void *memset(void *dst, int val, unsigned int size); int strncmp(const char *cs, const char *ct, size_t count); int atoi(const char* s); extern size_t strlen(const char*s); extern void* memcpy( void* s1, void* s2, size_t n); -------------------------------------------------------- 然后被finsh.h 包含。 虽然finsh工作起来了,但是破坏了finsh原有的结构。