S3C2416裸机开发系列十五_GCC下uCOS的移植(2)

发布者:快乐微笑最新更新时间:2016-12-12 来源: eefocus关键字:S3C2416  裸机开发  GCC  uCOS  移植 手机看文章 扫描二维码
随时随地手机看文章

4. uCOS配置

uCOS是可裁减实时操作系统,可以根据实际的应用对内核未使用到的功能进行裁减,以进一步节省系统宝贵的硬件资源,通常可用的uCOS-II内核代码在6K~26K,这在uCOS-II配置文件os_cfg.h中进行配置,这个配置文件在源码目录为os_cfg_r.h,从目录中拷贝添加到uCOS/uCOS-II/Cfg目录中,并重命名为os_cfg.h。

#ifndef OS_CFG_H

#define OS_CFG_H

/* ---------------------------- MISCELLANEOUS -------------------------- */

#define OS_CFG_APP_HOOKS_EN   1u   /* Enable/Disable application specific hooks*/

#define OS_CFG_ARG_CHK_EN        1u   /*Enable/Disable argument checking*/

#define OS_CFG_CALLED_FROM_ISR_CHK_EN   1u   /* check for called from ISR*/

#define OS_CFG_DBG_EN                  1u   /* Enable (1) debugcode/variables */

#define OS_CFG_ISR_POST_DEFERRED_EN    0u   /* Enable/Disable DeferredISR posts */

#define OS_CFG_OBJ_TYPE_CHK_EN                 1u   /* Enable/Disable object typechecking*/

#define OS_CFG_TS_EN                    1u   /* Enable/Disable timestamping*/

#define OS_CFG_PEND_MULTI_EN            1u   /* code generation formulti-pend feature */

#define OS_CFG_PRIO_MAX                32u   /* maximum number of taskpriorities */

#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 1u   /* code to measure schedulerlock time */

#define OS_CFG_SCHED_ROUND_ROBIN_EN      1u   /* code for Round-Robinscheduling */

#define OS_CFG_STK_SIZE_MIN              64u   /* Minimum allowable taskstack size */

 

/* ----------------------------- EVENT FLAGS --------------------------- */

#define OS_CFG_FLAG_EN                  1u   /* Enable/Disable code forEVENT FLAGS*/

#define OS_CFG_FLAG_DEL_EN              0u   /* Include code forOSFlagDel()*/

#define OS_CFG_FLAG_MODE_CLR_EN      0u   /* code for Wait on ClearEVENT FLAGS*/

#define OS_CFG_FLAG_PEND_ABORT_EN   0u   /* Include code forOSFlagPendAbort()*/

 

 

/* -------------------------- MEMORY MANAGEMENT ------------------------ */

#define OS_CFG_MEM_EN                  1u   /* code generation for MEMORYMANAGER */

 

/* --------------------- MUTUAL EXCLUSION SEMAPHORES ------------------- */

#define OS_CFG_MUTEX_EN                 1u   /* code generation for MUTEX*/

#define OS_CFG_MUTEX_DEL_EN             0u   /* code for OSMutexDel()*/

#define OS_CFG_MUTEX_PEND_ABORT_EN     0u   /* code for OSMutexPendAbort()*/

 

/* --------------------------- MESSAGE QUEUES -------------------------- */

#define OS_CFG_Q_EN                      1u   /* code generation for QUEUES*/

#define OS_CFG_Q_DEL_EN                    0u   /* Include code forOSQDel()*/

#define OS_CFG_Q_FLUSH_EN                 0u   /* Include code forOSQFlush()*/

#define OS_CFG_Q_PEND_ABORT_EN         1u   /* Include code forOSQPendAbort()*/

 

/* ----------------------------- SEMAPHORES ---------------------------- */

#define OS_CFG_SEM_EN                          1u  /* code generation for SEMAPHORES */

#define OS_CFG_SEM_DEL_EN                    0u   /* Include code forOSSemDel()*/

#define OS_CFG_SEM_PEND_ABORT_EN       1u   /* Include code forOSSemPendAbort()*/

#define OS_CFG_SEM_SET_EN                     1u   /* Include code forOSSemSet()*/

 

/* -------------------------- TASK MANAGEMENT -------------------------- */

#define OS_CFG_STAT_TASK_EN             1u   /* Enable/Disable thestatistics task*/

#define OS_CFG_STAT_TASK_STK_CHK_EN    1u   /* Check task stacks fromstatistic task*/

#define OS_CFG_TASK_CHANGE_PRIO_EN      1u   /* Include code forOSTaskChangePrio()*/

#define OS_CFG_TASK_DEL_EN              0u   /* Include code forOSTaskDel()*/

