Re: rtt problem

12 views
Skip to first unread message

bernard

unread,
Sep 23, 2014, 1:03:27 AM9/23/14
to Xiongfei Guo, sjy...@credosemi.com, rt-thread用户组
Hi, 
1. 中断切换
这个和RT-Thread的中断切换相关。有两种情况:
a). 中断中进出并不引起切换前、切换后的任务切换(即任务依然还是原来的任务)。
b). 中断中进出导致了任务的上下文切换。

对于这两种情况,a). 系统不应该去碰调度器;b). 触发任务上下文切换,往往是调用了rt_schedule()函数。所以在rt_schedule()函数中会去检查当前是否是处于中断上下文中,如果是,则调用rt_hw_context_switch_interrupt函数。在rt_hw_context_switch_interrupt函数中,通常仅记录切换前的任务以及切换后的任务,并设置一个flag:thread_switch_interrupt_flag = 1。(并不立刻进行上下文切换)

当从ISR中退出时,则会去检查thread_switch_interrupt_flag标志,如果置1,则进行上下文切换。

=> 结论:RT-Thread在中断结束后并不是每次去执行任务调度。中断结束后,是否进行调度,取决于ISR中是否执行了rt_schedule()函数。

2.
你们的编译器是否使用正确?一般使用GNU GCC编译finsh + RT-Thread,应该没什么问题,也没有警告。同时,建议新的移植都基于RT-Thread 2.0.0分支来做。




在 2014年9月22日 下午5:09,Xiongfei Guo <xf...@credosemi.com>写道:
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原有的结构。





Reply all
Reply to author
Forward
0 new messages