0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32入门学习笔记之uCOS-II系统移植4

jf_78858299 来源:滑小稽笔记 作者:电子威廉希尔官方网站 园地 2023-02-16 16:13 次阅读

首先要做根据UCOSII中定义的OS_TICKS_PER_SEC来计算出SysTick的装载值reload,开启SysTick中断,将reload值写进SysTick的LOAD寄存器中,最后开启SysTick,开启SysTick后还要编写其中断服务函数。

③微秒级别延时函数

void delay_us( u16 nus )
{
#if SYSTEM_SUPPORT_OS
  u32 ticks, told, tnow, tcnt=0 ;
  u32 reload = SysTick->LOAD ;                  //LOAD的值
  ticks = nus*fac_us ;                                        //需要的节拍数
  OSSchedLock() ;                        //禁止调度,防止打断us延时
  told = SysTick->VAL ;                                        //刚进入时的计数器值
  while( 1 )
  {
    tnow = SysTick->VAL ;
    if( tnow!=told )
    {
      //这里注意一下SYSTICK是一个递减的计数器
      if( tnowelse
        tcnt += reload-tnow+told ;
      told = tnow ;
      //时间超过/等于要延迟的时间,则退出
      if( tcnt>=ticks )
        break ;
    }
  }
  OSSchedUnlock() ;                        //UCOSII的方式,恢复调度
#else
  u32 temp ;
  SysTick->LOAD = nus*fac_us ;                  //时间加载
  SysTick->VAL = 0x00 ;                      //清空计数器
  SysTick->CTRL = 0x01 ;                    //开始倒数
  do
  {
    temp = SysTick->CTRL ;
  }while( ( temp&0x01 )&&!( temp&( 1<<16 ) ) ) ;          //等待时间到达
  SysTick->CTRL = 0x00 ;                    //关闭计数器
  SysTick->VAL = 0x00 ;                      //清空计数器
#endif
}

④毫秒级别延时函数

void delay_ms( u16 nms )
{
#if SYSTEM_SUPPORT_OS
  //如果OS已经在跑了,并且不是在中断里面(中断里面不能任务调度)
  if( ( delay_osrunning==1 )&&( delay_osintnesting==0 ) )
  {
    //延时的时间大于OS的最少时间周期
    if( nms>=fac_ms )
      OSTimeDly( nms/fac_ms ) ;                //UCOSII延时
    nms %= fac_ms ;                      //延时太短,采用普通方式延时
  }
  delay_us( ( u32 )( nms*1000 ) ) ;                  //普通方式延时
#else
  u32 temp ;
  SysTick->LOAD = ( u32 )nms*fac_ms ;              //时间加载(SysTick->LOAD为24bit)
  SysTick->VAL = 0x00 ;                      //清空计数器
  SysTick->CTRL = 0x01 ;                    //开始倒数
  do
  {
    temp = SysTick->CTRL ;
  }while( ( temp&0x01 )&&!( temp&( 1<<16 ) ) ) ;          //等待时间到达
  SysTick->CTRL = 0x00 ;                    //关闭计数器
  SysTick->VAL = 0x00 ;                      //清空计数器
#endif
}

(5)usart1.c文件修改

①添加头文件定义

#if SYSTEM_SUPPORT_OS

#include "includes.h"

#endif

②修改串口中断服务函数

void USART1_IRQHandler()
{
#if SYSTEM_SUPPORT_OS
  OSIntEnter() ;
#endif
  //接收到数据
  if( USART1->SR&( 1<<5 ) )
  {
    if( USART1->DR=='\\n' )
    {
      USART1_Data.Len = USART1_Rx_Count ;
      USART1_Rx_Count = 0 ;
      USART1_Data.State = 1 ;
    }
    USART1_Data.Buffer[ USART1_Rx_Count ] = USART1->DR ;
    USART1_Rx_Count ++ ;
  }
#if SYSTEM_SUPPORT_OS
  OSIntExit() ;
#endif
}

23.3 实验例程

例程:利用移植完成的ucos-ii系统新建两个任务,并且在两个任务中打印自定义的任务名称。

#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "includes.h"
/****************************************************
Name    :Task01
Function  :任务1
Paramater  :None
Return    :None
****************************************************/
#define TASK01_PRIO  7                                          //设置任务优先级
#define TASK01_SIZE  64                                          //设置任务堆栈大小
OS_STK TASK01_STK[ TASK01_SIZE ] ;                                    //任务堆栈
void Task01( void *pdata )
{
  while( 1 )
  {
    printf( "Task1 Run\\r\\n" ) ;
    delay_ms( 1000 ) ;
  }
}
/****************************************************
Name    :Task02
Function  :任务2
Paramater  :None
Return    :None
****************************************************/
#define TASK02_PRIO  6                                          //设置任务优先级
#define TASK02_SIZE  64                                          //设置任务堆栈大小
OS_STK TASK02_STK[ TASK02_SIZE ] ;                                    //任务堆栈
void Task02( void *pdata )
{
  while( 1 )
  {
    printf( "Task2 Run\\r\\n" ) ;
    delay_ms( 2000 ) ;
  }
}
/****************************************************
Name    :Start
Function  :开始任务
Paramater  :None
Return    :None
****************************************************/
#define START_PRIO  10                                          //开始任务的优先级设置为最低
#define START_SIZE  64                                          //设置任务堆栈大小
OS_STK START_STK[ START_SIZE ] ;                                    //任务堆栈
void Start( void *pdata )
{
    OS_CPU_SR cpu_sr=0 ;
  pdata = pdata ;
    OS_ENTER_CRITICAL() ;                                        //进入临界区(无法被中断打断)
   OSTaskCreate( Task01, ( void * )0, ( OS_STK* )&TASK01_STK[ TASK01_SIZE-1 ], TASK01_PRIO ) ;
   OSTaskCreate( Task02, ( void * )0, ( OS_STK* )&TASK02_STK[ TASK02_SIZE-1 ], TASK02_PRIO ) ;
  OSTaskSuspend( START_PRIO ) ;                                    //挂起起始任务
  OS_EXIT_CRITICAL() ;                                        //退出临界区(可以被中断打断)
}
/****************************************************
Name    :Main
Function  :主函数
Paramater  :None
Return    :None
****************************************************/
int main()
{
   STM32_Clock_Init( 9 ) ;                                        //系统时钟设置
  SysTick_Init( 72 ) ;                                        //延时初始化
  USART1_Init( 72, 115200 ) ;                                      //串口初始化为115200
  OSInit() ;
   OSTaskCreate( Start, ( void * )0, ( OS_STK * )&START_STK[ START_SIZE-1 ], START_PRIO ) ;      //创建起始任务
  OSStart() ;
   while( 1 ) ;
}

将程序下载进单片机,打开串口助手可以看到以下的效果。

图片

通过时间可以看出,Task2的任务2s打印一次数据,Task1的任务1s打印一次数据,和我们程序所写一致,所以说明UCOS-II系统移植成功。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6036

    文章

    44556

    浏览量

    634980
  • 操作系统
    +关注

    关注

    37

    文章

    6818

    浏览量

    123319
  • uCOS-Ⅱ
    +关注

    关注

    0

    文章

    9

    浏览量

    8585
收藏 人收藏

    评论

    相关推荐

    快速实现STM32移植ucos-ii

    快速实现STM32移植ucos-ii,欢迎大家一起学习[groupid=618]单片机项目开发设计群[/groupid]
    发表于 08-08 16:28

    UCOS-II系统移植问题

    这几天刚刚开始学习UCOS-II系统移植,我用的是野火开发板。资料上说是对startup_stm32f10x_hd.s 文件进行修改,但是我
    发表于 09-12 12:27

    uCOS-II理解和学习路线

    最近为啦准备嵌入式比赛,重拾stm32学习。再次学习也算基本掌握查看调用STM32固件库v3.5啦,觉得这才算入门
    发表于 08-23 09:15

    掌握移植uCOS-II的规范方法

    本文的目的是希望读者能够通过本文的内容掌握移植uCOS-II 的规范方法。如果只是需要移植文件,可以直接去Micriμm的官网上下载。移植uCOS-
    发表于 08-23 08:50

    ucOS-II入门经典教程

    ucOS-II入门经典教程,ucOS-II入门经典教程
    发表于 11-06 10:07 0次下载

    盘古STM32F103开发板移植uCOS-II详细说明

    盘古STM32F103开发板移植uCOS-II详细说明
    发表于 03-02 17:29 13次下载

    STM32平台移植uCOS-II详细说明-2012.11.13

    STM32平台移植uCOS-II详细说明-2012.11.13
    发表于 03-04 15:31 12次下载

    ucos-ii中文书籍

    ucos-ii中文书(邵贝贝).rar 入门经典书籍
    发表于 03-11 11:02 6次下载

    ucOS-II入门经典教程

    ucOS-II入门经典教程,感兴趣可以看看。
    发表于 07-25 18:52 47次下载

    uCOS-ii中文书

    学习uCOS-ii的最好中文教材,uCOS-ii中文书(邵贝贝)
    发表于 08-24 18:31 0次下载

    uCOS-II原理1

    原理uCOS-II
    发表于 12-20 22:58 5次下载

    uCOS-II原理2

    uCOS-II原理2
    发表于 12-20 22:53 0次下载

    uCOS-II原理3

    uCOS-II原理3
    发表于 12-20 22:52 0次下载

    uCOS-II在MSP430移植

    uCOS-II在MSP430移植
    发表于 10-12 17:24 9次下载
    <b class='flag-5'>uCOS-II</b>在MSP430<b class='flag-5'>移植</b>

    手把手盘古STM32开发板移植uCOS-II教程

    手把手盘古STM32开发板移植uCOS-II教程
    发表于 10-16 09:38 22次下载