1305|0

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【AG32VF407测评】RT-Thread的应用 [复制链接]

  本帖最后由 lenxvp 于 2023-8-13 19:11 编辑

实在没想到的是AG32VF407已经把RT-Thread移植好了,直接就能使用了,作为一款国产的RTOS,RT-Thread拥有很丰富的第三方支持库,与AG32VF407的结合应该算上强强联合了吧

 

本贴简单介绍一下怎么使用在AG32VF407使用RT-Thread,为了方便,以下把RT-Thread简称为RTT

本例使用两个RTT的线程,每个线程负责一个LED灯的闪烁,并且两个线程通过互斥锁进行同步,实现交叉闪烁的效果

 

新建工程就略过了,在platform.ini文件中framework变量需要新加上RTT的framework

framework = agrv_sdk, agrv_rtthread
program = hello_rtt

另外还需要添加RTT的组件配置参数,暂不知道这个的规则,从官方示例照抄过来的

# Specify the components to be included
rtthread_component = finsh utilities/ulog
rtthread_depend =
build_rtthread_flags =

在src目录下新建rtconfig.h文件,这个是RTT的全局参数配置文件,RTT的定制参数都可以在这里配置,也可以从官方给的示例里拷贝过来

新建board.c文件,编写RTT的板级初始化函数rt_hw_board_init

#include "rthw.h"
#include "board.h"


#ifdef RT_USING_HEAP
#define RT_HEAP_SIZE 4096
static uint32_t rt_heap[RT_HEAP_SIZE];
#endif

void rt_hw_board_init(void)
{
    board_init();
    SYS_SetMtimeDebugStop();
    rt_hw_interrupt_init();

#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif
#ifdef RT_USING_HEAP
    rt_system_heap_init(rt_heap, rt_heap + RT_HEAP_SIZE);
#endif
}

这里还配置了内存堆的初始化,可以根据需要进行配置,然后是用于支持RTT FinSH控制台的两个串口映射函数

// UART support for FINSH
void rt_hw_console_output(const char *str)
{
    UART_Send(MSG_UART, (unsigned char *)str, rt_strlen(str));
}

char rt_hw_console_getchar(void)
{
    unsigned char ch;
    if (UART_ReceiveCh(MSG_UART, &ch, 0) == 1){
        return ch;
    } else {
        rt_thread_mdelay(10);
    }
    return -1;
}

然后新建mian.c文件,初始化互斥锁和两个LED线程

#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 5

ALIGN(RT_ALIGN_SIZE)
static char led0_thread_stack[THREAD_STACK_SIZE];
static char led1_thread_stack[THREAD_STACK_SIZE];
static struct rt_thread led0_tid;
static struct rt_thread led1_tid;
static struct rt_mutex led_mtx;
void led_blink(uint8_t no)
{
    switch(no) {
    case 0:
        GPIO_Toggle(LED_GPIO, GPIO_BIT3);
        break;
    case 1:
        GPIO_Toggle(LED_GPIO, GPIO_BIT4);
        break;
    }
}

void led_thread(void *parameter)
{
    int no = *(int*)(parameter);
    while (1)
    {
        rt_mutex_take(&led_mtx, RT_WAITING_FOREVER);
        led_blink(no);
        rt_thread_delay(200);
        rt_mutex_release(&led_mtx);
    }
}

int main(void)
{
    int led0_no = 0;
    int led1_no = 1;
    ulog_init();

    rt_mutex_init(&led_mtx, "led_mtx", RT_IPC_FLAG_FIFO);

    rt_thread_init(&led0_tid, "led1", led_thread, &led0_no, led0_thread_stack, THREAD_STACK_SIZE, 5, 10);
    rt_thread_init(&led1_tid, "led2", led_thread, &led1_no, led1_thread_stack, THREAD_STACK_SIZE, 5, 10);

    rt_thread_startup(&led0_tid);
    rt_thread_startup(&led1_tid);

    return 0;
}

ve里面只需要映射两个LED和串口的引脚即可,不再累述

编译后下载查看串口输出和LED闪烁效果

 

WeChat_20230813190614

附上工程的代码  rtt.zip (3.48 KB, 下载次数: 22)
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表