Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
请教RTT在AT91SAM9G45平台上遇见的问题
发布于 2011-09-22 10:01:24 浏览:6920
订阅该版
我引用S3C2440的线程切换代码,在移植到G45后发现如下问题: 我自己创建了一个A线程,内容是: ``` void rt_init_thread_entry(void *parameter) { CPU_INT32U i = 0; while (1) { i = rt_get_cpsr(); TRACE_INFO_WP("cpsr is:%x ", i); *(volatile CPU_INT32U *)0xFFFFF830 = (DEF_BIT_00 | DEF_BIT_31 ); TRACE_INFO_WP("jjjjjjj ", i); rt_thread_delay(50); TRACE_INFO_WP("uuuuuuu ", i); *(volatile CPU_INT32U *)0xFFFFF834 = (DEF_BIT_00 | DEF_BIT_31 ); rt_thread_delay(50); TRACE_INFO_WP("mmmmmmmm ", i); } } ``` 是一个点LED的线程,第一个rt_thread_delay(50)时,这时因为rt_interrupt_nest ==0,从rt_hw_context_switch切换到idle线程,我在idle里加了print语句,用来跟踪程序,加了code的内容如下: ``` static void rt_thread_idle_entry(void* parameter) { rt_uint32_t i = 0; while (1) { #ifdef RT_USING_HOOK if (rt_thread_idle_hook != RT_NULL) rt_thread_idle_hook(); #endif TRACE_INFO_WP("idle_i:%d ", i++); i = i; rt_thread_idle_excute(); } } rt_hw_context_switch代码如下: rt_hw_context_switch STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC) STMFD sp!, {r0-r12, lr} ; push lr & register file MRS r4, cpsr STMFD sp!, {r4} ; push cpsr MRS r4, spsr STMFD sp!, {r4} ; push spsr STR sp, [r0] ; store sp in preempted tasks TCB LDR sp, [r1] ; get new task stack pointer BL dummy_running LDMFD sp!, {r4} ; pop new task spsr MSR spsr_cxsf, r4 LDMFD sp!, {r4} ; pop new task cpsr MSR cpsr_cxsf, r4 BL dummy_running LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc ``` 这里切换到idle线程,输出累加的i值. idle_i:473 idle_i:474 idle_i:475 idle_i:476 rt_interrupt_nest == 1,程序通过rt_hw_context_switch_interrupt切换到我建立的点灯的线程, running rt_hw_context_switch_interrupt rt_interrupt_nest:1 from:70003ebc to:7050105c from_p:255 to_p:20 在点LED的线程里输出了 uuuuuuu,接着通过rt_hw_context_switch切换到idle线程 running rt_hw_context_switch from:7050105c to:70003ebc from_p:20 to_p:255 但是在rt_hw_context_switch汇编代码里第二个BL dummy_running还没有运行,程序就跑飞了。一直输出cpsr:60000093,这个打印语句是我加在exception vector的. dummy cpsr:40000093 cpsr:60000093 cpsr:60000093 线程代码我引用的是s3c2440的,因为都是ARM9 core。在rt_hw_context_switch加入打印语句是为了追踪程序跑飞的情况,不加任何打印语句,程序也会跑飞,只是cpsr会输出0x......1b或0x......17的情况。 谢谢!
查看更多
9
个回答
默认排序
按发布时间排序
bernard
2011-09-22
这家伙很懒,什么也没写!
BL dummy_running 这个地方很可能会出问题的。
huangxi_hans
2011-09-23
这家伙很懒,什么也没写!
BL dummy_running 是在出现程序跑飞后我加上去的,不过第二条BL dummy_running加的位置的确不对。 context switch的代码是没有问题的,在S3C2440上已经验证过了, 内核代码也应该是没有问题的。我在想是不是我的link文件存在问题。 继续找问题。 谢谢Bernard的回答。
huangxi_hans
2011-09-29
这家伙很懒,什么也没写!
问题已经找到了。原因是因为S3C2440的汇编code没有提供对Thumb的支持。解决方法: 1. IAR的C/C++ Compiler的Code选项卡的Generate interwork code里选ARM不要选Thumb,也不能不选 2. 在stack.c 和startup.s及context_switch.s里添加对Thumb的支持。 在这个问题的解决上非常感谢Aozima、ShaoLin、Mobill及Bernard的鼎力协助!! 另外,建议在Object.c里的以下代码建议初始化(不能将问题留给IDE): #ifdef RT_USING_HOOK static void (*rt_object_attach_hook)(struct rt_object* object); static void (*rt_object_detach_hook)(struct rt_object* object); void (*rt_object_trytake_hook)(struct rt_object* object); void (*rt_object_take_hook)(struct rt_object* object); void (*rt_object_put_hook)(struct rt_object* object);
ljt8015
2011-09-29
这家伙很懒,什么也没写!
AT91SAM9G45平台移植代码应该和AT91SAM9260平台一样的吧
huangxi_hans
2011-09-30
这家伙很懒,什么也没写!
ARM7和ARM9是一样的。我是引用了S3C2440的,只是BSP包不太一样,和link文件不一样而已。我的程序是基于norflash和DDR跑起来的。
bernard
2011-09-30
这家伙很懒,什么也没写!
>ARM7和ARM9是一样的。我是引用了S3C2440的,只是BSP包不太一样,和link文件不一样而已。我的程序是基于norflash和DDR跑起来的。 --- 在norflash上跑起来的?那速度会很慢啊,改明弄个指标测试的东西,这样对于系统的性能也有个对比。
weety
2011-09-30
这家伙很懒,什么也没写!
>ARM7和ARM9是一样的。我是引用了S3C2440的,只是BSP包不太一样,和link文件不一样而已。我的程序是基于norflash和DDR跑起来的。 --- AT91SAM9260和AT91SAM9G45使用的是相同的ARM内核,都是ARM926EJ-S,只不过9G45频率高些,支持DDR,外设基本上都兼容的,你可以参考一下。
huangxi_hans
2011-10-10
这家伙很懒,什么也没写!
先用norflash boot起来,然后copy到DDR里,后面整个APP在DDR里跑。速度不会慢。
撰写答案
登录
注册新账号
关注者
0
被浏览
6.9k
关于作者
huangxi_hans
这家伙很懒,什么也没写!
提问
9
回答
41
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
freemodbus主机在freertos的适配,参考rtthread例程
2
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
3
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
4
RT-Thread EtherKit开源以太网硬件正式发布
5
还在担心bsp不好维护吗?快使用yml管理主线bsp
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部