uCOS-II的移植

摘要:
首先,我们对uCOS II有了大致的了解,然后我们将执行移植uCOS II:1开发板的总体思路。首先在开发环境中构建一个空项目。2.添加ucos2的核心代码。编译并解决错误和警告。4.下载并运行,并稍微修改代码以查看效果。5.添加和调试项目所需的BSP,并编写和调试项目的应用程序部分,用于移植、问题和解决方案。首先,我们按照以下步骤操作:取出带有之前建立的编号的标准库模板。这是ucos文件。我们将APP、BSP、uC CPU、uC LIB和uCOS II复制到标准库文件中。

先对uCOS-II有了个整体了解

我们就对uCOS-II进行移植开发板

移植的一般思路:

  1.先建立开发环境上的空工程(模板工程更好)

  2.添加ucos2的核心代码进去

  3.编译,解决报错和警告

  4.下载运行,并小幅修改代码查看效果

  5.添加并调试项目需要的BSP,编写并调试项目app部分

进行移植、遇到问题与解决

首先,我们按照步骤,将之前建立号的标准库模板拿出使用。标准库的模板可查看之前文章。

uCOS-II的移植第1张

 我们把uCOS代码附近进这里目录。这是ucos文件

uCOS-II的移植第2张

 我们把APP、BSP、uC-CPU、uC-LIB、uCOS-II复制进标准库文件中。usart是串口,我们可以直接把里面的文件直接复制进BSP文件中。

uCOS-II的移植第3张

 之后用keil打开工程:并一一添加里工程中,添加头文件包含。

开始编译就可以了。

编译后会出现三个错误:

1.我们把:stmf10x_LIB.h、stmf10x_map.h、stm32——Reg.h直接注释掉就可以了。这些是keil4中存在的文件,在keil5中直接写进stm32f10x.h里了

2.还有会报关于usart的错误:因为我们直接把com.c放bsp中了,只需要把包含头文件的绝对路径更改下就可以了

3.还有main.o重复包含:这是因为app文件中也有也好的main.c文件,user中也有我们自己写的main.c,我们只需要把user文件的其他文件复制到app中就可以了

........在编译

会出现4个定义变量未使用的警告...可以忽略

还有一个警告:..Objectsled.axf: Warning: L6305W: Image does not have an entry point. (Not specified or not set due to multiple choices.)....分析百度就会给出答案:在Options for Target选项的Linker下的Misc controls 处加入入口地址:--entry Reset_Handler。如图:

uCOS-II的移植第4张

 再编译,就可以了.....

Load进32之后,接收串口数据,只打印了一遍环境...没有调度任务...

这是因为我们之前修改了ucos中的启动文件...我们用的是startup_stm32f10x_hd.s启动文件...

其实就是SysTick_Handler没有打开....根据app.c中的main.c,之前的初始化都是关闭中断的,所以要在PendSV_Handler中开启中断...

所以讲PendSV_Handler打开,SysTick_Handler...就是节拍器...节拍器开了,系统就可以进行调度了...

所以当进入复位后:

PendSV_Handler、SysTick_Handler会调度这2个函数.....

这2个函数是在stm32f10x_it.c中实现,而我们发现,在这个stm32f10x_it.c文件中,根本没有实现此函数.

uCOS-II的移植第5张

 没有实现....所以我们要找到ucos中是如何实现这2个函数的.....

实现PendSV_Handler:在文件UCOS-II中OS_CPU_A.ASM文件

PendSV_Handler替换OS_CPU_PendSVHandler...

声明也需要替换--

EXPORT PendSV_Handler
;EXPORT OS_CPU_PendSVHandler

uCOS-II的移植第6张

 实现:SysTick_Handler:在UCOS-II中OS_CPU_C.C的文件

void SysTick_Handler(void)替换//void  OS_CPU_SysTickHandler (void)

uCOS-II的移植第7张

之后就可以进行系统调用,正是移植了ucos-ii....在我们的f103中.......

可以阅读main函数进行bsp的适配了..

一些函数解析:

任务得创建:....创建之后就会把App_TaskStart任务就会就绪态..系统就会调度..

os_err = OSTaskCreate((void (*) (void *)) App_TaskStart,
                /* Create the start task. */
                (void *) 0,
                (OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],
                (INT8U) APP_TASK_START_PRIO);

//(void (*) (void *)) App_TaskStart:这是一个函数指针,App_TaskStart是一个指针,指向一个函数...就是我们在调用App_TaskStart函数

                //void (*pFun)(void*);这样就定义了一个函数指针pFun,

