Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
rt_system_scheduler_start()返回
发布于 2013-11-27 17:08:24 浏览:10574
订阅该版
最初是前天串口老是乱码(在评估环境,其它几个都是OK的),昨天也不知道怎么好了,但总是启动后 出异常。具体的异常信息参考意义不是很大了,今天我调了一下,大概是这里无法产生中断而返回: rtthread_startup() -> rt_system_scheduler_start() -> rt_hw_context_switch_to() : ``` LDR R0, =ICSR /* trigger the PendSV exception (causes context switch) */ LDR R1, =PENDSVSET_BIT STR R1, [R0] CPSIE I /* enable interrupts at processor level */ /* never reach here! */``` 用的是bspstm32f10x,修改不多,目前主要是修改了一下编译器使用GNU Tools ARM Embedded 4.7 2013q3版本, 另外把application.c中的两个任务改为空循环了。 我看了一下CoOS中的代码,和这里基本上是一样的,不知道为什么它跑起来是正常的: ```void SwitchContext(void) { __asm volatile ( " LDR R3,=NVIC_INT_CTRL " " LDR R3,[R3] " " LDR R2,=NVIC_PENDSVSET " " LDR R1,[R2] " " STR R1, [R3] " " BX LR " ); }``` (它里面用的是变量,所以多了一级LDR操作。) 看手册有这样一句话: Use CPS only from privileged software, it has no effect if used in unprivileged software 但打印出CONTROL寄存器发现是privileged mode。 现在还不会搭RT-Thread的调试环境,所以是用设置一些值再打印出来调试的,目前定位到这里不好再 找下去了。希望各位大神支招,看一下可能是哪个方面的原因,是不是还有一些配置没做对? 下载附件 [bsp_stm32f10x.tar.bz2](https://oss-club.rt-thread.org/uploads/6223_ce7db975a7459f077c1dac8def3a6de7.bz2) ![1.png](https://oss-club.rt-thread.org/uploads/3230_a32a3b9e16baa4429e3288afc39de07d.png) ![2.png](https://oss-club.rt-thread.org/uploads/3230_c05921741080622dab15516ee4f45640.png) ![3.png](https://oss-club.rt-thread.org/uploads/3230_c41aefc8344ba1b05c19ea2c9184a6bb.png) 下载附件 [stm32f10x-mod.zip](https://oss-club.rt-thread.org/uploads/3230_7422cc4a58c9c378233dc3a415c9536c.zip) 下载附件 [stm32f10x_mini.7z](https://oss-club.rt-thread.org/uploads/3230_b362efb881cc62bf685f2570592a6818.7z)
查看更多
28
个回答
默认排序
按发布时间排序
bernard
2013-11-27
这家伙很懒,什么也没写!
你单步调上下文切换的代码?单步的时候,中断会被关闭的。
prife
2013-11-28
这家伙很懒,什么也没写!
楼主,你把上面的bsp打包发上来,删掉生成的临时文件目录。我帮你看。
Cyberman
2013-11-28
这家伙很懒,什么也没写!
To bernard: 没有,RT-Thread的还没架起调试环境,这几天连续在评估MDK+RTX(还有好几个版本)、CoIDE+CoOS、emIDE+FreeRTOS (这个祼奔OK了,但FreeRTOS没弄出来),RT-Thread我试了一下Scons挺好用的,就先用了。 因为不熟悉,还挺折腾了一段时间的,我是插入一些rt_kprintf()通过打印的信息来看执行情况的,switch那部分是我通过修改一些 变量,然后出异常之后打印出来,最终确认CPSIE后直接return了,PendSV_Handler中的操作没有被执行。
Cyberman
2013-11-28
这家伙很懒,什么也没写!
To prife: 谢了。里面有一些插入的调试代码。[attach]0[/attach]
prife
2013-11-28
这家伙很懒,什么也没写!
看了下application.c代码,都被你搞成什么了啊。好几处for();; 还有,各种C99式变量定义。不建议那样写。 代码我小改了一下。包括: 1. 主要是删掉你在application.c里的for();; 2. 修改rtconfig.py中的编译器为keil 3. 我记得你好像说你用103vb?这个板子偏内flash是20K的。board.h里你已经把RAM改成20K了。 编译运行: 下载附件代码 如果使用MDK编译器, ``` scons --target=mdk4 -s ``` 重新生成工程。(需要添加RTT_ROOT环境变量) 然后按照下图配置MDK,用自带的simulator仿真了一下,可以正确运行。目测在板子上也能直接运行。 [attachment=-4] [attachment=-3] [attachment=-2] 修改后的bsp [attachment=-1] 最后,我记得你好像在邮件列表里说希望裁剪bsp大小? 可以参考wiki上那篇文章来裁剪。方法都是一样的 ----------------------------------------------------------------- 追加: wiki上的那篇裁剪文档还算OK,但是提供的那个实例工程有很多问题。(那什么,那个帖子我写的,工程也是我提供的,坑了大家了,对不住了,今晚就那个页面中的实例工程包)
prife
2013-11-28
这家伙很懒,什么也没写!
重新开一楼。这里提供一个裁剪好的stm32f10x c8的工程。为了测试方便,我打开了CONSOLE支持,这样就可以用使用rt_kprintf了。但是需要打开 heap支持和mempool支持,这导致系统占用的资源膨胀到15K左右。(开O3优化后,可以降低到15K左右)。 另外:这个bsp是对wiki中裁剪rt-thread页面实例工程的修改。而新的1.2.0中的stm32f10x bsp串口使用了新的框架。注意区别。 ``` ** Object/Image Component Sizes Code (inc. data) RO Data RW Data ZI Data Debug Object Name 17746 4922 2038 304 2760 384327 rtthread-stm32.axf (uncompressed) 17746 4922 2038 96 2760 384327 rtthread-stm32.axf (compressed) 17746 4922 2038 96 0 0 ROM Totals for rtthread-stm32.axf scons: done building targets. ``` [attach]2087[/attach] 再强调几点: 1. 一定要根据自己板子的情况修改board.h中的内存大小。 2. 如果修改了rtconfig.h中的调度器优先级别,stm32平台默认是32,如果改成了8,那么就要保证创建线程的时候,优先级参数不能超过最大优先级别,否则系统会崩溃。附件代码里我改成8优先级,因此led线程的优先级写的是5..(这是原裁剪工程里还是20,所以是有坑的) 3. 进一步裁剪,可以关闭rt_kprintf支持,这样的话,可以在rtconfig.h中关闭 heap mempool console 这样可以极大减少flash占用。
Cyberman
2013-11-28
这家伙很懒,什么也没写!
谢了,明天弄一下试试。 我用的编译器是NU Tools ARM Embedded 4.7 2013q3版本,如果我有MDK的 License,就直接用RTX了,反正我最终的项目问题主要是在各种硬件的控制上, 也就是接收命令并控制硬件,所以随便哪个RTOS只要稳定一些都能满足要求。 只是RT-Thread带个小Shell感觉挺不错的,所以想搞出来试试。 我用的芯片是STM32F103C8,另有一块STM32F103VC的板子还没跑过。感觉会 不会和编译器有关系?我看RT-Thread中用的GCC是一RIDE境中带的(这个我还没 找到),今天移FreeRTOS时发现它也用的这个的GCC,编译器头文件似乎有一些 特定的支持,我移到板子上挺花了些时间,最后还是有问题,最高级别的任务如果 一直跑OK,只要任务一切换就出现Hard Fault,还没仔细定位。 裁减这个昨天我试过,发现Shell和一些debug功能比较大,把它们去掉用-Os编译 能减少到10几K。 代码是调试时随手改的,肯定是直接就地定义比较方便一些,本来也只是调试而已, 我现在还在评估阶段。那两个死循环只是为了看效果,因为我的板子比较简单,也 没啥LED可用(有一个可以闪的,我不想去确认是哪个管脚了,反正问题不在那边, 所以改成一个什么都不干的任务最容易看出问题所在)。
prife
2013-11-29
这家伙很懒,什么也没写!
如果用arm gcc的话,可以用arm-none-eabi-gcc。 一般情况下,如果出现bsp使用gcc编译崩溃而mdk编译不崩溃的话,这一般属于代码中存在隐蔽的bug,这种情况我遇到过。上一楼代码提供裁剪过得bsp使用gcc来编译也是可以的。在公司的时候没安装gcc toolchain也没有板子,因此就没有测试。
Cyberman
2013-11-30
这家伙很懒,什么也没写!
>如果用arm gcc的话,可以用arm-none-eabi-gcc。 >一般情况下,如果出现bsp使用gcc编译崩溃而mdk编译不崩溃的话,这一般属于代码中存在隐蔽的bug,这种情况我遇到过。上一楼代码提供裁剪过得bsp使用gcc来编译也是可以的。在公司的时候没安装gcc toolchain也没有板子,因此就没有测试。 --- 昨天病休,又遇到家里停电,今天才调试了一下。这个问题有些怪异,最终发现是这样的: 如果用J-Flash下载bin文件之后没有disconnect,然后直接reset板子就出现无法切换的情况, 遇到这种情况有两种办法解决: 1. 下载之后disconnect。 2. 板子掉一下电。 用MDK编译的话不disconnect最终会shell的finsh>>无法打印出来,一直吊着,一旦 disconnect马上就运行下去了。 有可能和这两种编译器采用的不同的初始化代码有关系? 两种编译器简单对比了一下,发现你给我的示例中增加的 --gnu --split_sections 选项对于armcc编译后的大小影响比较大,加了这个明显变小。在这个的基础上,同样的 -O3优化两个编译器编译结果的大小差不多,而如果GCC用-Os则会小一些(不知道armcc 有没有类似的选项)。 而-O0则两者差异比较大,GCC编译出来的大许多,似乎和以前在VxWorks上用GCC和 Diab的区别是一样的。 本来想看一下MDK5的编译器有优化有没有更好一些,结果编译失败了,没再去弄。 另外你给我的代码中,也出现和我发到邮件列表中一样的问题,这个问题前天我在弄 FreeRTOS是知道原因了,简单改一下就可以了: ``` __attribute__( ( optimize("O0")) ) uint32_t __STREXB(uint8_t value, uint8_t *addr) { uint32_t result=0; __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); return(result); } __attribute__( ( optimize("O0")) ) uint32_t __STREXH(uint16_t value, uint16_t *addr) { uint32_t result=0; __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); return(result); } ``` 比较奇怪的是,RT-Thread 1.1.1中直接的那个bspstm32f10x编译则不会遇到这个问题, 而这两个文件又是完全一样的,还没弄清楚是哪触发的问题。 这个问题似乎以前在许多地方出过的,应该是优化时因为value用的是r0,而返回值也是r0, 所以编译器直接把%0和%2都优化为它了,而在ARM的规范中这两条指令是不允许这样用的。
bernard
2013-11-30
这家伙很懒,什么也没写!
上面这个问题,是否CMSIS的库中默认就包含了?
撰写答案
登录
注册新账号
关注者
0
被浏览
10.6k
关于作者
Cyberman
这家伙很懒,什么也没写!
提问
5
回答
26
被采纳
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
【NXP-MCXA153】 定时器驱动移植
2
GD32F450 看门狗驱动适配
3
【NXP-MCXA153】看门狗驱动移植
4
RT-Thread Studio V2.2.9 Release Note
5
CherryUSB的bootuf2配置
热门标签
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
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
9
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部