#define OS_CFG_TASK_Q_EN                  1u   /* Include code forOSTaskQXXXX()*/

#define OS_CFG_TASK_Q_PEND_ABORT_EN    0u   /* Include code forOSTaskQPendAbort()*/

#define OS_CFG_TASK_PROFILE_EN          1u   /* variables in OS_TCB forprofiling */

#define OS_CFG_TASK_REG_TBL_SIZE        1u   /* Number of task specificregisters*/

#define OS_CFG_TASK_SEM_PEND_ABORT_EN  1u   /* Include code forOSTaskSemPendAbort()*/

#define OS_CFG_TASK_SUSPEND_EN          1u   /* OSTaskSuspend() and OSTaskResume()*/

 

/* -------------------------- TIME MANAGEMENT -------------------------- */

#define OS_CFG_TIME_DLY_HMSM_EN           1u   /* Include code forOSTimeDlyHMSM()*/

#define OS_CFG_TIME_DLY_RESUME_EN      0u   /* Include code forOSTimeDlyResume()*/

 

/* ------------------- TASK LOCAL STORAGE MANAGEMENT ------------------- */

#define OS_CFG_TLS_TBL_SIZE    0u   /* code for Task LocalStorage (TLS) registers */

 

/* ------------------------- TIMER MANAGEMENT -------------------------- */

#define  OS_CFG_TMR_EN            1u   /*Enable/Disablecode generation for TIMERS */

#define OS_CFG_TMR_DEL_EN   0u   /*Enable/Disable code generation for OSTmrDel()*/

 

#endif

5. 用户代码

用户需要提供一个周期性定时中断作为uCOS-II的运行Tick,每个Tick需调用OSTimeTick()来让内核管理时钟节拍,在s3c2416用定时器4产生这个系统Tick。在main()函数中需调用OSInit()初始化内核,创建任务后,再调用OSStart()把cpu管理权交给内核。内核即可正确地管理用户的任务。

#include "s3c2416.h"

#include "Exception.h"

#include "ucos_ii.h"

 

// IO port for controling LEDs

#define LED2    (13) // GPE13 LED2

#define LED3    (11) // GPE11 LED3

#define LED4    (13) // GPL13 LED4

#define LED5    (12) // GPE12 LED5

#define LED6    (2)  // GPG2  LED6

 

OS_STK TaskStartStk[TASK_START_STK_SIZE];

OS_STK  Task1Stk[TASK1_STK_SIZE];

OS_STK  Task2Stk[TASK2_STK_SIZE];

OS_STK  Task3Stk[TASK3_STK_SIZE];

 

static void Timer4_IRQ(void)

