找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1902|回复: 1
打印 上一主题 下一主题
收起左侧

ucos操作系统的STM32移植

[复制链接]
跳转到指定楼层
楼主
ID:470360 发表于 2019-3-1 20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验二、ucos操作系统的移植
一、实验目的
1、掌握ucos到STM32的移植方法;
2、熟悉通过C语音处理底层寄存器的技巧;
3、了解STM32在ucos任务切换时的处理;
4、规范编程格式。
二、实验内容
本次实验通过用C语言编写6个操作系统相关函数和用汇编语言编写4个与处理器相关的函数,将实时操作系统µC/OS-Ⅱ移植到芯片STM32F103ZE中,并创建两个用户任务点亮led。学会操作系统的移植方法,深入掌握嵌入式操作系统µC/OS-Ⅱ在初始化任务和任务调度的实现方法,直观了解实时操作系统的体系结构和设计思想。

三、预备知识
基本单片机硬件知识、单片机软件编程语言、程序创建和调试的基本方法、ucos操作系统的任务调度原理、STM32的寄存器架构。

四、实验设备及工具
硬件:STM32开发平台
软件:STM32官方库;PC机操作系统Windows 98、Windows 2000或Windows XP;KEIL MDK集成开发环境;串口转usb驱动。
五、实验步骤
1、按实验一的步骤新建一个工程Proj2_ucos。
2、将移植好的ucos源代码整个拷贝到我们的新建的工程目录中,然后按对应的文件路径添加到keil工程里(os_dbg.c和os_dbg_r.c只添加一个),如图6和图7。


图6                                                   图7

3、配置工程相关属性(与实验一库应用配置一样),记得将ucos的头文件路径添加到工程的include path上面去,找到stm2f10x_it.c的PendSV_Handler函数注释掉,main文件中将includes.h包含进来,主函数为空,编译通过。
4、在main.c中建立sys_init()函数编写操作系统运行需要的硬件相关初始化(见代码),然后修改stm32f10x_it.c中的系统心跳中断函数并加入头文件includes.h(见代码,)。

        
/*********************************************************************
   
* 函数名称:sys_init
   
* 函数功能:嵌套向量中断优先级分组,时钟心跳定时初始化1/200 s
   
* 参数: 无
   
*********************************************************************/
   
void    sys_init()
   
{
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
   
    SysTick_Config(SystemCoreClock/200);
   
}
   
   
         
        
/**
   
  * @brief     This function handles SysTick Handler.
   
  * @param     None
   
  * @retval None
   
  */
   
void    SysTick_Handler(void)
   
{
   
    OSIntEnter();
   
    OSTimeTick();
   
    OSIntExit();   
   
}


5、编写用户任务函数和相关的初始化。

        
/*****************************************************
   
* 函数名称: led_init
   
* 函数功能: 初始化LED
   
* 参    数:
   
* 其    他:
   
********************************************************/
   
void    led_init()
   
{
   
    GPIO_InitTypeDef gpin_init_struct;
   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,    ENABLE);
   
    gpin_init_struct.GPIO_Pin = GPIO_Pin_5;
   
    gpin_init_struct.GPIO_Speed =    GPIO_Speed_2MHz;
   
    gpin_init_struct.GPIO_Mode =    GPIO_Mode_Out_PP;
   
    GPIO_Init(GPIOB, &gpin_init_struct);                //B口led1
   
    GPIO_Init(GPIOE, &gpin_init_struct);                //E口led2
   
}
   
   
         
        
/*****************************************************
   
* 函数名称: my_task
   
* 函数功能: 用户任务   
   
* 参    数:
   
* 其    他:
   
********************************************************/
   
void    my_task()
   
{
   
    sys_init();
   
    led_init();
   
    OSStatInit();
   
    while(1)
   
    {
   
        LED1_ON;
   
        LED2_OFF;
   
        OSTimeDly(50);
   
        LED1_OFF;
   
        LED2_ON;
   
        OSTimeDly(100);
   
    }
   
}
   


6、最后在主函数中创建任务并启动操作系统。编译并调试运行。

        
#include    "stm32f10x.h"
   
#include    "includes.h"
   
   
#define    LED2_ON     GPIO_ResetBits(GPIOB,    GPIO_Pin_5)
   
#define    LED2_OFF    GPIO_SetBits(GPIOB,    GPIO_Pin_5)
   
#define    LED1_ON     GPIO_ResetBits(GPIOE,    GPIO_Pin_5)
   
#define    LED1_OFF    GPIO_SetBits(GPIOE,    GPIO_Pin_5)
   
   
OS_STK    task_stk[128];
   
void    my_task(void);
   
void    led_init(void);
   
void    sys_init(void);
   
int main()
   
{
   
    OSInit();
   
    OSTaskCreate(my_task, (void *)0, (OS_STK    *)&task_stk[127], 10);
   
    OSStart();
   
    while(1);
   
}
   
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:675926 发表于 2019-12-28 11:33 | 只看该作者
你好,谢问有无完整的项目源码?谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表