发新帖我要提问
12
返回列表
打印
[STM32F1]

UCOS II 移植到STM32F1系列

[复制链接]
楼主: hanzhen654
手机看帖
扫描二维码
随时随地手机跟帖
21
hanzhen654|  楼主 | 2018-6-12 22:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
Ports是与系统息息相关的端口配置文件。

使用特权

评论回复
22
hanzhen654|  楼主 | 2018-6-12 22:13 | 只看该作者
Source这个不用说了,就是OS全部文件。

使用特权

评论回复
23
hanzhen654|  楼主 | 2018-6-12 22:36 | 只看该作者
配置的时候需要将uCOS-II下的文件添加到工程,同时也需要将他们的路径配置好。

使用特权

评论回复
24
hanzhen654|  楼主 | 2018-6-12 22:48 | 只看该作者
文件配置和修改
os_cfg.h 是用来配置系统功能的,我们需要通过修改它来达到剪裁系统功能的目的。
     首先肯定是禁用信号量、互斥信号量、邮箱、队列、信号量集、定时器、内存管理,关闭调试模式:
     也用不着应用软件的钩子函数,也禁掉;多重事件控制也禁掉。

使用特权

评论回复
25
hanzhen654|  楼主 | 2018-6-12 22:49 | 只看该作者
修改 os_cpu_a.asm
     PUBIC 改为 EXPORT 声明函数名称。
     ·RSEG CODE:CODE:NOROOT(2)换成(记住,千万不要顶格啊,要不错误在哪里都不知道)
      AREA |.text|, CODE, READONLY, ALIGN=2 ;AREA |.text| 表示:选择段 |.text|。
     ;CODE 表示代码段,READONLY 表示只读(缺省)
      ;ALIGN=2 表示 4 字节对齐。若 ALIGN=n,这 2^n 对齐
     THUMB ;Thumb 代码
     REQUIRE8 ;指定当前文件要求堆栈八字节对齐
     PRESERVE8 ;令指定当前文件保持堆栈八字节对齐

使用特权

评论回复
26
hanzhen654|  楼主 | 2018-6-12 22:49 | 只看该作者
修改 startup_stm32f10x_hd.s中PendSV_Handler 的地方替换成OS_CPU_PendSVHandler。即修改pendsv中断函数的名称
         SysTick_Handler替换成OS_CPU_SysTickHandler,即修改系统时钟中断函数的名称。

使用特权

评论回复
27
hanzhen654|  楼主 | 2018-6-12 22:50 | 只看该作者
调试
其他地方其实根本不需要修改。IAR与mdk都是通用的,基于cortex-M3内核进行开发的。什么os_ctx,systickinit等都不需要进行修改。
在debug的时候,看哪些东西是是报错未定义的,再到下载的工程案例中去找,或者是将文件添加进来,或者是将函数或者宏定义添加源码中(我的话是因为不想将为了一个函数或者宏定义就将工程模板中的的一个文件就拉倒工程中来,就粘贴将报错未定义的函数和宏在工程模板文件中找到,复制粘贴)。有些宏定义因为配置的不对会报错,也要根据实际情况报错信息进行一下配置。

使用特权

评论回复
28
hanzhen654|  楼主 | 2018-6-12 22:52 | 只看该作者
多任务执行,主函数的写法,以及多任务的启动。
#include "app.h"
#include  "ucos_ii.h"   
#include  "app_cfg.h"

#define TASK_STK_SIZE 512
#define     TaskStart_Prio 1

OS_STK TaskStk[5][TASK_STK_SIZE]; //UCOSII将用户任务堆栈的定义交给了程序员自己实现。不一定需要使用二维数组
void task1(void *p)
{
     while(1)
     {
          LED1_ON;
          delay();
          LED1_OFF;
          delay();
          OSTaskResume(2);
          OSTaskSuspend(1);
     }
   
}
void task2(void*p)
{
     while(1)
     {
          LED2_ON;
          delay();
          LED2_OFF;
          delay();
          OSTaskSuspend(2);
     }
}
void task3(void*p)
{
     while(1)
     {
          LED3_ON;
          delay();
          LED3_OFF;
          delay();
          OSTaskResume(1);
         
     }
}
int main(void)
{
     LED_GPIO_Config();
     OSInit();
     OSTaskCreate(task1,0,&TaskStk[1][TASK_STK_SIZE-1],1);
     OSTaskCreate(task2,0 ,&TaskStk[2][TASK_STK_SIZE-1],2);
     OSTaskCreate(task3,0 ,&TaskStk[3][TASK_STK_SIZE-1],3);
     OSStart();
     return 0;
}
然后编译运行。下载到板子上,我的是完全可以运行。

使用特权

评论回复
29
hanzhen654|  楼主 | 2018-6-12 23:03 | 只看该作者
修改OS_DBG.C

修改:#define OS_COMPILER_OPT    __root

为:#define OS_COMPILER_OPT

,原因也是编程环境的问题。

使用特权

评论回复
30
hanzhen654|  楼主 | 2018-6-12 23:05 | 只看该作者
6. 修改启动代码

这个步骤是移植的核心:上面说的其他的修改,都是一些附属的格式方面的修改,而启动代码的修改才是移植的核心,这里简单的分析2个问题,一是,什么叫移植,二是移植的操作系统如何能够被我们的工程所应用。所谓移植,打一个恰当的比喻——器官移植,就是将A的器官移植到B身上,使A的器官能够为B所用。所以移植绝对不是简单的“复制”,不仅要放到你的工程项目中,更重要的是要能够和你的项目建立联系。那么uCOS-ii怎么跟STM32建立联系呢?

uCOS-ii的核心作用就是任务调度,要使用STM32的一个特殊中断——PendSV,就是可挂起系统任务中断,通过该中断进行系统的调度。还有就是uCOS-ii需要一个基准时间,那么STM32中有一个专用的定时器,嘀嗒定时器SysTick,这个定时器,就是专为操作系统而设计的,通过这个滴答定时器给uCOS-ii提供一个时间基准,每隔固定的时间出发一个PendSV中断,进行任务的调度。所以呢,在官方案例的移植文档AN-1018中也特别提到这一点,要将startup_stm32f10x_hd.s启动代码中所有“PendSV_Handler”和“SysTick_Handler”,替换成“OS_CPU_PendSVHandler”和“OS_CPU_SysTickHandler”,这样就相当于将uCOS-ii的“神经”跟你的项目的“神经”搭在了一起。

使用特权

评论回复
31
hanzhen654|  楼主 | 2018-6-12 23:06 | 只看该作者
其中需要注意的是,在创建的第一个任务里,一定要先初始化嘀嗒定时器,至此移植完成,验证成功。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则