這是一件很有意義的事情,實踐μCOS-II感覺還是很好的。
手頭有塊周立功EasyARM2200(LPC2210)的開發板,今天研究了一下,把μCOS-II條通了,比較高興,拿出來說說。
基本上都是按照書上做的。實驗是這樣的:板子上的JP1控制蜂鳴器電平,μCOS-II移植成功運行后每短接一下JP1,蜂鳴器就叫喚兩聲兒。
先把JP1跳開,把JP6設置為BANK0-FLASH、BANK1-RAM,即從FLASH啟動,JP7設置為OUTSIDE,即從外部啟動;別的不管。
設置AXD中的EasyJtag的Flash 0 Address為0x80000000,Memory Size為0x00200000,OK之。
連好線,然后就是軟體部分。
先要找個μCOS-II的軟件,比如那本《嵌入式實時操作系統μCOS-II(第二版)》的配套光盤里就有。在C盤建個實驗目錄,比如MyTest,《嵌入式實時操作系統μCOS-II(第二版)》的配套光盤里把SOFTWARE/uCOS-II目錄下的SOURCE目錄復制過來,這里面的是操作系統的主體;把周立功那個光盤里某個實驗下的Arm_Pc(包含PC.C、PC.H和README.txt文件)和arm(包含Os_cpu_a.s、Os_cpu_c.c、OS_CPU.H和IRQ.inc文件)目錄復制過來,這里面是周立功他們做好的有關移植方面的代碼。
打開ADS1.2,新建工程,選擇“ARM Executable Image for UCOSII(for lpc22xx)”模板,隨便起個名字比如MyTest,也放在C:/MyTest目錄下,在這個目錄下新建個C文件,比如叫main.c,把它添加到ADS工程中的user組中,其實這時你會發現剛才復制的SOURCE、Arm_Pc和arm等文件夾的東西都已經自動到ADS的工程中去了。給main.c文件加入如下內容:
** 广州周立功单片机发展有限公司
** 研 究 所
** 产品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: test.c
**创 建 人: 陈明计
**最后修改日期: 2003年7月8日
**描 述: μCOS-II上的LPC210x的通用IO使用的例子,在EasyArm2104板上调试通过
** 按板上的KEY1则蜂鸣器会响两声
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版 本: v1.0
** 日 期: 2003年7月8日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include " config.h "
#define TASK_STK_SIZE 64
OS_STK TaskStartStk[TASK_STK_SIZE];
OS_STK TaskStk[TASK_STK_SIZE];
#define KEY1 (1 << 14) /* P0.14为key1 */
#define BEE (1 << 7) /* P0.07为蜂鸣器 */
void TaskStart( void * data);
void Task( void * data);
/**/ /*********************************************************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OSInit,OSTaskCreate,OSStart
**
** 作 者: 陈明计
** 日 期: 2003年7月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main ( void )
... {
OSInit();
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
OSStart();
return 0;
}
/**/ /*********************************************************************************************************
** 函数名称: TaskStart
** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者: 陈明计
** 日 期: 2003年7月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TaskStart( void * pdata)
... {
pdata = pdata; /**//* 避免编译警告 */
TargetInit(); /**//* 目标板初始化 */
IODIR &= ~KEY1; /**//* 设置KEY1为输入*/
IOSET = BEE;
IODIR |= BEE; /**//* 设置蜂鸣器为输出*/
PINSEL0 = (PINSEL0 & 0xcffff3ff); /**//* 管教选择模块初始化 */
OSTaskCreate(Task, (void *)0, &TaskStk[TASK_STK_SIZE - 1], 10); /**//* 创建任务 */
for (;;)
...{
OSTaskSuspend(OS_PRIO_SELF);
IOCLR = BEE;
OSTimeDly(OS_TICKS_PER_SEC / 8);
IOSET = BEE;
OSTimeDly(OS_TICKS_PER_SEC / 4);
IOCLR = BEE;
OSTimeDly(OS_TICKS_PER_SEC / 8);
IOSET = BEE;
OSTimeDly(OS_TICKS_PER_SEC / 4);
}
}
/**/ /*********************************************************************************************************
** 函数名称: TaskUart0Revice
** 功能描述: μCOS-II的任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者: 陈明计
** 日 期: 2003年7月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Task( void * pdata)
... {
pdata = pdata; /**//* 避免编译警告 */
for (;;)
...{
OSTimeDly(OS_TICKS_PER_SEC / 50); /**//* 延时20毫秒 */
if ((IOPIN & KEY1) != 0)
...{
continue;
}
OSTimeDly(OS_TICKS_PER_SEC / 50); /**//* 延时20毫秒 */
if ((IOPIN & KEY1) != 0)
...{
continue;
}
OSTaskResume(0);
while ((IOPIN & KEY1) == 0)
...{
OSTimeDly(OS_TICKS_PER_SEC / 50); /**//* 延时20毫秒 */
}
}
}
/**/ /*********************************************************************************************************
** End Of File
********************************************************************************************************/
這段代碼是抄周立功的,在他們的光盤上有。
選擇RelOutChip模式,Debug一把,配置沒問題此時代碼就寫到板子上去了,拔掉JTag線,重啟板子,拿把起子觸碰一下JP1,就會聽到兩聲鳴叫聲。