打印
[活动专区]

【AT-START-L021 测评】FreeRTOS+nr_micro_shell初尝试

[复制链接]
2064|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xhackerustc|  楼主 | 2025-1-2 22:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ArterySW 于 2025-1-8 15:23 编辑

#申请原创#@21小跑堂


AT32L021这款芯片的flash和sram其实已经足够跑一个RTOS了,笔者本来计划移植下Nuttx RTOS的,但 移植后测试结果发现Nuttx的flash和sram占用对于资源比较少的MCU系统还是比较高的,即它的功能集/flash or sram占用这个指标对于flash和sram较少的MCU来说很低,这和Nuttx的设计实现有关系,它做了很多抽象又号称实现了posix,所以代码中有很多中间分层部分。对于flash/sram资源比较充足的MCU,Nuttx挺合适的。等有空笔者写一篇RTOS比较文章,此为题外话略过不再提。接下来比较合适的RTOS 选择是ThreadX、FreeRTOS以及RT-Thread Nano,笔者这次选了FreeRTOS,原因无他,官方的Firmware Library已经做好了FreeRTOS适配,在middlewares/freertos/目录下还有现成的FreeRTOS代码,在utilities/at32l021_freertos_demo有现成的demo例程,咱就用它了省点力气嘿嘿。

1. shell选择
当下shell有不少选择,比如Letter shell, microshell(就是面包板os中用的那个shell), nr_micro_shell等等,笔者觉得它们其实差不太多,你会用其中一个,其它的也会用了。实际使用时挑一个顺眼的即可,笔者这次选中的是nr_mircro_shell。

2. nr_micro_shell的移植
nr_micro_shell的移植很简单的,主要完成一件事:循环获取串口终端的输入字符,然后作为参数传给shell()函数即可。获取输入字符蛮简单的,串口接收中断中读寄存器就能获取输入字符啦。但这里还 是有一些技巧的,因为我们是RTOS环境,为了效率我们不太可能在中断中就调用shell()函数,我们更 期望的是在一个任务中执行shell()函数,这样就涉及到中断中获得的串口输入怎么传递给shell任务,而且还不能丢掉输入字符。本论坛网友的解决方案是自己实现了一个ringbuf,然后通过信号量唤醒shell任务。shell任务醒来后读取ringbuf,不断读取数据后以参数传递给shell(),此过程持续到ringbuf为空,然后再次阻塞在take信号量上。但是笔者认为FreeRTOS的队列在这里非常适合,如果FreeRTOS自带的原语能满足需求那么就一定不再重新发明轮子。

3. 主要逻辑
shell任务很简单,代码片段如下所示:
static void task_shell(void const *argument)
{
  unsigned char ch;

  while (1) {
    if (xQueueReceive(rx_queue, &ch, portMAX_DELAY))
      shell(ch);
  }
}
它主要就是不断尝试获取队列中的数据,如果成功就以参数传给shell(),如果不能,那按FreeRTOS队 列的设计,shell任务就会阻塞

接下来看串口的中断处理,代码如下所示:
void USART1_IRQHandler(void)
{
  uint8_t rxdata;
  BaseType_t xHigherPriorityTaskWoken = pdFALSE;

  if(usart_interrupt_flag_get(USART1, USART_RDBF_FLAG) != RESET)
  {
    /* read one byte from the receive data register */
    rxdata = usart_data_receive(USART1);
    xQueueSendFromISR(rx_queue, &rxdata, &xHigherPriorityTaskWoken);
    if(xHigherPriorityTaskWoken == pdTRUE)
      portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  }
}
中断处理逻辑为:读取串口中断标志,如果是RDBF表明串口有输入数据,那么就调用usart_data_receive()函数读取串口输入数据,然后发送给队列。为什么调用portYIELD_FROM_ISR()网上有很多文章,这里不再赘述,简而言之一句话:如果有高优先级任务Ready就主动触发调度。这其实是FreeRTOS环境中 中断处理的一个基本套路。

4. nr_micro_shell命令的添加
关于添加命令这一块,nr_micro_shell自身的文档、本论坛网友文章都有提及,笔者不再赘述了。笔者利用FreeRTOS的一些API实现了一些类linux命令,比如uptime、msleep、free、ps、top等。其中uptime就是xTaskGetTickCount(), msleep()就是利用vTaskDelay()函数,free就是vPortGetHeapStats()然后解析HeapStats_t结构体的一些字段,ps就是利用vTaskList(),top就是利用vTaskGetRunTimeStats()函数。

