STM32-F0/F1/F2
A、ST公司提供:STM32F10x开发标准库V3.5
B、实验平台:战舰开发板V2.1
C、编译软件:MDK3.8
D、编辑软件:Source Insight_V3.5
E、RTOS:ucosii_V2.92
F、实验现象设计:红灯亮灭各800ms,绿色灯亮灭各300ms
一、获取源码
这个可以百度下载,我们论坛也是有很多的源码工程的,官网可以在这里下载http://micrium.com/downloadcenter/micrium-source-code/
我移植的是2.92版本
二、获取ucosii源码文件
解压下载下来的压缩包,看到如下的文件目录结构
红色框框就是ucosii源码文件夹了,双击打开
双击红色框框的文件夹进去,看到里面的内容,有没小兴奋一下下呢???
没错,这里就是ucosii源码的所在地了
A、在《Ports》文件夹里面的就是ucos与CPU打交道的代码了“看文件夹英文名字就知道了”
B、在《Source》文件夹里面的就是ucos的核心代码了
C、至于os_cfg.h这个文件是干啥的,双击打开一看开头的说明,哦。。。原来是裁剪用的,呵呵,比如打开什么功能,关闭什么功能用的等等,具体请看后面的注释
三、新建测试工程
这里新建立一个工程,比如ucosii什么的(自己建立好就行),我就在工程里面建立了三个文件夹来存放ucosii的代码。根据自己的喜好建立就好,呵呵
1、将上面提到的《Source》文件夹里面的文件拷贝到《CORE》文件夹里面,这里面的文件是ucos的核心代码,不用修改。
2、将上面提到的《Ports》文件夹里面的文件拷贝到《PORTS》文件夹里面,这里就是移植的核心部分了
3、返回上一级文件夹,将“os_cfg.h”这个文件拷贝到《CONFIG》这个文件夹里面,这里还要添加一个文件,这个文件不在《uCOS-II》这个文件夹里面,具体在哪里呢???
在这里“...\ucos\App\”这个路径下,看到没“includes.h”这个文件,拷贝到《CONFIG》这个文件夹里面。
4、在MDK(当然喜欢用其他编辑器的同志也是可以的)添加文件,如下图所示,具体视个人喜好建立目录结构了,我建立了《UCOSII_CORE》、《UCOSII_PORTS》、《UCOSII_CONFIG》这三个文件夹存放ucos的相关代码。


