【XR806开发板试用】硬件定时器与OS定时器使用+注意问题

极术社区 2021-12-30 11:32:49

学习一款MCU,首先习惯学习它的外设,这里XR806的外设有一些Demo是在device\xradio\xr806\xr_skylark\project\example目录下的,但是直接编译这个目录下的例程,是会有问题的,也把问题发在了全志的论坛:问题

但目前没有解决,所以,就把相应的例程移植到led的例程中可以编译成功.

先上代码.

main的代码如下:

#include <stdio.h>
#include "ohos_init.h"
#include "kernel/os/os.h"
#include "iot_gpio.h"
#include "kernel/os/os_timer.h"
//#include "driver/chip/hal_gpio.h"
#include "driver/chip/hal_timer.h"
#include "driver/chip/hal_i2c.h"

static OS_Thread_t g_main_thread;

#define GPIO_ID_PA21 21

#define TIMERID TIMER0_ID
#define HFCLOCK 24000000 /*External clock frequency (Hz)*/
#define CLK_PRESCALER 4     /*clock prescale*/
#define COUNT_TIME 1     /*timer count down time (second)*/
uint32_t sec_count;

#define IIC_ID I2C0_ID
#define IIC_FREQ 200000
#define IIC_AT24C16_ADDR 0x50
#define IIC_AT24C16_PAGE_SIZE (16)

OS_Timer_t os_timer;//=0x1234;
uint32_t os_sec_count=0;
void os_timer_callback(void *arg)
{
    os_sec_count++;
    printf("os timer irq: %d\n\r", (int)os_sec_count);
    IoTGpioSetOutputVal(12, os_sec_count%2);
}
void os_timer_test(void)
{
    OS_Status status = OS_OK;
    status = OS_TimerCreate(&os_timer, OS_TIMER_PERIODIC, os_timer_callback, NULL, 1000);
    printf("os timer int error %d\n", status);
    status = OS_TimerStart(&os_timer);
    printf("os timer int error %d\n", status);
}
#if 1
void timer_callback(void *arg)
{
    sec_count++;
    printf(" timer irq: %d\n\r", sec_count);
    IoTGpioSetOutputVal(11, sec_count%2);
}
int timer_init(void)
{
    HAL_Status status = HAL_ERROR;
    TIMER_InitParam param;

    param.arg = NULL;
    param.callback = timer_callback;
    param.cfg = HAL_TIMER_MakeInitCfg(TIMER_MODE_REPEAT,      /*timer mode*/
                                      TIMER_CLK_SRC_HFCLK,      /*HFCLOCK*/
                                      TIMER_CLK_PRESCALER_4); /*CLK_PRESCALER*/
    param.isEnableIRQ = 1;
    param.period = COUNT_TIME * (HFCLOCK / CLK_PRESCALER);

    status = HAL_TIMER_Init(TIMERID, &param);
    if (status != HAL_OK)
        printf("timer int error %d\n", status);

    return status;
}

int timer_deinit(void)
{
    HAL_Status status = HAL_ERROR;

    status = HAL_TIMER_DeInit(TIMERID);
    if (status != HAL_OK)
        printf("timer deinit error %d\n", status);

    return status;
}
#endif
static void MainThread(void *arg)
{
    printf("LED test start\r\n");
    IoTGpioInit(GPIO_ID_PA21);
    IoTGpioSetDir(GPIO_ID_PA21, IOT_GPIO_DIR_OUT);

    IoTGpioInit(11);
    IoTGpioSetDir(11, IOT_GPIO_DIR_OUT);

    IoTGpioInit(12);
    IoTGpioSetDir(12, IOT_GPIO_DIR_OUT);



    timer_init();
    HAL_TIMER_Start(TIMERID);
    os_timer_test();
    while (1)
    {
        IoTGpioSetOutputVal(21, 1);
        OS_MSleep(500);
        IoTGpioSetOutputVal(21, 0);
        OS_MSleep(500);
    }
}

void LEDMain(void)
{
    printf("LED Test Start\n");
    if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL,
                        OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK)
    {
        printf("[ERR] Create MainThread Failed\n");
    }
}

SYS_RUN(LEDMain);

这个程序烧到板子上,发现两个定时器的时间不一样,串口输出如下 .
image.png

这就很奇怪了,例程中都是定时1s,于是都翻转个IO口进行测试.
波形如下,可以看到os定时器的时间是对的,硬件定时器的时间小于1S
IMG_20211229_170813.jpg
IMG_20211229_170738.jpg

于是在程序开始的地方,注意到

#define HFCLOCK 24000000

但XR806的晶振是40M才对.所以,修改后

#define HFCLOCK 40000000 

定时器时间才对上了.

image.png

