ARM技术william hill官网
直播中

刘伟

7年用户 1637经验值
私信 关注
[问答]

移植RT-Thread到ARM926EJS内核上出现任务不能正常调度怎么解决

我在移植RT Thread 到一颗ARM926EJS 内核的时候,出现 任务不能正常调度;

1、我在官网下载的3.1.3的代码,CPU上下文切换使用的包里面libcpu\arm\arm926文件夹中的context.s cpuport.c stack.c文件,启动文件是我们公司自己写的,裸机可以正常启动CPU,开发环境为MDK5.20;

2、main函数如下

int main(void)
{
rt_kprintf("thread main start\r\n");
enable_interrupts();
while(1){
rt_kprintf("1\r\n");
rt_thread_mdelay(1000);
}
}
可以正常打印出main start 和 一个 1 后面就没有任何输出了;

3、我还建立了一个LED指示灯的任务,代码如下:

static void LED_entry(void *parameter)
{
static uint32_t led_tmp;
SetPinMux(10, 2, 0);
SetPinDir(10, 2, 1);
while(1){
led_tmp++;
if(led_tmp%2)SetGpio(10,2);
else ClearGpio(10,2);
rt_thread_mdelay(100);
}
}
int createLedThread(void)
{
rt_kprintf("createLedThread\r\n");
rt_thread_t tid=RT_NULL;
tid = rt_thread_create("led test thread",
LED_entry,RT_NULL,
256,
RT_THREAD_PRIORITY_MAX-1, 5);
if(tid!=RT_NULL)rt_thread_startup(tid);
else rt_kprintf("rt_thread_create error\r\n");
return 0;
}
INIT_APP_EXPORT(createLedThread);
任务创建没有报错 rt_thread_create error,但是该任务除了正常打印出createLedThread,就没有任何动作了;

4、整体上感觉 调用 rt_thread_mdelay 之后就没有任何反应,串口无任何输出,感觉是调度器或者上下文切换出错了;

5、我也是第一次在ARM9上移植该RTOS(我的裸机程序运行是正常的在该MCU上),希望大家给点意见怎么排查,相当感谢。

回帖(6)

chumowei

2022-7-12 15:08:47
检查中断映射,感觉这块的问题可能性大些。
最好能单步调试,这样看得更清楚些。
中断调好后,请检查心跳中断。因为没有心跳中断,你又只有一个LED线程,delay后他就会一直在IDEL线程中。
如果你创建2个LED线程,并不使用delay,应该可以看到2个线程交替执行。
因为ARM9的直接切换不需要中断。
举报

刘伟

2022-7-12 15:09:15
我检测过心跳中断,中断一直在发生,我在中断里面点了一个灯

static void TIME1_IRQHandler(void)
{
    static uint32_t led_tmp;
    led_tmp++;
        if(led_tmp%2)SetGpio(10,2);
        else         ClearGpio(10,2);
        rt_thread_mdelay(100);
    int ir_tmp;
    //printf("1");
    /* enter interrupt */
    rt_interrupt_enter();
    rt_tick_increase();
    /* leave interrupt */
    rt_interrupt_leave();
    ir_tmp=inl(HW_TIMER1_IR);
     if((ir_tmp & 0x1) != 0)
    {
         outl(0x1,HW_TIMER1_IR);
     }
    if((ir_tmp & 0x2) != 0)
    {
         outl(0x2,HW_TIMER1_IR);
     }
    if((ir_tmp & 0x4) != 0)
    {
         outl(0x4,HW_TIMER1_IR);
     }
    if((ir_tmp & 0x8) != 0)
    {
         outl(0x8,HW_TIMER1_IR);
     }
    if((ir_tmp & 0x10) !=0)
    {
        outl(0x10,HW_TIMER1_IR);
    }
}
举报

siyugege

2022-7-12 15:09:34
为什么在main函数中去接管中断? enable_interrupts();
另外,建议先把msh移植成功,有了shell,这样查看信息就方便多了
举报

刘伟

2022-7-12 15:09:47
enable_interrupts(); 开始是rt_hw_board_init里面,我最开始怀疑中断出问题 才放过来测试一下,我也想先把msh移植通,,但是这不是第一步任务调度就出问题了嘛;
我以前都是在M0 M3 M4上用,第一次在ARM9的芯片上移植,ARM9的启动文件裸机是可以正常工作的,启动、中断都是OK的,按您的经验看,直接使用官方的contxt.s 就可以了还是还是需要配合RTOS改启动文件呢,以前在M0 M3上都没有改过启动文件。
额外说一下,虽然rt_thread_mdelay之后任务不能调度,但是我检查过RTOS的心跳定时中断1ms是正常在中断的。
举报

siyugege

2022-7-12 15:10:08
针对Keil,一般找一个arm9的context_rvds.S是可以的。不行的话,估计得单步调试,特别是中断的部分。
arm9的移植肯定不需要改到RTT其他文件,主要是启动汇编和任务上下文切换汇编,以及对应的驱动文件。arm9,你可以说明下是哪家的arm9。
举报

刘伟

2022-7-12 15:10:25
我重点看一下这三部分,我们自己的一颗ARM9内核的芯片,底层给过来的是ucos,不过我习惯用RTT 所以想自己移植一份RTT上去。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分