在IAR中移植ucos到msp430

昨天搞定了ucos在stm32上的移植,今天继续移植msp430,我用的是IAR6.3编译环境。相比stm32来讲我觉得这个移植更简单一点,官方代码给的已经很好了,所需要的修改很少很少。开始正题。
准备材料
在TI上下载430的固件库,我用的是msp430f5528的板子,下载的是F5xx_F6xx_Core_Lib
地址www.ti/cn/litv/zip/slaa448b
下载后解压得到
在ucos上下载移植430版本的ucos,地址
micrium/download/
下载安装后得到
建立和配置工程清洗喷嘴
建立工程目录,并在工程目录下建立F5xx_F6xx_Core_Lib和ucosii两个目录
将msp430固件库\slaa448b\F5xx_F6xx_Core_Lib目录下的所有文件拷贝到工程目录下的F5xx_F6xx_Core_Lib文件夹中,这个是msp430cpu操作的一些函数。我们要初始化cpu时钟用。
在在工程目录的ucosii下建立ports和source两个目录用来存放ucos系统文件
将ucos安装目录\Micrium\Software\uCOS-II\Ports\MSP430X\IAR\MSP430x5xx下的所有文件复制到工程目录下的ports文件夹中
将ucos安装目录\Micrium\Software\uCOS-II\Source下的所有文件复制到工程目录下的source文件夹中
建立main函数文件,建一个文本文档取名为test.c
我们还要借鉴ucos安装的例程给的两个系统配置文件
\Micrium\Software\EvalBoards\TI\MSP-EXP430F5438\IAR\uCOS-II目录里的app_cfg.h和os_cfg.h。将这两个文件拷贝的工程根目录下。app_cfg.h是用户进程的一些配置,比如进程的优先级,进程堆栈的大小等等。os_cfg.h是系统的一些配置,可以开关系统的一些功能,尽量裁剪掉不用的功能可以减少cpu的开销。
下面建立一个msp430的空工程并向工程中添加刚才的文件,得到目录如下
配置这个工程
选取相应的芯片型号
添加工程包含目录
$PROJ_DIR$\F5xx_F6xx_Core_Lib
$PROJ_DIR$\
$PROJ_DIR$\ucosii\ports
$PROJ_DIR$\ucosii\source
仿真模式改成debug
保存
然后开始建立任务
建立4个任务每个任务闪一个灯和一个启动任务,首先删掉app_cfg.h中的所有内容,写如下代码:
#ifndef  __APP_CFG_H__
#define  __APP_CFG_H__
#define  OS_TASK_TMR_PRIO            (OS_LOWEST_PRIO - 4)
/* task stack size */
#define STARTUP_TASK_STK_SIZE 128
#define TASK1_STK_SIZE 128
#define TASK2_STK_SIZE 128
#define TASK3_STK_SIZE 128
#define TASK4_STK_SIZE 128
电解离子接地棒
#define STARTUP_TASK_PRIO 4
#define TASK1_PRIO 5
#define TASK2_PRIO 6
#define TASK3_PRIO 7
#define TASK4_PRIO 8
#endif
这个就是建立的四个任务和一个启动任务的优先级和堆栈大小
下面是任务代码写在test.c中。
OS_STK startup_stk[STARTUP_TASK_STK_SIZE];
OS_STK task1_stk[TASK1_STK_SIZE];
OS_STK task2_stk[TASK2_STK_SIZE];
OS_STK task3_stk[TASK3_STK_SIZE];
OS_STK task4_stk[TASK4_STK_SIZE];
unsigned char os_err;
static void task1(void *p_arg)
{
  for (;;)
  {刘保善
    P1OUT |= BIT1;
    OSTimeDly(500);
      P1OUT &= ~BIT1;
    OSTimeDly(500);
  }
}
static void task2(void *p_arg)
{
  for (;;)
  {
    P1OUT |= BIT2;
    OSTimeDly(500);
      P1OUT &= ~BIT2;
    OSTimeDly(500);
  }
}
static void task3(void *p_arg)
{
  for (;;)
  {
  P1OUT |= BIT3;
    OSTimeDly(500);
      P1OUT &= ~BIT3;
    OSTimeDly(500);
  }
}电力安全性评价
static void task4(void *p_arg)
{
  for (;;)
  {
    P1OUT |= BIT4;
    OSTimeDly(500);
      P1OUT &= ~BIT4 ;
    OSTimeDly(500);
  }
}
高浓除砂器
static void startup(void *p_arg)
压铁饼{
  P1DIR |= BIT1+BIT2+BIT3+BIT4;                            // P1.0 set as output
 
  OS_CPU_SysTickInit();   
  #if (OS_TASK_STAT_EN > 0)
  //----统计任务初始化函数
  OSStatInit();                                             
#endif
  os_err = OSTaskCreate(task1,                //任务1
                      (void *)0,                //不带参数
                      (OS_STK *)&task1_stk[TASK1_STK_SIZE - 1],//堆栈指针
                      (INT8U)5);                //优先级                       
 
  os_err = OSTaskCreate(task2,                    //任务2
                      (void *)0,            //不带参数
                      (OS_STK *)&task2_stk[TASK2_STK_SIZE - 1],//堆栈指针
                      (INT8U)6);                //优先级                       
  os_err = OSTaskCreate(task3,                    //任务3
                      (void *)0,            //不带参数
                      (OS_STK *)&task3_stk[TASK3_STK_SIZE - 1],//堆栈指针
                      (INT8U)7);            //优先级 
                                        //
 
  os_err = OSTaskCreate(task4,                    //任务4
                      (void *)0,            //不带参数
                      (OS_STK *)&task4_stk[TASK4_STK_SIZE - 1],//堆栈指针
                      (INT8U)8);
  OSTaskDel(OS_PRIO_SELF);
 
}
我们用的ucos系统时钟是看门狗做的,我们要初始化看门狗滴答如下函数
void OS_CPU_SysTickInit()
{
    WDTCTL = (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS_4);    /*20M/32768=1.6384ms */
    SFRIE1 |= 1;                            /* Enable WDT interrupts    */
}
看门狗的中断函数已经写好了在os_cpu_a.s43中,可以自己看一下。
下面是初始化cpu时钟 我们吧系统时钟初始化到20M用的是内部PLL,(ucos时钟滴答跟这个有直接的关系,最好能保证看门狗可以设置到1ms的时间,当我们用OSTimeDly函数时时间比较直观)函数如下:
#include <msp430f5528.h>
#include "HAL_PMM.h"
#include "HAL_UCS.h"
#include  "ucos_ii.h"
#define SYS_MCLK_FREQ 20000000
void Init_Clock(void)
{
   
    SELECT_FLLREF(SELREF__REFOCLK);          // Set DCO FLL reference = REFO
    SELECT_ACLK(SELA__REFOCLK);                // Select REFO as ACLK source
    Init_FLL(SYS_MCLK_FREQ/1000, SYS_MCLK_FREQ/32768);

本文发布于:2024-09-22 03:47:31,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/154961.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:目录   工程   任务
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议