//我们可以跟进OSTaskCreate函数来参考下,我们需要传进来的函数....

//typedef  unsigned int    OS_STK;                   /* Each stack entry is 32-bit wide   OS_STK是无符号的整型类型

//(OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],  强制转换成(OS_STK *)类型........指针数组..App_TaskStartStk数组装的是(OS_STK *)

//App_TaskStartStk是OS_STK类型的数组...............定义是static  OS_STK   App_TaskStartStk[APP_TASK_START_STK_SIZE];

//APP_TASK_START_STK_SIZE定义了数组的大小....#define  APP_TASK_START_STK_SIZE    128  之前为我们定了128

//(INT8U) APP_TASK_START_PRIO 优先级设定,根据任务来...

 任务开始任务函数:static  void App_TaskStart(void* p_arg){.............................}

官方给我们的介绍:

                      App_TaskStart()
*
* Description : The startup task. The uC/OS-II ticker should only be initialize once multitasking starts.

* Caller   : This is a task.

这就是一个任务开始的地方......我们可以在这里按照格式创建其他任务.....

这里有一个注意的地方就是,在这个函数结尾处要进行delay处理,因为系统会循环调度的,以免系统跑飞,我们会在结尾处加一个while(1){};

但是这样会浪费资源,所以我们在while(1)中加上delay:while(1){OSTimeDlyHMSM(0, 0, 10, 000);}交出就绪态就好了....

例如:在其中创建LED任务:

//App_TaskCreate();
OSTaskCreate((void (*) (void *)) App_TaskUser1,
            /* Create the start task. */
            (void *) 0,
            (OS_STK *) &App_TaskLEDStk[APP_TASK_LED_STK_SIZE - 1],
            (INT8U) APP_TASK_LED_PRIO);

实现了串口,我们的移植基本就算完成了....

在移植后就是项目的调试了,里面也是有很多的内容的,我们可以慢慢调试,慢慢学习吧

这里需要说明下的是

其实我们要直接用ucos给我们的其实文件是不需要这么改的,修改的会相对容易些,但基本原理都是一样的....

最重要的就是C语言了.........

免责声明:文章转载自《uCOS-II的移植》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu 启动项、菜单 改动 防止隐藏IE浏览器没有加载CSS或js文件的秘密及解决办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android Handler与多线程

本文首先解释一下handler是用来干嘛的,然后通过例子介绍其在多线程中的应用。 什么是Handler      handler通俗一点讲就是用来在各个进程之间发送数据的处理对象。在任何进程中,只要获得了另一个进程的handler则可以通过 handler.sendMessage(message)方法向那个进程发送数据。基于这个机制,我们在处理多线程的时...

nginx upstream模块

upstream模块 upstream模块 (100%) nginx模块一般被分成三大类:handler、filter和upstream。前面的章节中,读者已经了解了handler、filter。 利用这两类模块,可以使nginx轻松完成任何单机工作。而本章介绍的upstream,将使nginx将跨越单机的限制,完成网络数据的接收、处理和转 发。 数据转...

002输入子系统驱动

输入子系统概念介绍(第十三课/第一节) 回顾第三个驱动程序(中断方式的按键驱动程序)和测试程序,发现有一些缺点:这个驱动程序没办法用在别人写的现成的应用程序上(比如:QT),因为别人写的应用程序肯定不会来打开你这个"/dev/third_chrdev"。别人打开的是一些现成的设备(比如:/dev/tty),甚至别人都不打开设备,而是直接调用 scanf()...

reactor设计模式

reactor设计模式,是一种基于事件驱动的设计模式。 《Pattern-Oriented Software Architecture, Volume 2》 对这个模式做了详细的讲解。 这个模式的结构图如下: 图中的handle对应的是操作系统提供的句柄,例如I/O句柄,Event_Handler类持有这些句柄, reactor类内部提供一个事件循环:h...

hadoop26----netty,多个handler

k客户端: package cn.itcast_03_netty.sendorder.client; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; im...

异常(2) --- 编译器对于SEH异常的拓展

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 异常(2) --- 编译器对于SEH异常的拓展 在 异常(1)中,我们介绍了用户模拟异常与CPU异常的收集,以及内核层与用户层异常的处理,其中介绍过SEH异常。 我们之前只提到过编译器拓展SEH异常的,但是由于篇幅有限,并没...