完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
目前我正在将 0.4 beta1 版本向我自己的ARM9平台移植,但是移植具体需要实现哪些函数尚不太明确。
RT-Thread 编程指南 中以 SAM7X 为例的讲解了移植要点,请问在该章节中提到的函数是否都是移植中必须实现的接口?是否还有其他必须实现的函数该章节没有提到的? 因为我打算以 mini2440 为基础进行移植,但是mini2440 中源文件数量很多,而结构与SAM7S 也不太相同,其中的函数应该有很多不是必须实现的。所以我想知道目前 RT-Thread 源码中是否在某个文件中枚举了所有移植中必须实现的接口定义? 如果可以的话,今后的版本中,是否可以在 libcpu 和 bsp 中增加一个 skeleton 项目,以便初次学习 RT-Thread 的人也能顺利使用它? |
|
相关推荐
8个回答
|
|
使用类似AT91SAM7S的方式就能够移植了。做ARM移植时,不需要考虑新的context.S,用类似的即可。
好的,以后包括一个skeleton目录方便大家添加新的移植分支、驱动等。 |
|
|
|
请问您在 AT91SAM7S 上进行移植时使用的开发板是哪一款?
我们这里之前有同事基于SAM7S移植了一个早于 0.4 beta1 的版本 在线程的Stack处理上似乎有一些问题,具体表现是创建线程时提供的 Stack 指针,其位置前192字节被修改了,而这部分实际应该是没有任何代码去读写它的;并且线程一旦局部变量大于192字节时,就会死。 我今天尝试将它移置到了 0.4 beta1,但是这个问题依然存在,而且原本能用的 rt_thread_delay 也会导致线程死掉。 为了确认问题位置,我想最好能用原版的硬件测试一下,能否希望能知道您使用的 AT91SAM7S 开发的型号。谢谢。 |
|
|
|
疏忽了,原来移植第一页就写了,不好意思。
|
|
|
|
汗,icdev.net 似乎已经不存在了,他们的 SAM7S 核心板也找不到,目前淘宝上有其他几种核心板,不知道和 icdev 的是否一样,能否提供一下 icdev 的 SAM7S 核心板的原理图?
|
|
|
|
|
|
|
|
因为之前的版本不是我移植的,而且目前我们也没有其他平台可以对照,所以问题在哪里我还不太清楚。
以下是我测试用的 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不使用那么多局部变量的话就不会死。 |
|
|
|
你声明的栈太大了,到了0x10000。在RT-Thread中,线程栈最大是64k - 4,如果更大,基本上可以认为程序、系统设计得有问题。
|
|
|
|
我刚刚试了一下,将两个 Stack 改为 60000,确实 Buffer1被篡改的问题没有了,但是Thread1调用 dummy128后死掉的情况依然存在。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
753 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2714 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1368 浏览 0 评论
1955 浏览 0 评论
1523 浏览 0 评论
74959 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 03:25 , Processed in 1.223006 second(s), Total 85, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号