SylixOS BSP tick驱动流程

SylixOS BSP tick驱动流程

1. 开发环境

操作系统:SylixOS 
- 编程环境:RealEvo-IDE3.1 
- 硬件平台:IMX6Q实验箱

2.技术实现

时钟节拍(clock tick)是特定的周期性中断。这个中断可以看做是系统心脏的脉动。时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,同时当任务等待事件发生时,提供等待超时的依据。

2.1 Tick的频率设置 
Tick的频率需要根据具体的硬件性能来设置。频率越快,系统的额外开销也会越大。SylixOS中频率通 过bspInit.c文件中的halPrimaryCpuMain函数设置,如程序清单 2-1 所示。

                                 程序清单 2-1 tick频率设置
 /*********************************************************************************************************
** 函数名称: halPrimaryCpuMain
** 功能描述: Primary CPU C 入口
** 输 入  : NONE
** 输 出  : 0
** 全局变量:
** 调用模块:
*********************************************************************************************************/
INT  halPrimaryCpuMain (VOID)
{
    /*
     *  系统内核堆与系统堆
     */
    externUCHAR  __heap_start, __heap_end;
 
    bspOpenocdInit();                                                   /*  初始化 openocd              */
 
    halModeInit();                                                      /*  初始化硬件                  */
 
    /*
     *  这里的调试端口是脱离操作系统的, 所以它应该不依赖于操作系统而存在.
     *  当系统出现错误时, 这个端口显得尤为关键. (项目成熟后可以通过配置关掉)
     *  (!!当前串口已经由bootloader初始化了, 这里无需处理.)
     */
 
    /*
     *  这里使用 bsp设置启动参数, 如果 bootloader支持, 可使用 bootloader设置.
     *  为了兼容以前的项目, 这里 kfpu=yes 允许内核中(包括中断)使用 FPU.
     */
 
#if (BOARD_MARSBOARD == 1)
    API_KernelStartParam("ncpus=2 kdlog=no kderror=yes kfpu=no heapchk=yes hz=1000 hhz=1000");
#else
    API_KernelStartParam("ncpus=4 kdlog=no kderror=yes kfpu=no heapchk=yes hz=1000 hhz=1000");
#endif
                                                                        /*  操作系统启动参数设置        */
    API_KernelStart(usrStartup,
                    (PVOID)&__heap_start,
                    (size_t)&__heap_end - (size_t)&__heap_start,
                    LW_NULL, 0);                                        /*  启动内核                    */
 
    return  (0);                                                        /*  不会执行到这里              */
}

在代码中,调用了API_KernelStartParam函数,函数参数是字符串类型,字符串里的“hz”参数选项后面的数值是需要设置的频率,调用API_KernelStartParam之后,系统的宏LW_TICK_HZ也会被设置为对应的频率,这里的代码运行后LW_TICK_HZ被设置为1000。

2.2 tick初始化

一般选用硬件定时器来实现系统tick功能,因此tick的初始化其实就是IMX6Q实验箱定时器的初始化。 
SylixOS中通过bsplib.c文件里的bspTickInit函数实现tick的初始化。 
Imx6Q实验箱的tick初始化代码如程序清单 2 2 所示,流程见代码中的注释。

                                     程序清单 2-2 tick 初始化
