随着工业需求以及单片机性能越来越高,单个芯片能够且需要处理的任务也越来越多,使用传统前后台任务模式已经很难满足设计的需求,嵌入式实时操作系统正是在这种背景下发展起来,目前流行的有rt-threadfreeRTOSuc/os等轻量级嵌入式操作系统,以及嵌入式Linux这样用于复杂应用开发的操作系统,它们的各有优劣。对于开发者来说,熟悉和使用嵌入式操作系统也是必备技能。深入和理解RTOS的原理,邵贝贝的<嵌入式实时操作系统uCOS-II>是比较好的资料。不过本博文是从应用的角度阐述ucos的移植,以及各模块在实际开发中的运用,不过多的涉及内部的实现原理和核心技术。

  uC/OS-II移植stm32在网上的说明很多这里在大量的重复意义不大,因此本节重点不是如何完成移植,而是讲述如何根据现有文件快速新建一个ucos工程模板。对于Cortex-M3平台,如os_cpu_a.asm这个汇编文件就是通用的,直接拿来用就可以。

1.startup_stm32f10x_cl.s (启动代码)

 这里面涉及到两个中断,SysTick_Handler 和 PendSV_Handler

根据文档说明建议SysTick_Handler保留作为系统滴答时钟,PendSV_Handle则使用uC/OS-II内部自带中断替换

即需要将startup_stm32f10x_cl.s中的3处PendSV_Handler全部都替换为OS_CPU_PendSVHandler,建议用MDK自带的replace替换,如此启动文件修改完毕。

2.os_cpu_c.c(堆栈建立及钩子函数)

 因为SysTick_Handler保留为操作系统滴答时钟,那么CPU文件中的操作系统时钟函数就不需要,可以注释掉。

//void OS_CPU_SysTickHandler(void)
//{
// OS_CPU_SR cpu_sr; // OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */
// OSIntNesting++;
// OS_EXIT_CRITICAL();
//
// OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */
// OSIntExit(); /* Tell uC/OS-II that we are leaving the ISR */
//}

3.stm32f10x_it.c(stm3210x系列的中断函数定义文件)

 将SysTick_Handler保留作为ucos系统的滴答时钟,那么就把OS_CPU_SysTickHandler内数据复制到系统滴答时钟中

void SysTick_Handler(void)
{
OS_CPU_SR cpu_sr;  OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */
 OSIntEnter();
 OS_EXIT_CRITICAL();
OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */
  OSIntExit(); /* Tell uC/OS-II that we are leaving the ISR */
}

4.main.c(启动系统,新建任务)

  maic.c主要处理系统启动和任务创建相关功能

static  void      App_TaskStart(void        *p_arg);
static OS_STK  App_TaskStartStk[APP_TASK_START_STK_SIZE]; static void Task1(void *p_arg);
static OS_STK Task1Stk[APP_TASK_START_STK_SIZE]; int main(void)
{
/*屏蔽所有中断*/
IntDisAll(); /*初始化uC/OS-II系统*/
OSInit(); /*创建任务App_TaskStart,堆栈512,优先级9*/
OSTaskCreate(App_TaskStart,
(void *),
&App_TaskStartStk[APP_TASK_START_STK_SIZE - ],
APP_TASK_START_PRIO); /*节拍计数器清零*/
OSTimeSet(); /*u/OS-II启动*/
OSStart(); return ;
} static void App_TaskStart(void *p_arg)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = ;
#endif  /*外设相关初始化*/
BSP_Init(); /*systick时钟初始化*/
SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC); /*进入临界区*/
OS_ENTER_CRITICAL(); /*创建任务App_TaskStart,堆栈512,优先级9*/
OSTaskCreate(Task1,
(void *),
&Task1Stk[APP_TASK_START_STK_SIZE - ],
); /*离开临界区*/
OS_EXIT_CRITICAL(); while()
{
/*系统运行状态确认*/
GPIO_ResetBits(GPIO_LED, GPIO_LED_1);
OSTimeDlyHMSM(, , , );
GPIO_SetBits(GPIO_LED, GPIO_LED_1);
OSTimeDlyHMSM(, , , );
}
} static void Task1(void *p_arg)
{
while()
{
/*系统运行状态确认*/
GPIO_ResetBits(GPIO_LED, GPIO_LED_2);
OSTimeDlyHMSM(, , , );
GPIO_SetBits(GPIO_LED, GPIO_LED_2);
OSTimeDlyHMSM(, , , );
}
}

  将编译完成的文件下载到开发板中,就可以看到两个LED以不同的频率闪烁,从而证明工程模板建立成功。

  os_cpu_a.asm文件链接:os_cpu_a.asm文件

  ucos-ii移植范例链接:ucos-ii工程模板

