OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8288|回复: 9

UCOSII移植失败

[复制链接]

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-10-3
在线时间
0 小时
发表于 2014-10-14 10:01:40 | 显示全部楼层 |阅读模式
5金钱
我参考官方的STM23的UCOSII移植的,移植完后程序不能正常运行。先贴上部分代码:
OS_STK  START_STK[64];
OS_STK  LED1_STK[64];
OS_STK  LED2_STK[64];

void StartTask(void *p_arg);
void MyTask1(void *p_arg);
void MyTask2(void *p_arg);

int main()
{
  MCU_Init();
    
    OSInit();
  OSTaskCreate(StartTask,(void *)0,(OS_STK *)&START_STK[64-1],STARTPRIO);
    OSStart();
    OS_CPU_SysTickInit();
}
void StartTask(void *p_arg)
{
#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr = 0u;
#endif    
 p_arg = p_arg;
 OS_ENTER_CRITICAL();
 OSTaskCreate(MyTask1,(void*)0,(OS_STK *)&START_STK[64-1],LED1PRIO);
 OSTaskCreate(MyTask2,(void*)0,(OS_STK *)&START_STK[64-1],LED2PRIO);
 OSTaskSuspend(STARTPRIO);
 OS_EXIT_CRITICAL();    
}

程序运行时调试发现程序运行完OSStart()后就不能往后面运行了,StartTask()函数也不能进入,所以我想问题可能出在了汇编程序那边,
于是我尝试的在汇编程序里面通过点亮LED来调试,程序如下:
OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI14                                  ; Set the PendSV exception priority
    LDR     R1, =NVIC_PENDSV_PRI
    STRB    R1, [R0]
    ;????LED
    LDR     R0,=GPIOA_ODR_Addr                      ;GPIOA_ODR_Addr  EQU   0x40010812    
    LDR     R1,=GPIOA_ODR_Value                     ;GPIOA_ODR_Value EQU   0x00  
    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   
但是这样LED也不能点亮,不知道是哪里出了问题,请帮忙看下

最佳答案

查看完整内容[请看2#楼]

回复【5楼】sun_shine: --------------------------------- 你好,我的问题解决了。是我的笔误造成的,我创建的任务全部用的是一个堆栈。。。。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-10-3
在线时间
0 小时
 楼主| 发表于 2014-10-14 10:01:41 | 显示全部楼层
回复【5楼】sun_shine:
---------------------------------
你好,我的问题解决了。是我的笔误造成的,我创建的任务全部用的是一个堆栈。。。。。。
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-10-14 12:47:16 | 显示全部楼层
OS_CPU_SysTickInit();这个是初始化嘀嗒定时器的吧,将它放到OSInit();函数前面,如果你是用嘀嗒做心跳的话
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-10-3
在线时间
0 小时
 楼主| 发表于 2014-10-14 13:17:34 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
这个放到前面去了还是不行,刚刚仿真调试的时候发现了一个问题。
OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI14                                  ; Set the endSV exception priority
    LDR     R1, =NVIC_PENDSV_PRI
    STRB    R1, [R0]

;LDR     R0,=GPIOA_ODR_Addr                      ;GPIOA_ODR_Addr  EQU   0x40010812    
;LDR     R1,=GPIOA_ODR_Value                     ;GPIOA_ODR_Value EQU   0x00  
;STRB    R1,[R0]

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

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

    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the endSV 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
我的程序一直卡死在   OSStartHang这里,而开发板配套历程却不会这样,这是什么原因呢
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-10-3
在线时间
0 小时
 楼主| 发表于 2014-10-14 14:10:13 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
老师你好,刚才那个问题解决了,现在又出现了一个新问题,程序运行时卡死在
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

调试的时候发现StartTask函数可以运行进来,但是一运行里面的OSTaskCreate(MyTask1,(void*)0,(OS_STK *)&START_STK[64-1],LED1PRIO)
问题就出现了,
回复

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2014-10-15 08:01:17 | 显示全部楼层
回复【4楼】denggww123:
---------------------------------
在检查一下,systick初始化函数。我之前遇到过进入OSStartHang,是OS时钟初始化的问题

OSInit(); //??????uC/OS-II 
systick_init(); //systick?? ???uC/OS-II?±????????
OSTaskCreate(Start_Task, 0, &Start_Task_Stk[LED1_TASK_STK_SIZE - 1],START_TASK_PRIO);  //????1
OSStart(); //??????? 


static void systick_init(void)  //uC/OS-II?????±????????
{  
  RCC_ClocksTypeDef  rcc_clocks;  
RCC_GetClocksFreq(&rcc_clocks);         //?÷??±ê×??????????????±??
SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);   //????????????SysTick 
}
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-10-15 08:37:57 | 显示全部楼层
回复【4楼】denggww123:
---------------------------------
访问越界了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-10-3
在线时间
0 小时
 楼主| 发表于 2014-10-15 09:08:37 | 显示全部楼层
回复【6楼】Badu_Space:
---------------------------------
恩恩额,堆栈用了同一个。。。。哎,他粗心了
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-10-15 12:42:38 | 显示全部楼层
回复【7楼】denggww123:
---------------------------------
额。。。
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-6-6
在线时间
0 小时
发表于 2015-6-9 18:35:39 | 显示全部楼层
回复【4楼】denggww123:
---------------------------------
你好,我也遇上了程序一直卡死在   OSStartHang这里,可以问下您当时是怎么解决的吗?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 20:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表