/*********************************************************************************************************
** 函数名称: bspTickInit
** 功能描述: 初始化 tick 时钟
** 输  入  : NONE
** 输  出  : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
VOID  bspTickInit (VOID)
{
    REGISTERUINT32      uiIncrementValue, uiPrescaler;
 
#if TICK_IN_THREAD > 0
    LW_CLASS_THREADATTR  threakattr;
 
    API_ThreadAttrBuild(&threakattr, (8 * LW_CFG_KB_SIZE),
                        LW_PRIO_T_TICK,
                        LW_OPTION_THREAD_STK_CHK |
                        LW_OPTION_THREAD_UNSELECT |
                        LW_OPTION_OBJECT_GLOBAL |
                        LW_OPTION_THREAD_SAFE, LW_NULL);
 
    htKernelTicks = API_ThreadCreate("t_tick", (PTHREAD_START_ROUTINE)__tickThread,
                                     &threakattr, LW_NULL);
#endif                                                                  /*  TICK_IN_THREAD > 0          */
 
    /*
     *                          (PRESCALER_value+1) x (Load_value+1) x 2
     * The timer interval = ---------------------------------------------
     *                                          PERIPHCLK
     */
    uiIncrementValue = ((imx6qMainClkGet(CPU_CLK) / 2) / LW_TICK_HZ);
    uiPrescaler      = 0;
 
    /*
     * 1.设置定时器分频系数,根据LW_TICK_HZ和分频系数计算出定时器的比较数值;
     */
    _G_uiFullCnt       = uiIncrementValue;
    _G_ui64NSecPerCnt7 = ((1000 * 1000 * 1000 / LW_TICK_HZ) << 7) / _G_uiFullCnt;
 
    /*
     * 2.初始化硬件定时器,设置为对应的计数模式;
     */
    armGlobalTimerInit(LW_TRUE, uiIncrementValue, uiPrescaler, LW_TRUE);
 
    /*
     * 3.将定时器当前的计数值,和比较值写入对应的寄存器;
     */
    armGlobalTimerCounterSet(0);
    armGlobalTimerComparatorSet(uiIncrementValue);
    _G_ui64ComparatorCur = 0;
 
    /*
     * 4.绑定定时器的中断服务函数(__tickTimerIsr),设置中断优先级;
     */
    API_InterVectorConnect(ARM_TICK_INT_VECTOR,
                           (PINT_SVR_ROUTINE)__tickTimerIsr,
                           LW_NULL,
                           "tick_isr");
 
    API_InterVectorEnable(ARM_TICK_INT_VECTOR);
 
    armGicIrqPrioritySet(ARM_TICK_INT_VECTOR, ARM_TICK_INT_PRIORITY);
 
    /*
     * 5.使能定时器,开始计数。
     */
    armGlobalTimerStart();
}

2.3 tick中断服务函数

SylixOS里tick中断服务函数为__tickTimerIsr,在2.2节的tick初始化过程中已经绑定,对于bsp开发,只需要在__tickTimerIsr函数内,清除tick使用的定时器的中断位。其余的不需要修改。如程序清单 2-3 所示。

                       程序清单 2-3 tick 中断服务函数
 /*********************************************************************************************************
** 函数名称: __tickTimerIsr
** 功能描述: tick 定时器中断服务例程
** 输  入  : NONE
** 输  出  : 中断返回值
** 全局变量:
** 调用模块:
*********************************************************************************************************/
staticirqreturn_t  __tickTimerIsr (VOID)
{
    armGlobalTimerIntClear();                                           /*  清除中断                    */
 
    API_KernelTicksContext();                                           /*  保存被时钟中断的线程控制块  */
 
#if TICK_IN_THREAD > 0
    API_ThreadResume(htKernelTicks);
#else
    API_KernelTicks();                                                  /*  内核 TICKS 通知             */
    API_TimerHTicks();                                                  /*  高速 TIMER TICKS 通知       */
#endif                                                                  /*  TICK_IN_THREAD > 0          */
 
    return  (LW_IRQ_HANDLED);
}

3.参考资料

时间: 2024-10-16 16:12:31

SylixOS BSP tick驱动流程的相关文章

SylixOS CAN总线初始化流程解析

概述 本文档是在AT91SAM9X25平台上进行SylixOS CAN总线驱动开发时,对CAN总线初始化流程的分析. 适用于正在学习CAN总线开发的技术工程师. 技术实现 CAN总线的初始化流程可以分成两个部分: 一部分是CAN总线通道资源初始化,主要工作是对通道相关的管脚和中断以及总线编程时需要的时钟等资源的初始化:另一部分是CAN总线的硬件初始化,主要工作是对总线的波特率的设置.接收和发送数据邮箱(相当于缓存区)的初始化以及接收中断和错误中断的使能. CAN总线通道资源初始化 在AT91SA

SylixOS SylixOS CAN总线驱动之三

SylixOS CAN报文传送流程 CAN报文传送流程框图 在SylixOS中CAN报文的传输框图如图 11所示. 图 11 SylixOS CAN报文传输框图 (注:此文档承接之前的文档编写,之前文档中详细介绍过的报文,传输结构体在此文档中不做详细介绍.) SylixOS CAN报文缓存机制 在SylixOS中CAN报文的传输不是底层和上层应用的直接传输.而是在底层和应用层中间加了一层系统缓存队列.所有收发的CAN报文都要先经过一个系统缓存机制传输到真正调用到它的地方. 系统CAN发送报文缓存