MDK技巧:

  一般情况下,将网络/文本上代码复制到MDK中,或者将MDK代码复制到网页/文本中,如果注释为中文,则往往会变成乱码,这里说明解决办法:

  选择左上角Edit->最后项Configuration->Editor下的Encoding项选择为Chinese GB2312(Slimplified),之后再进行复制即可,如果不习惯这种字体,复制完毕后在改为ANSI,此时不会出现乱码。如图:

  

简单RTOS学习(一) uc/os-II 工程模板建立的更多相关文章

  1. 【原创】uC/OS II 任务切换原理

    今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...

  2. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  3. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  4. uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()

    1. OSTaskCreate()    OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务.注意,ISR中禁止建立任务,一个任务必须为无限循环结构.    ...

  5. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  6. 关于uC/OS的简单学习(转)

    1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...

  7. uC/OS 的任务调度解析 (转)

    uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...

  8. Linux之RTOS学习

    Linux之RTOS学习 RTOS: Real time operating system 系统选型 可选方案 RTLinux - FSMLabs, WindRiver Systems - http: ...

  9. 在STM32F401上移植uC/OS的一个小问题 [原创]

    STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...

随机推荐

  1. ACM题目————STL练习之 懒省事的小明(优先队列)

    描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.小明决定把所有的果子合成一堆. 因为小明比较懒,为了省力气,小明开始想点子了: 每一 ...

  2. vs2013的asp.net 管理

    iisexpress.exe /path:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ASP.NETWebAdminFiles /vpath:/AS ...

  3. HTML学习之canves元素

    1:绘制画布 和在画布上绘制矩形 <!DOCTYPE html> <html> <head lang="en"> <meta charse ...

  4. Unity中实现List类型的自定义GUI(ReorderableList)

    感谢韩同学提供的资源 Unity本身提供了float,int,vector3..等类型字段的gui接口,而对于集合类型一般要自己硬写. 官方提供了一个List的自定义GUI,但使用起来非常复杂 Uni ...

  5. [转]Unity: make your lists functional with ReorderableList

    原文地址:http://va.lent.in/unity-make-your-lists-functional-with-reorderablelist/ This article is reprod ...

  6. JAVA基础知识之JVM-——URLClassLoader

    URLClassLoader是ClassLoader的一个实现类,它既能从本地加载二进制文件类,也可以从远程加载类. 它有两个构造函数, 即 URLClassLoader(URL[] urls),使用 ...

  7. TCP三次握手

      TCP协议下,客户的和服务器的连接过程称为“三次握手”   第一次握手:建立连接时,客户的发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认. 第二次握手:服务器收到SYN包,必须确 ...

  8. nginx配置SSL证书(使用startSSL申请到的免费证书)

    1. 在startSSL注册申请免费证书,此处不赘述,参考 http://www.freehao123.com/startssl-ssl/ 申请过程中会生成Private Key,将Private K ...

  9. 安装Docker和下载images镜像和常用Docker命令

    我的是centos7,也会6的方法: $sudo yum install docker 直接yum安装contos7使用centos6.5先获取epel源并 启动Docker,并注册开机服务 [roo ...

  10. java提高篇---HashMap

    HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...