在STM32F103C8T6上移植UCOS系统

        网上看到有的人也在STM32F103C8T6上移植过UCOSII系统,各有各的说辞,有的说在STM32F103C8T6上移植UCOSII系统,不能用startup_stm32f103x_hd.s,要用startup_stm32f103x_md.s,不然会报错或跑不起来,我就纳闷了,hd是比md更大内存,更大FLASH的,怎么会用不了,再说系统能不能跑起来,最主要的还是取决你的芯片的RAM够不够,与你用的启动文件有多大关系呀,又不是比较大的系统,那就还可能修改启动文件。

       我移植的时候用的UCOSII版本是

在STM32F103C8T6上移植UCOS系统_第1张图片

STM32F103X的版本V3.5

移植开始,UCOSII-CORE文件如下

在STM32F103C8T6上移植UCOS系统_第2张图片

UCOSII-CPU的文件如下

在STM32F103C8T6上移植UCOS系统_第3张图片

UCOSII-CFG的文件如下

在STM32F103C8T6上移植UCOS系统_第4张图片

所需的系统文件都有了,编译没有问题

如果编译后ZI-data比较大,可以对系统进行裁剪一下,将这些没用到的宏关掉,如下

#define OS_APP_HOOKS_EN           0u

#define OS_ARG_CHK_EN             0u

#define OS_DEBUG_EN               0u

#define OS_EVENT_MULTI_EN         0u

#define OS_FLAG_EN                0u

#define OS_MEM_EN                 0u

#define OS_MUTEX_EN               0u

#define OS_TMR_EN                 0u

在编译,ZI-data小了很多,加上了写的一些应用程序,还不到10K,当然对有些堆栈也要进行设置,设置到合适的值或长度

创建任务

/UCOSII///
//START
#define START_TASK_PRIO              20 
#define START_STK_SIZE                  64
OS_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *pdata);   

#define MAIN_TASK_PRIO                   5 
#define MAIN_STK_SIZE                      128
OS_STK MAIN_TASK_STK[MAIN_STK_SIZE];
void MainTask(void *pdata);                    

//KEY
#define KEY_TASK_PRIO                   4 
#define KEY_STK_SIZE                      64
OS_STK KEY_TASK_STK[KEY_STK_SIZE];

#define NETCOMM_TASK_PRIO           3 
#define NETCOMM_STK_SIZE              256
OS_STK COMM_TASK_STK[NETCOMM_STK_SIZE]

void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;  
    pdata = pdata;           
     OS_ENTER_CRITICAL();            /
    DEBUG_LOG("start_task...\r\n");
  OSTaskCreate(MainTask,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);        
    OSTaskCreate(KeyctrlTask,(void *)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO);
  OSTaskCreate(NetCommTask,(void *)0,(OS_STK*)&COMM_TASK_STK[NETCOMM_STK_SIZE-1],NETCOMM_TASK_PRIO);    
     OSTaskSuspend(START_TASK_PRIO);   
    OS_EXIT_CRITICAL();                
}

void MainTask(void *pdata)

{

      while(1)

       {

              delay_ms(10);

       }

}

同样的创建任务void KeyctrlTask(void *pdata),void NetCommTask(void *pdata);

注意这里的任务,在while里面必须得有delay,不然会一直只运行一个任务,其它的任务不运行。

 int main(void)
 {    

    delay_init();
    NVIC_Configuration();

    OSInit();                  

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


void SysTick_Handler(void)
{                   
    OSIntEnter();        
    OSTimeTick();       
    OSIntExit();       
}

在STM32F103C8T6上移植UCOS系统_第5张图片

一定要开启SYSTICK,不然不会切换任务,会一直是单任务,开启SYSTICK后,进入SysTick_Handler(),触发任务切换

到这里移植就完成了。

 

 

 

 

 

你可能感兴趣的:(MCU)