打印
[STM32F4]

【Nucleo设计分享】简易示波器设计之UCOS-III移植

[复制链接]
1948|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fjjjnk1234|  楼主 | 2015-2-12 14:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 fjjjnk1234 于 2015-2-12 15:54 编辑

最近移植了一下UCOS-III,准确来说,是从安富莱的例程中修改过来的,目前测试了单任务创建和多任务的调度。其它信号量,邮箱······暂时没测试。安富莱的例程中固件库用的是1.3版本的,1.3版本的固件库system_stm32f4xx.c文件中,没有针对STM32F411的时钟配置,所以,主要修改文件中针对STM32F40_41xxx的时钟配置,修改的地方如下:
252行:
/************************* PLL Parameters *************************************/
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      16                                       //modify by fjjjnk1234       default:25
/* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
#define PLL_Q      7

#if defined (STM32F40_41xxx)
#define PLL_N      400                                    //modify by fjjjnk1234        default:336
/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      4                                        //modify by fjjjnk1234        default:2
#endif /* STM32F40_41xxx */

290行开始:
/** @addtogroup STM32F4xx_System_Private_Variables
  * @{
  */

#if defined (STM32F40_41xxx)
  uint32_t SystemCoreClock = 100000000;               //modify by fjjjnk1234 default:168000000
#endif /* STM32F40_41xxx */

505行:
#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)      
    /* PCLK2 = HCLK / 2*/
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;                      //modify by fjjjnk1234        default:...DIV2
   
    /* PCLK1 = HCLK / 4*/
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;                     //modify by fjjjnk1234         default:...DIV4
#endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx */

521行:
/* Configure the main PLL */
    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                   (RCC_PLLCFGR_PLLSRC_HSI) | (PLL_Q << 24);                //modify by fjjjnk1234         default:RCC_PLLCFGR_PLLSRC_HSE

单任务创建测试程序:
#include  <includes.h>



/*
*********************************************************************************************************
*                                       LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/
                                                               
static  OS_TCB        LED_TCB;                     //定义任务控制块
static        CPU_STK        LED_Stk[128];           //定义任务堆栈


/*
*********************************************************************************************************
*                                         FUNCTION PROTOTYPES
*********************************************************************************************************
*/
static void Task_LED(void *p_arg);

/*
*********************************************************************************************************
*        函 数 名: main
*        功能说明: 标准c程序入口。
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
int main(void)
{
    OS_ERR  err;

//    BSP_IntDisAll();           /* Disable all interrupts.                              */
        
        bsp_Init();
        CPU_Init();
        BSP_Tick_Init();
   
    OSInit(&err);                                               /* Init uC/OS-III.                                      */


        /*创建任务*/
        OSTaskCreate((OS_TCB     *)&LED_TCB,                    // 任务控制块指针         
               (CPU_CHAR   *)"LED",                                    // 任务名称
               (OS_TASK_PTR )Task_LED,                           // 任务代码指针
               (void       *)0,                                              // 传递给任务的参数parg
               (OS_PRIO     )2,                                              // 任务优先级
               (CPU_STK    *)&LED_Stk[0],                        // 任务堆栈基地址
               (CPU_STK_SIZE)12,                                            // 堆栈剩余警戒线
               (CPU_STK_SIZE)128,                                            // 堆栈大小
               (OS_MSG_QTY  )0,                                              // 可接收的最大消息队列数
               (OS_TICK     )0,                                              // 时间片轮转时间
               (void       *)0,                                              // 任务控制块扩展信息
               (OS_OPT      )(OS_OPT_TASK_STK_CHK |
                              OS_OPT_TASK_STK_CLR),              // 任务选项
               (OS_ERR     *)&err);                                    // 返回值

    OSStart(&err);                                              /* Start multitasking (i.e. give control to uC/OS-III). */
   
    (void)&err;
   
    return (0);
}

void Task_LED(void *p_arg)
{
        OS_ERR err;
  (void)p_arg;                                // 'p_arg' 并没有用到,防止编译器提示警告

  while (1)
  {
      GPIO_SetBits(GPIOA, GPIO_Pin_5);
      OSTimeDlyHMSM(0, 0,0,500,OS_OPT_TIME_HMSM_STRICT,&err);
      GPIO_ResetBits(GPIOA, GPIO_Pin_5);
      
      GPIO_SetBits(GPIOA, GPIO_Pin_6);
      OSTimeDlyHMSM(0, 0,0,500,OS_OPT_TIME_HMSM_STRICT,&err);
      GPIO_ResetBits(GPIOA, GPIO_Pin_6);
      
      GPIO_SetBits(GPIOA, GPIO_Pin_7);
      OSTimeDlyHMSM(0, 0,0,500,OS_OPT_TIME_HMSM_STRICT,&err);
      GPIO_ResetBits(GPIOA, GPIO_Pin_7);
  }
}
实验现象:
PA5、PA6、PA7引出的LED流水灯闪烁
完整程序:(单任务创建)
uCos-III Template.rar (1.34 MB)

