OpenEdv-开源电子网

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

在ucos中进行IAP操作,出现死机,不成功

[复制链接]

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
发表于 2015-7-7 09:51:24 | 显示全部楼层 |阅读模式
5金钱
如题,再战舰上试验原子哥的IAP没有问题,例程是不带ucos的。现将其移植到ucos中,执行IAP后就死机。
由于正常运行时的程序不可能是单单bootload程序,而是运行在ucos 下的包含bootload的完整的程序,现将1M容量的FLASH分成3个区域
包含bootload的程序储存在A区域0x08000000-0x08040000,运行IAP程序的区域B区域0x08040000-0x080A0000暂存IAP程序的区域B区域0x080A0000-0x08100000
当需要进行IAP升级的时候,运行有bootload的程序就通过串口或网口接收升级的.bin文件暂存在flash的C区域,接受完毕后校验程序没有问题后,再将其复制到运行区B,负载完成后自动跳转进B区域运行。
现在在UCOS中运行IAP后就死机,怀疑是否因为IAP只是UCOS中的一个任务,运行时被其他任务中断,不能完成跳转,是否需要关闭其他任务,怎么关闭?
可以肯定接收程序正确,复制程序正确,将bootload程序换成不含UCOS的就可以正常跳转运行IAP,只要换回UCOS就死机。

u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X080A0000)));

#define FLASH_APP1_ADDR 0x08040000  

/////////////////////////UCOSII?????è??///////////////////////////////////
//START ????
//?è????????????
#define START_TASK_PRIO       10 
#define START_STK_SIZE   64
OS_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *pdata);
  
#define LED0_TASK_PRIO       7 
#define LED0_STK_SIZE       64
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
void led0_task(void *pdata);

#define KEY_TASK_PRIO 5        
#define KEY_STK_SIZE 64         
OS_STK KEY_TASK_STK[KEY_STK_SIZE];   
void key_task(void *pdata);  

int main(void)

//SCB->VTOR = FLASH_BASE | 0x10000;
delay_init(168);       //???±??????
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //????·?×é????
uart_init(115200);   //?®???¨?????è??
LED_Init(); //LED??????
KEY_Init();   //°??ü??????

OSInit();   
  OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//???¨????????
OSStart();
}


 //????????
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
pdata = pdata; 
  OS_ENTER_CRITICAL(); //??????????(??·¨±??????ò??)    
  OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);   
// OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
  OSTaskCreate(key_task,(void*)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO); //???¨KEY????
OSTaskSuspend(START_TASK_PRIO); //????????????.
OS_EXIT_CRITICAL(); //??????????(????±??????ò??)



void key_task(void *pdata)
{
u8 key;
u32 oldcount=0; //?????®????????????
u32 applenth=0; //????????app?ú???¤??
u8 clearflag=0; 

while(1)

if(USART_RX_CNT)
{
if(oldcount==USART_RX_CNT)//????????,????????????????,????±????????????ê??.

{
applenth=USART_RX_CNT;
oldcount=0;
USART_RX_CNT=0;
printf("\r\n???§???ò?????ê??!\r\n");
printf("?ú???¤??:%dBytes\r\n",applenth);
// LCD_ShowString(30,210,240,16,16,"programmer updata finished!!");
}
else oldcount=USART_RX_CNT;
}
key=KEY_Scan(0);
if(key==KEY1_PRES)  //·???????
{
// udp_flag |= LWIP_SEND_DATA; //±ê??LWIP????????·???
}
else if(key==WKUP_PRES) //WK_UP°??ü°???
{
// if(applenth)
if(STMFLASH_ReadWord(0x080A0000)!=0XFFFFFFFF)//??·?0XFFFFFFFF????·?,??????????????
{
printf("?????ü??????...\r\n");
// LCD_Fill(30,210,240,210+16,WHITE);//????????
// LCD_ShowString(30,210,200,16,16,"Copying APP2FLASH...");
  // if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//??????·???0X08XXXXXX.
if(((*(vu32*)(0X080A0000+4))&0xFF000000)==0x08000000)
{  
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//?ü??FLASH?ú?? 
//          LCD_Fill(30,210,240,210+16,WHITE);//????????
// LCD_ShowString(30,210,200,16,16,"Copy APP Successed!!");
printf("?????ü???ê??!\r\n");

}else 
{
// LCD_ShowString(30,210,200,16,16,"Illegal FLASH APP!  ");   
printf("·?FLASH???????ò!\r\n");
}
  }else 
{
printf("?????????ü????????!\r\n");
// LCD_ShowString(30,210,200,16,16,"No APP!");
}
clearflag=7;//±ê???ü????????,?????è??7*300ms?ó????????  
}
else if(key==KEY2_PRES) //KEY2°???
{
printf("????????FLASH???§?ú??!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//??????·???0X08XXXXXX.
{  
iap_load_app(FLASH_APP1_ADDR);//????FLASH APP?ú??
}else 
{
printf("·?FLASH???????ò,??·¨????!\r\n");
// LCD_ShowString(30,210,200,16,16,"Illegal FLASH APP!");   
}  
clearflag=7;//±ê???ü????????,?????è??7*300ms?ó????????  
}
else if(key==KEY0_PRES) //KEY0°???
{
STMFLASH_EraseSector(0x080A0000,0x18000);
}
OSTimeDlyHMSM(0,0,0,100);  //???±10ms
}
}




最佳答案

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

参考一下http://www.openedv.com/posts/list/64129.htm
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2067
金钱
2067
注册时间
2012-5-26
在线时间
292 小时
发表于 2015-7-7 09:51:25 | 显示全部楼层
参考一下http://www.openedv.com/posts/list/64129.htm
活着才是王道!健康是一切的前提!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-7 23:21:25 | 显示全部楼层
写flash时,禁止所有中断。
我们sys.c提供了禁止全部中断的函数。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-12-17
在线时间
0 小时
发表于 2015-12-17 13:41:50 | 显示全部楼层
楼主,问题解决了没有?能不能共享一下方法?
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-12-17
在线时间
0 小时
发表于 2015-12-17 14:40:02 | 显示全部楼层
问题解决了,谢谢 lison0103。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 12:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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