嵌入式技术论坛
直播中

juju宇哥

9年用户 1474经验值
擅长:479809
私信 关注
[问答]

RT-Thread移植具体需要实现哪些函数

目前我正在将 0.4 beta1 版本向我自己的ARM9平台移植,但是移植具体需要实现哪些函数尚不太明确。

RT-Thread 编程指南 中以 SAM7X 为例的讲解了移植要点,请问在该章节中提到的函数是否都是移植中必须实现的接口?是否还有其他必须实现的函数该章节没有提到的?

因为我打算以 mini2440 为基础进行移植,但是mini2440 中源文件数量很多,而结构与SAM7S 也不太相同,其中的函数应该有很多不是必须实现的。所以我想知道目前 RT-Thread 源码中是否在某个文件中枚举了所有移植中必须实现的接口定义?

如果可以的话,今后的版本中,是否可以在 libcpu 和 bsp 中增加一个 skeleton 项目,以便初次学习 RT-Thread 的人也能顺利使用它?

回帖(8)

风来吴山

2022-4-12 09:13:31
使用类似AT91SAM7S的方式就能够移植了。做ARM移植时,不需要考虑新的context.S,用类似的即可。

好的,以后包括一个skeleton目录方便大家添加新的移植分支、驱动等。
举报

juju宇哥

2022-4-12 09:13:52
请问您在 AT91SAM7S 上进行移植时使用的开发板是哪一款?
我们这里之前有同事基于SAM7S移植了一个早于 0.4 beta1 的版本
在线程的Stack处理上似乎有一些问题,具体表现是创建线程时提供的 Stack 指针,其位置前192字节被修改了,而这部分实际应该是没有任何代码去读写它的;并且线程一旦局部变量大于192字节时,就会死。
我今天尝试将它移置到了 0.4 beta1,但是这个问题依然存在,而且原本能用的 rt_thread_delay 也会导致线程死掉。
为了确认问题位置,我想最好能用原版的硬件测试一下,能否希望能知道您使用的 AT91SAM7S 开发的型号。谢谢。
举报

juju宇哥

2022-4-12 09:14:03
疏忽了,原来移植第一页就写了,不好意思。
举报

juju宇哥

2022-4-12 09:14:22
汗,icdev.net 似乎已经不存在了,他们的 SAM7S 核心板也找不到,目前淘宝上有其他几种核心板,不知道和 icdev 的是否一样,能否提供一下 icdev 的 SAM7S 核心板的原理图?
举报

风来吴山

2022-4-12 09:14:34
能给个测试代码吗?从什么上面看出栈出现了问题

这边这个板子可以 = 核心板,使用Keil MDK仿真的效果应该是一样的,也可以用仿真来看看这个问题。
举报

juju宇哥

2022-4-12 09:15:12
因为之前的版本不是我移植的,而且目前我们也没有其他平台可以对照,所以问题在哪里我还不太清楚。

以下是我测试用的 application.c

/*

* File      : app.c

* This file is part of RT-Thread RTOS

* COPYRIGHT (C) 2006, RT-Thread Development Team

*

* The license and distribution terms for this file may be

* found in the file LICENSE in this distribution or at

*

*

* Change Logs:

* Date           Author       Notes

* 2006-06-05     Bernard      the first version

*/

/**

* @addtogroup sam7s

*/

/*@{*/

#include

#include "types.h"

#define DELAY_TEST(x)  delay(x)

//#define DELAY_TEST(x)  rt_thread_delay(x)

unsigned char buffer1[0x00000400];

unsigned char stthread_stack1[65536];

unsigned char buffer2[0x00000400];

unsigned char stthread_stack2[65536];

static struct rt_thread sttest1;

static struct rt_thread sttest2;

static void delay(u32  count)

{

  u32  i,j;

//  return;

  for(i=0;i  {

    for(j=0;j<100;j++);

  }

  return;

}

void dummy128(void)

{

  u8  temp[2048];

  u8  i;

  for(i=0;i  {

    temp

= i;

  }

  return;

}

void  sttest_thread1(void* para)

{

  u32 i;

  rt_kprintf("Enter %s.

",__FUNCTION__);

  while(1)

  {

    DELAY_TEST(750);

    rt_kprintf("In %s.

",__FUNCTION__);

  //  dummy128();

    for(i=0;i    {

      if(i%32 == 0)

      {

        rt_kprintf("

");

      }

      rt_kprintf("%02x ", buffer1

);

    }

    //   for(i=0;i    //   {

    //       if(i%32 == 0)

    //       {

    //         rt_kprintf("

");

    //       }

    //       rt_kprintf("%02x ", stthread_stack1

);

    //   }

  }

  return;

}

void  sttest_thread2(void* para)

{

  int i;

  rt_kprintf("Enter %s.

",__FUNCTION__);

  while(1)

  {

    DELAY_TEST(1000);

    rt_kprintf("In %s.

",__FUNCTION__);

  }

  return;

}

int rt_application_init()

{

  memset(buffer1, 0xff,sizeof(buffer1));

  memset(buffer2, 0xff,sizeof(buffer2));

//  rt_kprintf("buffer = 0x%08x, sizeof(buffer)=0x%08x

",buffer,sizeof(buffer));

  rt_kprintf("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

");

  rt_kprintf("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

");

//  rt_kprintf("Stack of thread=0x%08x.

",thread_stack);

//  rt_kprintf("myvalue1=%d, myvalue2=%d.

",myvalue1, myvalue2);

#if 1

    rt_thread_init(&sttest1,

    "sttest1",

    sttest_thread1, RT_NULL,

    &stthread_stack1[0], sizeof(stthread_stack1),

    20, 32);

  /* startup */

  rt_thread_startup(&sttest1);

#endif

#if 1

    rt_thread_init(&sttest2,

    "sttest2",

    sttest_thread2, RT_NULL,

    &stthread_stack2[0], sizeof(stthread_stack2),

    20, 32);

  /* startup */

  rt_thread_startup(&sttest2);

#endif  

  return 0;

}

代码中,buffer1和buffer2被初始化为0xff,在我们的平台上运行时,可以发现 buffer1 的后 192 字节内容被修改了,buffer2没有看,不过应该也是一样问题。

而且在sttest_thread1中如果调用了 dummy128,则线程1就会死掉,但是如果dummy128不使用那么多局部变量的话就不会死。
举报

风来吴山

2022-4-12 09:15:28
你声明的栈太大了,到了0x10000。在RT-Thread中,线程栈最大是64k - 4,如果更大,基本上可以认为程序、系统设计得有问题。
举报

juju宇哥

2022-4-12 09:15:38
我刚刚试了一下,将两个 Stack 改为 60000,确实 Buffer1被篡改的问题没有了,但是Thread1调用 dummy128后死掉的情况依然存在。
举报

更多回帖

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