多任务:
#include  <includes.h>

/*******************设置任务优先级*******************/
#define STARTUP_TASK_PRIO       3
#define        TASK_LED1_PRIO                            4          
#define        TASK_LED2_PRIO                            5
#define        TASK_LED3_PRIO                            6

/************设置栈大小(单位为 OS_STK )************/
#define STARTUP_TASK_STK_SIZE   80
#define        TASK_LED1_STK_SIZE                  80  
#define        TASK_LED2_STK_SIZE                  80
#define        TASK_LED3_STK_SIZE                  80

/*
*********************************************************************************************************
*                                       LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/
                                                               
static        OS_TCB        StartUp_TCB;                       
static  CPU_STK        StartUp_Stk[STARTUP_TASK_STK_SIZE];

static  OS_TCB        LED1_TCB;                                                  
static        CPU_STK        LED1_Stk[TASK_LED1_STK_SIZE];          

static  OS_TCB        LED2_TCB;                                                  
static        CPU_STK        LED2_Stk[TASK_LED2_STK_SIZE];                  

static  OS_TCB        LED3_TCB;                                                          
static        CPU_STK        LED3_Stk[TASK_LED3_STK_SIZE];         


/*
*********************************************************************************************************
*                                         FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void Task_Start(void *p_arg);
void Task_LED1(void *p_arg);
void Task_LED2(void *p_arg);
void Task_LED3(void *p_arg);

/*
*********************************************************************************************************
*        函 数 名: main
*        功能说明: 标准c程序入口。
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
int main(void)
{
    OS_ERR  err;

//    BSP_IntDisAll();           /* Disable all interrupts.                              */
       
        bsp_Init();
        CPU_Init();
        BSP_Tick_Init();
   
    OSInit(&err);                                               /* Init uC/OS-III.                                      */


        /*创建任务*/
        OSTaskCreate((OS_TCB     *)&StartUp_TCB,                // 任务控制块指针         
               (CPU_CHAR   *)"StartUp",                                // 任务名称
               (OS_TASK_PTR )Task_Start,                         // 任务代码指针
               (void       *)0,                                              // 传递给任务的参数parg
               (OS_PRIO     )STARTUP_TASK_PRIO,                              // 任务优先级
               (CPU_STK    *)&StartUp_Stk[0],                    // 任务堆栈基地址
               (CPU_STK_SIZE)STARTUP_TASK_STK_SIZE/10,          // 堆栈剩余警戒线
               (CPU_STK_SIZE)STARTUP_TASK_STK_SIZE,                          // 堆栈大小
               (OS_MSG_QTY  )0,                                              // 可接收的最大消息队列数
               (OS_TICK     )0,                                              // 时间片轮转时间
               (void       *)0,                                              // 任务控制块扩展信息
               (OS_OPT      )(OS_OPT_TASK_STK_CHK |
                              OS_OPT_TASK_STK_CLR),              // 任务选项
               (OS_ERR     *)&err);                                    // 返回值

    OSStart(&err);                       /* Start multitasking (i.e. give control to uC/OS-III). */
   
    (void)&err;
   
    return (0);
}


