网上看到有的人也在STM32F103C8T6上移植过UCOSII系统,各有各的说辞,有的说在STM32F103C8T6上移植UCOSII系统,不能用startup_stm32f103x_hd.s,要用startup_stm32f103x_md.s,不然会报错或跑不起来,我就纳闷了,hd是比md更大内存,更大FLASH的,怎么会用不了,再说系统能不能跑起来,最主要的还是取决你的芯片的RAM够不够,与你用的启动文件有多大关系呀,又不是比较大的系统,那就还可能修改启动文件。
我移植的时候用的UCOSII版本是
STM32F103X的版本V3.5
移植开始,UCOSII-CORE文件如下
UCOSII-CPU的文件如下
UCOSII-CFG的文件如下
所需的系统文件都有了,编译没有问题
如果编译后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();
}
一定要开启SYSTICK,不然不会切换任务,会一直是单任务,开启SYSTICK后,进入SysTick_Handler(),触发任务切换
到这里移植就完成了。