8822|10

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教uCOS移植问题 [复制链接]

这两天终于把uCOS2.86移植到自己的板上了,
自己在DEMO框架中写了一个简单的测试,下载到FLASH中可以正常调试和运行。
试着把它改到在SRAM中运行,希望以后调试时可以减少烧录FLASH次数。
照着参考做了一些改动:
将STM32F_FLASH.ICF 改为STM32F_RAM.ICF,里面的内容改为:
define region FLASH = mem:[from 0x8000000 to 0x801FFFF];
define region SRAM = mem:[from 0x20000000 to 0x2000FFFF];
define block HEAP with alignment = 8, size = 0x00000000 { };
define block CSTACK with alignment = 8, size = 0x00000100 { };
initialize by copy { readwrite };
do not initialize { section .noinit };
place at start of SRAM { readonly section .intvec };
place in SRAM { readonly };
place in SRAM { readwrite, block HEAP, block CSTACK};
修改工程配置连到STM32F_RAM.ICF,编译下载到SRAM都没有问题,
调试器可以进入main,并可以再单步执行几条初始化语句, 当程序执行到 OSStart()内部时,跑飞了,
以下列出我观测到的一些数据:
1.中断向量已经正确配置在SRAM 0x20000000开始处
2.程序执行到OSStart()内部的OSStartHighRdy()语句时跑飞到FLASH的   0x08002d64 这应该是 App_Fault_ISR,Hard Fault; 
3.观察.map文件HEAP,CSTACK,_intvec等均分配在SRAM中,没有发现不对的地方

可能自己还没有吃透uCOS,请玩过uCOS的朋友指点一下,大家都可以交流交流。

我的环境:STM32F103RET6, IAR5.20, JLINK,板上目前只用了串口,硬件可以保证是正常运转的。
此帖出自stm32/stm8论坛

最新回复

                                 就是你说的这个问题:STM32中断向量表的默认位置是0x08000000,如果要改到RAM中运行要设置一下中断向量表的位置(告诉内核中断向量表在什么地方),在OSStart()之前加一句NVIC_SetVectorTable((u32)0x20000000, 0x00);谢谢了!感觉经过这轮调试,对ARM内核有了一个初步的了解!   详情 回复 发表于 2008-10-19 11:04
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

我也在学习

                                 我也在学习,请教一些经验
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

单步运行

                                 单步运行检查一下在什么指令时跑飞的
此帖出自stm32/stm8论坛
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 

仅供参考

若 “3.观察.map文件HEAP,CSTACK,_intvec等均分配在SRAM中,没有发现不对的地方”这都没发现不对的地方。

应该不会出现在这个函数上NVIC_SetVectorTable
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 

re: 3楼

在执行OSStart()内部的OSStartHighRdy()语句时出现问题,因为OSStartHighRdy为ASM代码,还没有看明白:
OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI14    ; Set the PendSV exception priority
    LDR     R1, =NVIC_PENDSV_PRI
    STRB    R1, [R0]

    MOVS    R0, #0   ; Set the PSP to 0 for initial context switch call
    MSR     PSP, R0

    LDR     R0, =OSRunning   ; OSRunning = TRUE
    MOVS    R1, #1
    STRB    R1, [R0]

    LDR     R0, =NVIC_INT_CTRL; Trigger the PendSV exception (causes context switch)
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]

    CPSIE   I            ; Enable interrupts at processor level

OSStartHang
    B       OSStartHang           ; Should never get here
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 

re:4楼:

uCOSII没有用NVIC_SetVectorTable来设置 _intvec
在执行OSStartHighRdy()之前用View/Memory命令观察0x20000000段,
感觉_intvec是对的,
个人认为:uCOSII在 app_vect_v5.c中用下面数组定义的形式将_intvec设置好的:
__root  const  APP_INTVECT_ELEM  __vector_table[] @ ".intvec" = {
{ .Ptr = (void *)__sfe( "CSTACK" )}, 
__iar_program_start,
App_NMI_ISR,
...
}
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 

设置断点看看运行到CPSIE I没有,如果运行到了就查一查向

同意 4 楼


这个函数的意义在源代码里都说明了
;                                          START MULTITASKING
;                                       void OSStartHighRdy(void)
;
; Note(s) : 1) This function triggers a PendSV exception (essentially, causes a context switch) to cause
;              the first task to start.
;
;           2) OSStartHighRdy() MUST:
;              a) Setup PendSV exception priority to lowest;
;              b) Set initial PSP to 0, to tell context switcher this is first run;
;              c) Set OSRunning to TRUE;
;              d) Trigger PendSV exception;
;              e) Enable interrupts (tasks will run with interrupts enabled).
;********************************************************************************************************
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 

re: black_wolf

可以运行到   CPSIE   I
此时观察向量表如下:
0x20000000  00 32 00 20 c5 2f 00 20 f5 2f 00 20 f9 2f 00 20 
            05 30 00 20 fd 2f 00 20 01 30 00 20 09 30 00 20
            09 30 00 20 09 30 00 20 09 30 00 20 09 30 00 20 
            09 30 00 20 09 30 00 20 ef 2d 00 20 89 25 00 20 
            95 17 00 20 a1 17 00 20 ad 17 00 20 b9 17 00 20 
            c5 17 00 20 d1 17 00 20 dd 17 00 20 e9 17 00 20 
            f5 17 00 20 01 18 00 20 0d 18 00 20 19 18 00 20 
            25 18 00 20 31 18 00 20 3d 18 00 20 49 18 00 20 
            55 18 00 20 61 18 00 20 6d 18 00 20 79 18 00 20 
            85 18 00 20 91 18 00 20 9d 18 00 20 a9 18 00 20 
            b5 18 00 20 c1 18 00 20 cd 18 00 20 d9 18 00 20 
            e5 18 00 20 f1 18 00 20 fd 18 00 20 09 19 00 20 
            15 19 00 20 21 19 00 20 2d 19 00 20 39 19 00 20 
            45 19 00 20 51 19 00 20 5d 19 00 20 69 19 00 20
  寄存器 IPSR = 0
随后单步运行     B       OSStartHang,   在这里循环等待
全速运行后,OS 没有跳转到 App_TaskStart 任务(正常情况下应该到这个任务)
此时,停止运行,可以看到程序指针停在了 PC = 0x08002d64
ISPR = 0x00000003, PRIMASK = 0x00000001, FAULTMASK = 0x00000000
应该是引发了App_Fault_ISR 中断,Hard Fault;
奇怪的是:PC为什么=0x08002d64 指向了Flash,而不是指向SRAM中的向量表



此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 

中断向量表的位置没有设置

STM32中断向量表的默认位置是0x08000000,如果要改到RAM中运行要设置一下中断向量表的位置(告诉内核中断向量表在什么地方),在OSStart()之前加一句

NVIC_SetVectorTable((u32)0x20000000, 0x00);

试试看
看来要想系统跑稳定还需要大量工作啊!
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 

奇怪

                                 今天早上,rtx uc 俺都在芯片的sram进行调试,单步也正常,为什么这么顺利呢
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 

re: black_wolf

就是你说的这个问题:
STM32中断向量表的默认位置是0x08000000,如果要改到RAM中运行要设置一下中断向量表的位置(告诉内核中断向量表在什么地方),在OSStart()之前加一句

NVIC_SetVectorTable((u32)0x20000000, 0x00);
谢谢了!
感觉经过这轮调试,对ARM内核有了一个初步的了解!
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表