【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)
|