四、修改代码
1、地球人都知道的,人有心跳,操作系统也不例外,双击打开“os_cfg.h”这个文件,找到“OS_TICKS_PER_SEC”这个宏定义,原文的是1000即1秒钟了(看后面的注释),这里我将它改为200也就是5ms的节拍,至于这个5ms怎么得来的,根据代码算一下就出来了
2、找到“OS_MAX_TASKS”这个宏定义,看这个名字就知道干啥的吧,没错,就是最大的任务数,这里我定义为5即最多5个任务,具体数量自己掂量
3、这里我们关闭一部分ucos的功能,例如OS_DEBUG_EN、OS_EVENT_MULTI_EN、OS_EVENT_NAME_EN等等,具体的功能请看定义后面的注释或者本工程代码。
4、前面说到了操作系统的心跳,这里可以用多种方式提供,在CM3里面有个嘀嗒定时器,这个家伙就可以提供了,所以这里我们用它来做操作系统的心跳。修改本工程sys.h中的宏定义_SYSTEM_SUPPORT_ROTS将它的值改为1【如果用到原子哥的SYSTEM文件夹的话,直接将SYSTEM_SUPPORT_UCOS宏定义修改为1即可】。
5、打开“os_cpu_a.asm”文件,修改相关的汇编
A、首先看到的是前面的函数入口代码
修改成上图这个样子,呵呵
B、接着伪定义寄存器和相关的数值
具体寄存器地址和相关的数值可以参考《Cortex-M3权威指南(中文).pdf》第284~286页之间的内容
C、接着下面的改成下图样子
D、将文件拖到最后,那里的程序标好字符就要参考文件开头的定义进行改变了,具体参考代码
6、打开“os_cpu.h”文件,这里主要就是修改相关的数据类型的,视不同平台而修改,详细文件内容见工程。
7、打开“includes.h”这个文件,这里主要就是集合了需要的头文件,删除或者注释一些没用到的,增加里面没有但是需要用到的。详细见工程文件。
A、找到下图处,将其全部注释掉,或者删掉也行,因为这些库这里没用到,但是你的工程有用到的话就保留吧,V2.86之前的版本好像定义了这些文件
B、找到这里,将这个库头文件修改一下
五、main函数编辑
1、在main函数中增加以下内容,注意了,优先级的数值越大就越低,0是最高的优先级,就这样
/* 起始任务相关设置 */
//任务优先级
#define Start_Task_PRIO 10 //优先级最低
//任务堆栈大小
#define Start_STK_Size 64
//任务堆栈空间大小
OS_STK Start_Task_STK[Start_STK_Size];
//任务接口函数
void start_task(void *pdata);
/* LED0任务0 */
//任务优先级
#define LED0_Task_PRIO 7 //优先级最低
//任务堆栈大小
#define LED0_STK_Size 64
//任务堆栈空间大小
OS_STK LED0_Task_STK[LED0_STK_Size];
//任务接口函数
void LED0_task(void *pdata);
/* LED1任务1 */
//任务优先级
#define LED1_Task_PRIO 6 //优先级最低
//任务堆栈大小
#define LED1_STK_Size 64
//任务堆栈空间大小
OS_STK LED1_Task_STK[LED1_STK_Size];
//任务接口函数
void LED1_task(void *pdata);
上面的主要是设置任务的堆栈大小和中断的优先级了
2、创建任务
int main(void)
{
OS_Heart_Init(); //初始化ucos心跳
MY_NVIC_PriorityGroup_Config(NVIC_PriorityGroup_2); //初始化中断优先级
USART1_Init(9600);
LED_Init(); //初始化LED硬件接口
printf("\r\n system init OK! enter os...\r\n");
OSInit(); //初始化ucos
OSTaskCreate(start_task, (void *)0, (OS_STK *)&Start_Task_STK[Start_STK_Size-1], Start_Task_PRIO); //创建起始任务
OSStart(); //ucos启动
}
/******************************************************************************
* Function Name --> 开始任务
* Description --> none
* Input --> *pdata: 任务指针
* Output --> none
* Reaturn --> none
******************************************************************************/
void start_task(void * pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OS_ENTER_CRITICAL(); //进入临界区,无法被中断打断
printf("\r\n start task\r\n");
OSTaskCreate(LED0_task, (void *)0, (OS_STK *)&LED0_Task_STK[LED0_STK_Size-1], LED0_Task_PRIO);
OSTaskCreate(LED1_task, (void *)0, (OS_STK *)&LED1_Task_STK[LED1_STK_Size-1], LED1_Task_PRIO);
OSTaskSuspend(Start_Task_PRIO); //挂起起始任务
OS_EXIT_CRITICAL(); //退出临界区,可以被中断打断
}
/******************************************************************************
* Function Name --> 任务0
* Description --> none
* Input --> *pdata: 任务指针
* Output --> none
* Reaturn --> none
******************************************************************************/
void LED0_task(void * pdata)
{
while(1)
{
LED0 = 0;
delay_ms(800);
LED0 = 1;
delay_ms(800);
};
}
/******************************************************************************
* Function Name --> 任务1
* Description --> none
* Input --> *pdata: 任务指针
* Output --> none
* Reaturn --> none
******************************************************************************/
void LED1_task(void * pdata)
{
while(1)
{
LED1 = 0;
delay_ms(300);
LED1 = 1;
delay_ms(300);
};
}
六、编译改错
上面工作准备好之后,这时就编译改错即可。直到没有错误和警告,大功告成,哈哈。。。下载到板子上,看到两个灯在不停的闪烁了。一个闪的快一点,一个闪的慢一点
总结:
1、ucosii这个操作系统移植起来还是比较简单的,主要就是这个汇编文件的移植,对应不同的平台用相应平台的代码。
2、如果懒得修改什么的,上官网下载对应的测试工程也是可以的
3、可裁剪性,这个功能非常好,根据不同的任务和需求裁剪自己需要的即可
4、小小的献丑,高手莫见怪了
5、附件是战舰开发板的测试工程,希望能帮到新手
6、也欢迎各位高手、大神拍砖指导,大家学习学习,共同进步
STM32-F0/F1/F2的更多相关文章
- SSIS excel2003文件导入列名显示为F1,F2 - FN
问题现象: 数据源2003版本的EXCEL文件,第一列是空白,数据是从第二列开始的.所以SSIS中用EXCEL数据源倒入这个EXCEL时,所有的列显示不出来,显示的是F1,F2 - FN. 解决方法 ...
- Codeforces Round #544 (Div. 3) D F1 F2
题目链接:D. Zero Quantity Maximization #include <bits/stdc++.h> using namespace std; #define maxn ...
- 按键(ESC ,F1,F2等)——wpf的命令处理方法
WPF窗体的命令绑定 方法一:使用代码 <WpfUI:View.CommandBindings> <CommandBinding Command="Help" ...
- Codeforces 1077(F1+F2) DP 单调队列
题意:给你一个n个元素的数组,从中选取x个元素,并且要保证任意的m个位置中必须至少有一个元素被选中,问选中元素的和最大可以是多少? F1 n,m,x到200 F2 n,m,x到5000. 思路1:设d ...
- 联想THINKPAD E40的快捷键怎么关闭?哪些F1 F2 F3的键我需要用到 但是每次都按FN 太烦人了
1.开机时,按F1进入BIOS,依次选择CONFIG--Keyboard/Mouse,2.在Change to "f1-f12 keys"选项中,更改设置为Legacy或者Defa ...
- NSCharacterSet 使用说明
NSCharacterSet 和 NSMutableCharacterSet 用面向对象的方式来表示一组Unicode字符,它经常与NSString及NSScanner组合起来使用,在不同的字符上 ...
- 基于GPU的高分一号影像正射校正的设计与实现
一 RPC正射校正的原理 影像正射校正的方法有很多,主要包含两大类:一类是严格的几何纠正模型,另一类是近似几何纠正模型.当遥感影像的成像模型和有关参数已知时,可以根据严格的成像模型来校正图像,这种方法 ...
- 使用 Graphviz 画拓扑图
使用 Graphviz 画拓扑图 0)前述 本文着重讲一下 Graphviz 的风格控制,基础一些的就不在这里讲啦. graphviz 的主页是http://www.graphviz.org/. Gr ...
- Python2 基本数据结构源码解析
Python2 基本数据结构源码解析 Contents 0x00. Preface 0x01. PyObject 0x01. PyIntObject 0x02. PyFloatObject 0x04. ...
随机推荐
- 还原TexturePacker plist 文件以及图片的方法 (切开各小图片)
原地址:http://blog.csdn.net/linuxchen/article/details/16865645 Python 脚本:(来自网络) unpack_plist.py 命令行: py ...
- Css 单图片按钮实例(css 图片变换)
1.场景描述,根据鼠标的移动,动态的切换按钮图片. 2.方法1,准备两张120*41的图片,一张正常状态图片,一张按下效果图片.在鼠标放在的按钮上设置按下图片,移开又恢复到正常状态图片.缺点:在网页上 ...
- 常见的NoSql系统使用场景分析--转载
•Cassandra •特性:分布式与复制的权衡\根据列和键范围进行查询\BigTable类似的功能:列,列族\写比读快很多 •最佳适用:写操作较多,读比较少的时候.如果你的系统都是基于Java的时候 ...
- HDU 4034 Graph(floyd,最短路,简单)
题目 一道简单的倒着的floyd. 具体可看代码,代码可简化,你有兴趣可以简化一下,就是把那个Dijsktra所实现的功能放到倒着的floyd里面去. #include<stdio.h> ...
- String Reduction
问题出自这里 问题描述: Given a string consisting of a,b and c's, we can perform the following operation: Take ...
- **Apache Options指令详解
http://www.365mini.com/page/apache-options-directive.htm Options指令是Apache配置文件中一个比较常见也比较重要的指令,Options ...
- ExtJs布局之viewport
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- asp.net中Literal与label的区别
Literal 控件表示用于向页面添加内容的几个选项之一.对于静态内容,无需使用容器,可以将标记作为 HTML 直接添加到页面中.但是,如果要动态添加内容,则必须将内容添加到容器中.典型的容器有 La ...
- http://blog.sina.com.cn/s/blog_5b9b4abe01017638.html
http://blog.sina.com.cn/s/blog_5b9b4abe01017638.html
- 华为上机:求2的N次幂的值
求2的N次幂的值 描述: 求2的N次幂的值(N最大不超过31,用位运算计算,结果以十六进制进行显示). 运行时间限制: 无限制 内存限制: 无限制 输入: 数字N 输出: 2的N次方(16进制,需要按 ...