SylixOS字符设备驱动框架

1.概述 本文档主要介绍SylixOS中字符设备驱动框架,适用于在SylixOS集成开发环境下进行字符设备驱动开发的学习. 注:文中xxx是指具体设备名,编写对应驱动时,自行命名(如RTC.COMPASS等). 2.SylixOS字符设备驱动简介 字符设备是指只能以字节为单位进行读写的设备,读取数据需按照先后顺序,不能随机读取设备内存中某一数据.常见的字符设备如:鼠标.键盘.串口等. 在SylixOS中,每个字符设备都会在/dev目录下对应一个设备文件,用户程序可通过设备文件(或设备节点)来使用

andorid之摄像头驱动流程--MTK平台

原文地址:andorid之摄像头驱动流程--MTK平台 作者:守候心田 camera成像原理: 景物通过镜头生产光学图像投射到sensor表面上,然后转为模拟电信号,经过数模变成数字图像信号,在经过DSP加工出来,然后在通过IO接口传输到CPU处理.  由于摄像头满足总线.驱动.设备模型,那么看看andorid是怎么去实现摄像头的流程. 1.  注册Camera的platform平台设备 点击(此处)折叠或打开 CAMERA_HW_i2C_init platform_driver_registe

SylixOS中SD驱动实现流程

1.概述 本文档以imx6实验平台为例,介绍SD设备驱动实现流程. 2.SylixOS中SD系统框架 SylixOS中SD协议栈(以下称作SD Stack)结构如图 2.1所示. 图 2.1 SD 协议栈结构 1)Host层:硬件控制器抽象层,SD控制器在不同的硬件平台上可能有不同的实现,因此需要实现具体的传输处理操作.所有的控制器驱动都向上(Core层)提供统一的操作接口.SD Stack已经提供了符合SD规范的标准控制器SDHCI驱动,在此情况下,控制器驱动的编写将更加简单.当然也可使用SP

SylixOS下IIS驱动编程

目录 1. IIS简介    1 2. 数字声音简介    1 2.1    采样频率    1 2.2    量化位数    1 2.3    声道数    1 3. WAV音频文件格式简介    2 3.1    文件格式    2 3.2    原始声音数据的组织方式    2 4. Mini2440声卡的连接方式    3 4.1    相关连线说明    3 5. SylixOS下的OSS音频驱动接口    3 6. 播放声音流程    4 7. 录音流程    5 IIS简介 IIS

SylixOS中TPSFS格式化流程简析

1.TPSFS简介 TPSFS文件系统是一款掉电安全的文件系统,该系统是SylixOS内建文件系统(专利技术),该文件系统有如下特点: 采用B+树存储文件数据,读取与定位速度快,空间管理效率高: 对数据使用原子操作,掉电安全: 64位文件系统,支持EP级别文件长度: 大文件处理性能好: 支持文件记录锁,可支持大型数据库: 支持多块分配机制,提高了系统性能,使得分配器有了充足的优化空间: 支持子目录可扩展性,使得在一个目录下可以创建无数多个子目录. TPSFS文件系统结构如图 1.1所示. 图 1

SylixOS块设备驱动模型

1. 块设备简介 块设备是I/O设备中的一类,是将信息存储在固定大小的块中,每个块有自己的地址,数据块大小通常在512字节到32768字节之间.块设备的基本特征是每个块都能独立于其他块而读写.磁盘是最常见的块设备. 2. 技术实现 SylixOS实现了兼容POSIX标准的输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的概念,认为一切皆为文件.本章介绍SylixOS在I/O层之下提供的块设备模型,用户驱动可以使用此标准化的设备模型来编写,这样可以对上层提供统一的.标准的设备API,

04 Linux驱动流程

一.Linux 支持的设备类型 (1) 字符设备 : 每次按字节访问 (2) 块设备 : 每次按块访问(需要文件系统) (3) 网络设备 : 支持网络通信 注意: 字符设备和块设备在/dev/目录有对应的设备文件与他们的驱动程序对应  网络设备在Linux系统中,其驱动程序对应的网络接口(ifconfig命令查看) 二.Linux应用程序与驱动的关系 三.Linux 驱动添加流程 (1) 描述设备 =>用结构体分装{自己的特性 + 通用的部分} (2) 初始化设备 =>内核提供 (通用部分),