不知道这个是例程的bug,还是这个例程原来是针对的是其他的板子的.

疑问

目前这个芯片折腾了有一段时间了,感觉整个的SDK的架构不是很明晰,在例程中直接使用鸿蒙的系统中的一些函数,却无法使用,如鸿蒙OS的定时器使用的是OsSwtmrTaskCreate,但在SDK中使用的是OS_TimerCreate,这个源码是在:

xr806_openharmony/device/xradio/xr806/xr_skylark/src/kernel/os/FreeRTOS

这看上去是FreeRTOS的内核中的函数,而不是鸿蒙的.而且看源码中的前面的注释,也真不是鸿蒙的.

/**
 * @file os_timer.c
 * @author XRADIO IOT WLAN Team
 */

/*
 * Copyright (C) 2017 XRADIO TECHNOLOGY CO., LTD. All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *    1. Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *    2. Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the
 *       distribution.
 *    3. Neither the name of XRADIO TECHNOLOGY CO., LTD. nor the names of
 *       its contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

真正的鸿蒙的内核源码应该是在:

/xr806_openharmony/kernel/liteos_m/kernel/src

但在这个目录下,并没有发现 .d与.o的文件,说明这里的文件是没有编译的.

所以.这里所说的支持鸿蒙,到底是支持的哪些,有一些搞不懂了.

...全文
429 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
源码链接: https://pan.quark.cn/s/8ddf8a1c92f9 **libcurl用于获取大型文件**libcurl作为一个开源的C语言库,提供了一系列的API来处理与URL相关的任务,涵盖了HTTP、FTP、SMTP等多种网络协议的应用。在执行大型文件的下载操作时,libcurl展现出卓越的性能表现和高度的灵活性,能够高效地管理大文件传输过程,有效预防内存溢出及其他潜在问题。**libcurl的基础操作**libcurl的基础应用包括以下几个环节:1. **初始化**:需要借助`curl_global_init()`函数来启动libcurl的工作环境。2. **建立会话句柄**:通过`curl_easy_init()`函数创建一个会话句柄,该句柄将用于后续所有的操作流程。3. **配置选项**:运用`curl_easy_setopt()`函数来设定多种参数,例如目标URL、超时时间、重试次数以及数据写入的回调函数等。4. **执行请求**:调用`curl_easy_perform()`函数来实施下载操作。5. **释放资源**:使用`curl_easy_cleanup()`函数来释放已经占用的资源。**获取大型文件时的重要设置**1. **数据写入回调函数**:在处理大型文件下载时,通常不希望一次性将整个文件载入内存。可以配置`CURLOPT_WRITEFUNCTION`选项,指定一个回调函数来处理接收到的数据片段,这样libcurl在接收到数据时会调用该函数,使得我们可以按需将数据写入文件或缓冲区。2. **缓冲策略**:可以设定缓冲区的大小(比如,通过`CURLOPT_BUFFERSIZE`),来控制每次接收数据的数量,从而优化内存...
内容概要:本文档整合了《鬼谷子·决篇》与《三略·审权变第三》《差德行第四》三大古代智慧典籍,构建了一套“决策+形势+用人”三位一体的领导力提升体系。通过28天三合实战路径、三维诊断工具、9个实用模板及独特的“身体锚点”仪式,系统解决管理者在决策犹豫、形势误判、人岗错配等方面的痛点。全文涵盖理论溯源、方法论拆解(如三步决策法、审权变四步法、差德行四步法)、历史案例对照(范蠡 vs 项羽)以及跨资源联动建议,形成从认知到实践的完整闭环。; 适合人群:中基层管理者、创业者、职场进阶者,尤其是面临决策困境、环境适应困难或团队用人问题的人群;具备一定管理经验或自我提升意识的个体亦可受益。; 使用场景及目标:① 提升重大事项的决策质量,避免反复纠结与事后后悔;② 增强对外部环境变化的敏感度与应对能力,实现灵活调整;③ 科学评估人才德才素质,实现人岗精准匹配,减少用人失误;④ 构建个人化的决策-应变-用人标准化流程(SOP)。; 阅读建议:建议按照28天路径逐步实践,结合自测表定位短板,优先突破薄弱模块;配套工具模板需实际填写使用,配合身体锚点仪式强化行为记忆;可与“诸葛亮决策术”“立将威信术”等单品联动,全面提升领导力体系。

31,527

社区成员

发帖
与我相关
我的任务
社区描述
欢迎加入极术社区,共创中国智能计算生态。社区提供智能计算领域的资讯,鼓励技术写作和问答互助,致力促进中国芯片技术的合作创新。地址:https://aijishu.com
人工智能 企业社区
社区管理员
  • 极术社区
  • 闫辉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