附上AT32L021上的运行视频给大家欣赏:https://www.bilibili.com/video/BV1X96zY6Ec7/


使用特权

评论回复
沙发
电竞孔乙己| | 2025-1-7 15:51 | 只看该作者
RTOS中的shell是个啥

使用特权

评论回复
板凳
时光迷宫| | 2025-1-9 17:55 | 只看该作者
RTOS中使用shell的作用是啥,没看懂

使用特权

评论回复
地板
xhackerustc|  楼主 | 2025-1-9 19:36 | 只看该作者
就和linux下带bash等shell,RT-Thread带finsh作用一样

使用特权

评论回复
5
febgxu| | 2025-2-4 16:53 | 只看该作者
FreeRTOS 是一个轻量级的实时操作系统内核,它为 AT - START - L021 带来了强大的实时性和多任务处理能力。

使用特权

评论回复
6
jtracy3| | 2025-2-4 19:11 | 只看该作者
nr_micro_shell 提供了基本的命令行交互功能,能够通过串口接收用户输入的命令并执行相应的操作。需要验证命令的解析和执行是否准确,以及是否支持常见的命令操作,如查询、设置等。

使用特权

评论回复
7
usysm| | 2025-2-4 21:27 | 只看该作者
学习 FreeRTOS 和 nr_micro_shell 的使用需要一定的时间和精力。

使用特权

评论回复
8
uytyu| | 2025-2-4 22:00 | 只看该作者
在AT-START-L021开发板上引入nr_micro_shell,可以通过串口终端与单片机进行交互,获取、设置某些参数或执行某些操作,极大地提高了开发和调试的便利性。

使用特权

评论回复
9
cemaj| | 2025-2-5 09:11 | 只看该作者
FreeRTOS是一个开源的实时操作系统,具有良好的可移植性和稳定性。在AT-START-L021开发板上集成FreeRTOS,可以充分利用其任务调度、资源管理等功能,提高系统的实时性和可靠性。

使用特权

评论回复
10
mikewalpole| | 2025-2-5 10:46 | 只看该作者
结合 FreeRTOS 和 nr_micro_shell 的设计,鼓励采用模块化的开发方式。

使用特权

评论回复
11
yeates333| | 2025-2-5 11:18 | 只看该作者
通过串口实现与外部设备的通信,确保数据传输的稳定性和可靠性。需要验证在不同波特率下的通信效果,以及是否支持必要的通信协议。

使用特权

评论回复
12
saservice| | 2025-2-5 12:19 | 只看该作者
nr_micro_shell是一个针对资源较少的MCU编写的基本命令行工具,占用资源少,使用简单灵活。

使用特权

评论回复
13
jimmhu| | 2025-2-5 13:51 | 只看该作者
nr_micro_shell的使用为开发者提供了一个便捷的交互界面,可以执行各种命令来控制和调试系统。

使用特权

评论回复
14
sesefadou| | 2025-2-5 17:32 | 只看该作者
nr_micro_shell 提供了一个命令行接口,允许开发者通过串口等方式与系统进行交互。开发者可以方便地输入各种命令来控制系统的运行

使用特权

评论回复
15
maudlu| | 2025-2-5 20:16 | 只看该作者
FreeRTOS的集成提供了多任务处理能力,这对于复杂嵌入式系统的设计和管理非常有用。

使用特权

评论回复
16
uiint| | 2025-2-6 12:36 | 只看该作者
多个任务可以在 FreeRTOS 的调度下并发执行,充分利用 AT - START - L021 的处理器资源。

使用特权

评论回复
17
louliana| | 2025-2-6 14:49 | 只看该作者
这为系统的调试和维护提供了极大的便利,减少了开发周期和成本。

使用特权

评论回复
18
belindagraham| | 2025-2-6 16:16 | 只看该作者
nr_micro_shell还支持Tab键命令补全、查询历史命令等功能

使用特权

评论回复
19
maqianqu| | 2025-2-6 18:39 | 只看该作者
FreeRTOS 和 nr_micro_shell 相对来说比较轻量级

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

103

帖子

0

粉丝