/*
* 函数名:Task_Start
* 描述  : 启动任务,
*                           优先级为3,
*                     创建LED1、LED2和LED3的任务
* 输入  :无
* 输出  : 无
*/
void Task_Start(void *p_arg)
{
        OS_ERR err;
  (void)p_arg;       

        //创建任务LED1       
        OSTaskCreate((OS_TCB     *)&LED1_TCB,                                                    // 任务控制块指针         
               (CPU_CHAR   *)"LED1",                                                            // 任务名称
               (OS_TASK_PTR )Task_LED1,                                                    // 任务代码指针
               (void       *)0,                                                                        // 传递给任务的参数parg
               (OS_PRIO     )TASK_LED1_PRIO,                                        // 任务优先级
               (CPU_STK    *)&LED1_Stk[0],                                          // 任务堆栈基地址
               (CPU_STK_SIZE)TASK_LED1_STK_SIZE/10,                      // 堆栈剩余警戒线
               (CPU_STK_SIZE)TASK_LED1_STK_SIZE,                              // 堆栈大小
               (OS_MSG_QTY  )0,                                                                        // 可接收的最大消息队列数
               (OS_TICK     )0,                                                                        // 时间片轮转时间
               (void       *)0,                                                                        // 任务控制块扩展信息
               (OS_OPT      )(OS_OPT_TASK_STK_CHK |
                              OS_OPT_TASK_STK_CLR),                // 任务选项
               (OS_ERR     *)&err);                                                              // 返回值

        //创建任务LED2       
        OSTaskCreate((OS_TCB     *)&LED2_TCB,                                             
               (CPU_CHAR   *)"LED2",                                               
               (OS_TASK_PTR )Task_LED2,                                       
               (void       *)0,                                                       
               (OS_PRIO     )TASK_LED2_PRIO,                               
               (CPU_STK    *)&LED2_Stk[0],                               
               (CPU_STK_SIZE)TASK_LED2_STK_SIZE/10,               
               (CPU_STK_SIZE)TASK_LED2_STK_SIZE,                       
               (OS_MSG_QTY  )0,                                                       
               (OS_TICK     )0,                                                       
               (void       *)0,                                                       
               (OS_OPT      )(OS_OPT_TASK_STK_CHK |
                              OS_OPT_TASK_STK_CLR),         
               (OS_ERR     *)&err);                                       

        //创建任务LED3       
        OSTaskCreate((OS_TCB     *)&LED3_TCB,                                          
               (CPU_CHAR   *)"LED3",                                               
               (OS_TASK_PTR )Task_LED3,                               
               (void       *)0,                                                       
               (OS_PRIO     )TASK_LED3_PRIO,                               
               (CPU_STK    *)&LED3_Stk[0],                               
               (CPU_STK_SIZE)TASK_LED3_STK_SIZE/10,               
               (CPU_STK_SIZE)TASK_LED3_STK_SIZE,                       
               (OS_MSG_QTY  )0,                                               
               (OS_TICK     )0,                                                       
               (void       *)0,                                                       
               (OS_OPT      )(OS_OPT_TASK_STK_CHK |
                              OS_OPT_TASK_STK_CLR),         
               (OS_ERR     *)&err);       
               
  //任务删除自己       
        OSTaskDel(&StartUp_TCB,&err);                                                         
}

/*
* 函数名:Task_LED1
* 描述  : LED任务1,
*                     优先级为4,
*                     以100ms的间隔点亮、关闭LED1
* 输入  :无
* 输出  : 无
*/
void Task_LED1(void *p_arg)
{
  OS_ERR err;
  (void)p_arg;                       

  while (1)
  {
    GPIO_SetBits(GPIOA, GPIO_Pin_5);
    OSTimeDlyHMSM(0, 0,0,100,OS_OPT_TIME_HMSM_STRICT,&err);        //延时阻塞100ms
    GPIO_ResetBits(GPIOA, GPIO_Pin_5);     
    OSTimeDlyHMSM(0, 0,0,100,OS_OPT_TIME_HMSM_STRICT,&err);
  }
}

/*
* 函数名:Task_LED2
* 描述  :         LED任务2,
*                            优先级为5,
*                      以200ms的间隔点亮、关闭LED2
* 输入  :无
* 输出  : 无
*/
void Task_LED2(void *p_arg)
{
  OS_ERR err;
  (void)p_arg;                       

  while (1)
  {
    GPIO_SetBits(GPIOA, GPIO_Pin_6);
    OSTimeDlyHMSM(0, 0,0,200,OS_OPT_TIME_HMSM_STRICT,&err);         //延时阻塞200ms
    GPIO_ResetBits(GPIOA, GPIO_Pin_6);
    OSTimeDlyHMSM(0, 0,0,200,OS_OPT_TIME_HMSM_STRICT,&err);
  }
}

/*
* 函数名:Task_LED3
* 描述  : LED任务3,
*                           优先级为6,
*                     以300ms的间隔点亮、关闭LED3
* 输入  :无
* 输出  : 无
*/
void Task_LED3(void *p_arg)
{
  OS_ERR err;
  (void)p_arg;      

  while (1)
  {
    GPIO_SetBits(GPIOA, GPIO_Pin_7);
    OSTimeDlyHMSM(0, 0,0,300,OS_OPT_TIME_HMSM_STRICT,&err);         //延时阻塞300ms
    GPIO_ResetBits(GPIOA, GPIO_Pin_7);
    OSTimeDlyHMSM(0, 0,0,300,OS_OPT_TIME_HMSM_STRICT,&err);
  }
}

实验现象:

PA5接的LED1以100ms的间隔点亮、关闭LED1
PA6接的LED2以200ms的间隔点亮、关闭LED2
PA7接的LED3以300ms的间隔点亮、关闭LED3
完整程序:(多任务)
uCos-III Template(多任务).rar (1.34 MB)
沙发
yinhaix| | 2015-5-8 15:56 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:相由心生,境随心转,一切法从心想生。

46

主题

524

帖子

7

粉丝