{

    OSTimeTick(); // uCOS时钟节拍管理

    rSRCPND1 |= (0x01 <

    rINTPND1 |= (0x01 <

}

 

void Timer4_Start()

{

    rTCON |= (0x1 << 20); // 定时器开启

}

 

void Timer4_Stop()

{

    rTCON &= ~(0x1 << 20);// 定时器停止

}

 

void Timer4_Init()

{

// 定时器4时钟频率为PCLK(66.66666M)/(0+1)/16=4.166MHZ

    rTCFG1 &= ~(0xf << 16);

    rTCFG1 |= (0x3 << 16);  // Timer4 16分频

    rTCFG0 &= ~(0xff << 8);

    rTCFG0 |= (0 << 8); // PCLK预分频为1

    rTCNTB4 = 4166; // System Tick设1ms

    rTCON |= (0x1 << 21); // 更新计数值

    rTCON &= ~(0x1 << 21);// 清除

    rTCON |= (0x1 << 22); // 自动重装载

   

    IRQ_Register(INT_TIMER4,Timer4_IRQ); // 注册Timer4中断函数

    rINTMOD1 &= ~(1 <

    rINTMSK1 &= ~(1 <

}

 

void Gpio_LED2(unsigned char On)

{

    if (!On) {

        rGPEDAT &=~(1<

    } else {

        rGPEDAT |= (1<

    }

}

 

void Gpio_LED3(unsigned char On)

{

    if (!On) {

        rGPEDAT &=~(1<

    } else {

        rGPEDAT |= (1<

    }

}

 

void Gpio_LED4(unsigned char On)

{

    if (!On) {

        rGPLDAT &=~(1<

    } else {

        rGPLDAT |= (1<

    }

}

 

void Gpio_LED5(unsigned char On)

{

    if (!On) {

        rGPEDAT &=~(1<

    } else {

        rGPEDAT |= (1<

    }

}

 

void Gpio_Init()

{

    // GPE11,12,13 LED3,LED5,LED2output   

    rGPECON &=~((0x03<<(LED3<<1)) | (0x03<<(LED5<<1))

                |(0x03<<(LED2<<1)));

    rGPECON |= ((0x01<<(LED3<<1))| (0x01<<(LED5<<1))

                |(0x01<<(LED2<<1)));

    // GPL13 LED4 output   

    rGPLCON &= ~(0x03 <<(LED4<<1));

    rGPLCON |= (0x01 <<(LED4<<1));

}

 

void Task3(void *pdata)

{

    (void)pdata;

    while (1) {

        Gpio_LED5(1);

        OSTimeDly(2000); // LED5 2000ms闪烁

        Gpio_LED5(0);

        OSTimeDly(2000); // LED52000ms闪烁    

    }

}

 

void  Task2(void *pdata)

{

    (void)pdata;

    while (1) {

        Gpio_LED4(1);

        OSTimeDly(1500); // LED41500ms闪烁

        Gpio_LED4(0);

        OSTimeDly(1500); // LED41500ms闪烁    

    }

}

 

void  Task1(void *pdata)

{

    (void)pdata;

    while (1) {

        Gpio_LED3(1);

        OSTimeDly(1000); // LED31000ms闪烁

        Gpio_LED3(0);

        OSTimeDly(1000); // LED31000ms闪烁    

    }

}

 

void  TaskStart(void *pdata)

{

    (void)pdata;

    Gpio_Init();

    Timer4_Init();

    Timer4_Start();

 

    OSTaskCreate(Task1, (void *)0,&Task1Stk[TASK1_STK_SIZE - 1], Task1Prio);

    OSTaskCreate(Task2, (void *)0,&Task2Stk[TASK2_STK_SIZE - 1], Task2Prio);

    OSTaskCreate(Task3, (void *)0,&Task3Stk[TASK3_STK_SIZE - 1], Task3Prio);

 

    while (1) {

        Gpio_LED2(1);

        OSTimeDly(500); // LED2 500ms闪烁

        Gpio_LED2(0);

        OSTimeDly(500); // LED2 500ms闪烁

    }

}

 

int  main (void)

{  

    OSInit(); // 初始化uCOS

    OSTaskCreate(TaskStart, (void *)0,&TaskStartStk[TASK_START_STK_SIZE-1], TaskStartPrio);

   OSStart();// 开始uCOS调度

    return 0;

}

uCOS-II通过app_cfg.h文件来配置任务的栈、优先级等,app_cfg.h的内容如下:

#ifndef APP_CFG_MODULE_PRESENT

#define APP_CFG_MODULE_PRESENT

 

// 任务TaskStart的栈及优先级分配

#define  TASK_START_STK_SIZE      256u

#define  TaskStartPrio      10

// 任务Task1的栈及优先级分配

#define  TASK1_STK_SIZE         256u

#define  Task1Prio          11

// 任务Task2的栈及优先级分配

#define  TASK2_STK_SIZE         256u

#define  Task2Prio          12

// 任务Task3的栈及优先级分配

#define  TASK3_STK_SIZE         256u

#define  Task3Prio          13

// 定时器优先级配置

#define OS_TASK_TMR_PRIO       (OS_LOWEST_PRIO - 2)

 

#endif

uCOS-II+uCGUI效果图:

 

6. 附录

本篇uCOS接口部分的移植对于ARM7、ARM9都是适用的,不同型号的cpu只需加入定时器产生系统Tick,通过调用OSTimeTick()来让内核管理时钟节拍。总的来说,熟悉一款操作系统的工作原理,了解其任务调度、信号量同步、临界区访问等概念,对学习其它操作系统、多线程编程等均是有很较大的帮助的。

uCOS_GCC,GCC下uCOS-II的移植工程,可直接make

http://pan.baidu.com/s/1o6NTaVw

uCOS_MDK,MDK下uCOS-II的移植工程

http://pan.baidu.com/s/1jGjzE0A


关键字:S3C2416  裸机开发  GCC  uCOS  移植 引用地址:S3C2416裸机开发系列十五_GCC下uCOS的移植(2)

上一篇:S3C2416裸机开发系列十六_sd卡驱动实现
下一篇:S3C2416裸机开发系列十五_GCC下uCOS的移植(1)

推荐阅读最新更新时间:2024-03-16 15:24

移植ucosII到STM32F103ZE(四)
a) 根据stm32f103芯片对系统文件进行修改 根据AN-1018.pdf 和移植详解介绍的移植基础知识,对OS-uCOSIIport 下的代码解释下。 并进行相关特性修改。 os_cpu.h #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endif typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsign
[单片机]
U-Boot移植(7)总结U-Boot工程的总体结构
3、u-boot的通用目录是怎么做到与平台无关的? include/configs/100ask24x0.h 这个头文件中主要定义了两类变量。  一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等,主要用来决定是否编译某些文件或者函数。 另一类是参数,前缀是CFG_,用来定义总线频率、串口波特率、Flash地址等参数。这些常数参量主要用来支持通用目录中的代码,定义板子资源参数。 这两类宏定义对u-boot的移植性非常关键,比如drivers/cs8900.c,对cs8900而言,很多操作都是通用的,但不是所有的板子上面都有这个芯片,即使有它在内存中映射的基地址也是平台相关的。所以对于smdk2410板,在s
[单片机]
STM32f429开发中USB读写文件涉及到的库移植
第一步 USB_HID移植(原创 http://blog.csdn.net/xbl1986/article/details/17577685#comments ) ├── STM32_USB_Device_Library USB从设备库 │ │ ├── Class │ │ │ └── hid │ │ │ ├── inc │ │ │ │ └── usbd_hid_core.h │ │ │ └── src │ │ │ └── usbd_hid_core.c │ │ └── Core │ │ ├── inc │ │ │ ├
[单片机]
PPP拨号在ARM2410平台上的移植
本次PPP移植是在三星arm2410的平台上进行的,所用的工作环境为:   Kernel: 2.4.18Sysvinit:2.86Tinylogin:1.4Glibc: 2.2.5CC:3.3PPP: 2.4.1U-boot:1.1.3一、具体操作步骤首先编译内核支持 PPP:   $make menuconfig l$make ARCH=arm CROSS_COMPILE=/../arm-linux- zImage$./mkimage2410 uImage其中mkimage2410文件来自u-boot1.1.1 需要根据你的路径修改mkimage2410的内容,指定mkimage文件的位置。   第二步,制作文件系统:   1.
[嵌入式]
STM32 + GCC + J-Link :开源的力量
发现Keil自带的编译器有时候优化有问题,跑得跟没优化时完全不一样。以前使用GCC,现在自然而然想再次使用GCC。 搭配1:Keil+GCC+Ulink2 这类的介绍也较多,主要是一个链接脚本、启动代码、IDE选项配置的问题,大家可以google一下,个人觉得搭配一般般。 搭配2:emIDE+JLink 纯粹的Opensource血统,这个EMIDE已经带了GCC,只需要一个JLink,然后构建好工程就可以debug了,如果发展迅猛,估计Keil也会扛不住了。
[单片机]
OK6410A 开发板 (七) 1 OK6410A 文件系统 busybox和buildroot 移植
存在问题, kernel 是用 Linaro GCC 7.4-2019.02) 7.4.1 20181213 编译的 但是 Linaro GCC 7.4-2019.02) 7.4.1 20181213 编译 busybox和buildroot 出来, 执行 linuxrc 的时候 ,会出现 段错误 VFS: Mounted root (ext3 filesystem) on device 179:2. Freeing unused kernel memory: 1024K Run /linuxrc as init process random: fast init done Kernel panic - not syncing
[单片机]
OK6410A <font color='red'>开发</font>板 (七) 1 OK6410A 文件系统 busybox和buildroot <font color='red'>移植</font>
AM3D 音频增强软件移植至Tensilica HiFi音频DSP
美国加州SANTA CLARA和丹麦AALBORG-2013年3月11日-Tensilica和AM3D A/S今日联合宣布双方拓展合作,将AM3D的音频增强产品移植至Tensilica的HiFi音频DSP系列。这将显著提升移动电话、车载娱乐、家庭娱乐系统和个人电脑的音频体验。 AM3D的低音增强和均衡变换器可以显著提升音频性能,而其虚拟环绕音效,则通过创建良好的声像延展了物理扬声器。该解决方案完全基于软件实现,所有功能都占用极低的内存和CPU性能。 Tensilica多媒体市场高级总监Larry Przywara表示:“许多客户都在寻找高级音频增强解决方案。AM3D显著提升了自然音色与低音音效,该优化的功能套件不久即将面世。”
[嵌入式]
mini2440 u-boot-2009.03 移植最详细攻略
1 支持S3C2440,S3C2410未知; 2 NAND flash支持,包括读写NAND flash,从NAND flash启动,saveenv 在NAND flash; 3 支持tftp的使用,也就支持DM9000网卡,8900CS未知; 4 支持yaffs映像的烧写,该版本已经支持yaffs2的文件系统,在fs目录下已经有yaffs2目录; 5 支持串口xmodem协议。 第0阶段:建立自己的开发板配置文件 1 打开u-boot主目录下的makefile,找到smdk2410_config,在其下,仿照它的格式加入如下语句: smdk2440_config : unconfig @$(MKCONFIG) $
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved