初级会员

- 积分
- 58
- 金钱
- 58
- 注册时间
- 2014-10-3
- 在线时间
- 0 小时
|
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:
---------------------------------
你好,我的问题解决了。是我的笔误造成的,我创建的任务全部用的是一个堆栈。。。。。。
|