rtos only 如何调用pmu?

Viewed 144
4 Answers
  1. pmu目前在rtos only的驱动并不完善,只能通过寄存器来操作
  2. 可以使用pmu的那8个单独的io
  3. 支持中断功能的
  1. 可以使用那8个单独的IO是指可以当成普通IO来用 还是要使用特定的API来用? 3.如何使用中断的啊? 没有看到任何相关的例子啊 能看到的例子都是通过ioctl在不停的轮询

可以当作普通io用,需要配置fpioa,中断的话,最近会更新增加支持

大概还有几天增加支持呢? 我好随时更新 我按键太多了 现在一直轮询效率实在太低了

/**
 * @file zj_time.c
 * @brief
 * @version 1.0.0
 * @date 2025年4月12日17:29:39
 */
#include <sys/time.h>

#include <time.h>

#include <sys/ioctl.h>

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/* 最后包含自定义头文件 */
#include "zj_log.h"
#include "zj_time.h"

/* 时间设备命令定义 */
#define MISC_DEV_CMD_NTP_SYNC          (0x1024 + 7)
#define MISC_DEV_CMD_GET_UTC_TIMESTAMP (0x1024 + 8)
#define MISC_DEV_CMD_SET_UTC_TIMESTAMP (0x1024 + 9)
#define MISC_DEV_CMD_GET_LOCAL_TIME    (0x1024 + 10)
#define MISC_DEV_CMD_SET_TIMEZONE      (0x1024 + 11)
#define MISC_DEV_CMD_GET_TIMEZONE      (0x1024 + 12)

/**
 * @brief 通过misc设备获取/设置系统信息
 * @param cmd 命令ID
 * @param args 参数指针
 * @return 0-成功,其他-失败
 */
static int canmv_misc_dev_ioctl(int cmd, void* args)
{
    int misc_dev_fd = -1;
    int ret         = -1;

    // 打开misc设备
    misc_dev_fd = open("/dev/canmv_misc", O_RDWR);
    if (misc_dev_fd < 0) {
        LOG_I("无法打开misc设备: %s", strerror(errno));
        return -1;
    }

    // 执行ioctl命令
    ret = ioctl(misc_dev_fd, cmd, args);
    if (ret != 0) {
        LOG_I("ioctl misc设备失败,命令 %x: %s", cmd, strerror(errno));
        close(misc_dev_fd);
        return -2;
    }

    // 关闭设备
    close(misc_dev_fd);
    return 0;
}

/**
 * @brief 获取当前UTC时间戳
 * @return 当前UTC时间戳(秒),失败返回0
 */
time_t get_timestamp(void)
{
    time_t timestamp = 0;

    if (canmv_misc_dev_ioctl(MISC_DEV_CMD_GET_UTC_TIMESTAMP, &timestamp) != 0) {
        LOG_I("获取时间戳失败");
        return 0;
    }

    return timestamp;
}

/**
 * @brief 获取本地时间
 * @param tm_info 输出参数,存储本地时间信息
 * @return 0-成功,其他-失败
 */
int get_localtime(struct tm* tm_info)
{
    if (!tm_info) {
        return -1;
    }

    if (canmv_misc_dev_ioctl(MISC_DEV_CMD_GET_LOCAL_TIME, tm_info) != 0) {
        LOG_I("获取本地时间失败");
        return -2;
    }

    return 0;
}

你这个是怎么配置的?

我将menuconfig的图更新在这里了 这两个库编译过程中可以看到都成功了 但是lib文件夹中看不到他们的.a文件 和以前不一样了

需要更新一下makefile,使用这里的lib
src/rtsmart/mpp/middleware/src/ffmpeg/src/lib_ffmpeg
src/rtsmart/mpp/middleware/src/x264/src/lib_x264

/**
 * @file zj_time.c
 * @brief
 * @version 1.0.0
 * @date 2025年4月12日17:29:39
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <errno.h>
#include <fcntl.h>
#include <unistd.h>

#include <time.h>
#include <sys/ioctl.h>
#include <sys/time.h>

/* 时间设备命令定义 */
#define MISC_DEV_CMD_NTP_SYNC          (0x1024 + 7)
#define MISC_DEV_CMD_GET_UTC_TIMESTAMP (0x1024 + 8)
#define MISC_DEV_CMD_SET_UTC_TIMESTAMP (0x1024 + 9)
#define MISC_DEV_CMD_GET_LOCAL_TIME    (0x1024 + 10)
#define MISC_DEV_CMD_SET_TIMEZONE      (0x1024 + 11)
#define MISC_DEV_CMD_GET_TIMEZONE      (0x1024 + 12)

/**
 * @brief 通过misc设备获取/设置系统信息
 * @param cmd 命令ID
 * @param args 参数指针
 * @return 0-成功,其他-失败
 */
static int canmv_misc_dev_ioctl(int cmd, void* args)
{
    int misc_dev_fd = -1;
    int ret         = -1;

    // 打开misc设备
    misc_dev_fd = open("/dev/canmv_misc", O_RDWR);
    if (misc_dev_fd < 0) {
        printf("无法打开misc设备: %s", strerror(errno));
        return -1;
    }

    // 执行ioctl命令
    ret = ioctl(misc_dev_fd, cmd, args);
    if (ret != 0) {
        printf("ioctl misc设备失败,命令 %x: %s", cmd, strerror(errno));
        close(misc_dev_fd);
        return -2;
    }

    // 关闭设备
    close(misc_dev_fd);
    return 0;
}

/**
 * @brief 获取当前UTC时间戳
 * @return 当前UTC时间戳(秒),失败返回0
 */
time_t get_timestamp(void)
{
    time_t timestamp = 0;

    if (canmv_misc_dev_ioctl(MISC_DEV_CMD_GET_UTC_TIMESTAMP, &timestamp) != 0) {
        printf("获取时间戳失败");
        return 0;
    }

    return timestamp;
}

/**
 * @brief 获取本地时间
 * @param tm_info 输出参数,存储本地时间信息
 * @return 0-成功,其他-失败
 */
int get_localtime(struct tm* tm_info)
{
    if (!tm_info) {
        return -1;
    }

    if (canmv_misc_dev_ioctl(MISC_DEV_CMD_GET_LOCAL_TIME, tm_info) != 0) {
        printf("获取本地时间失败");
        return -2;
    }

    return 0;
}

你好,这个我测试编译不会报错的

有包含和链接ffmpeg和x264吗? 不包含的话不会报错的

没有,只是测试这个能不能编译成功

直接编译可以成功的 要包含ffmpeg的头才行 我刚刚进行了更细粒度的测试 发现只在包含了CFLAGS += -I$(FFMPEG_DIR)/include/libavutil 后才会报错 一旦注释掉这一句就不会报错了 我将图放在楼下了

image.png

感觉是有同名文件冲突了