×

Arduino上的多任务处理

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-14

王越建

分享资料个

描述

背景

作为大多数 Arduino 玩家,我是从 Arduino Uno 开始的。很快我收集了很多盾牌。为了驱动这些屏蔽,我使用了各种库,它们占用了所有的内存空间。

所以我搬到了 Arduino Mega 并获得了很多乐趣,直到我开始从事一些更复杂的项目,比如玩显示器和声音。

最近,我再次将我的武器升级到 Arduino Due,它与我以前的板 (AVR) 具有完全不同的架构 (ARM Cortex-M)。毫无疑问,具有“巨大”内存空间和更高时钟速度的 32 位内核是一种强大的武器。但是,要充分利用电源,使用简单的“循环”功能可能还不够。这就是Arduino RT-Thread 库项目想要解决的问题。

RT-线程

RT-Thread是一个免费的开源(Apache 许可证 2.0)RTOS。一些独特的功能,如微型外壳(名为 FinSH)、动态加载模块和大量设备驱动程序,使其非常有趣。尽管最重要的特点是它有一个非常活跃的社区。

开始吧

该库托管在Github上,可以通过“Library Manager”安装。

目前,有两个可用的示例也列在“代码”部分。(稍后将提供更多示例。)

第一个示例“ Blink ”显示了如何创建和启动名为“Blink”的线程。“闪烁”线程的任务是以 1 秒的间隔闪烁内置 LED。

第二个示例“ FinSH ”显示了如何将用户定义的变量和命令添加到小 shell。有两个用户变量led_idled_state并实现了一个用户命令led()

芬兰

FinSH,小外壳接受 C 风格的输入(例如hello()),支持自动完成(例如 type lis[Tab])和历史记录(在发出几个命令后 try type)。

它提供了以下预定义命令。

  • hello():打印“Hello RT-Thread!”
  • version():打印版本信息
  • list(): 打印可用命令列表
  • list_mem():打印内存信息
  • list_thread():打印线程信息
  • list_sem():打印信号量信息
  • list_mutex():打印互斥量信息
  • list_event():打印事件信息
  • list_mb():打印邮箱信息
  • list_mq():打印消息队列信息
  • list_memp():打印内存池信息
  • list_timer(): 打印定时器信息

您可以通过两步添加自己的命令。

  • 首先,定义原因的功能。返回值可以是“ void”或任何类型。建议返回一个带有“ char”、“ byte”、“ short”、“ unsigned short”、“ int”或“ unsigned int”类型的值,因为这些类型可以被 FinSH 很好地解释。参数没有限制。(但是,FinSH 命令长度确实有限制,默认为 80 个字符。)所以任何数字和任何类型都可以。
  • 其次在“”中插入一行带有宏的行ADD_SHELL_CMD(command_name, command description, function_name, return_type, parameter list)shell_cmd.h

以下是添加用户命令的示例。

  • 定义函数led()
unsigned int led(unsigned int id, byte state) {
    // use "rt_kprintf()" to print a message
    rt_kprintf("led%d=%d\n", id, state);
    if (id != 0) {
        return 1;
    }
    if (state) {
        digitalWrite(LED_BUILTIN, HIGH);
    } else {
        digitalWrite(LED_BUILTIN, LOW);
    }
    return 0;
}
  • 在“”中添加一行shell_cmd.h
ADD_SHELL_CMD(led, Turn on/off builtin LED, led, unsigned int, unsigned int id, rt_int32_t val)

在上面的示例中,命令名称和函数名称是相同的。但是,它们可以不同。然后命令名成为函数名的别名。向 FinSH 发出命令时,应使用命令名称。

您也可以通过类似的步骤添加自己的变量。

  • 首先,定义一个变量。可用的类型有“ char”、“ byte”、“ char*”、“ short”、“ unsigned short”、“ short*”、“ int”、“ unsigned int”、“ int*”和“ void*”。
  • 其次,在“”中添加一行带有ADD_SHELL_VAR(variable_alias, variable description, variable_name, variable_type)宏的行shell_var.h这里对应的变量类型是“ finsh_type_char”、“ finsh_type_uchar”、“ finsh_type_charp”、“ finsh_type_short”、“ finsh_type_ushort”、“ finsh_type_shortp”、“ finsh_type_int”、“ finsh_type_uint”、“ finsh_type_intp”和“ finsh_type_voidp”。

以下是添加用户变量的示例。

  • 定义变量。
 unsigned int led_id = 0;
 byte led_state = 1;
  • 在“”中添加两行shell_var.h
ADD_SHELL_VAR(id, LED ID, led_id, finsh_type_uint)
ADD_SHELL_VAR(state, LED state, led_state, finsh_type_uchar)

上传示例草图“FinSH”后,打开“串行监视器”,您将看到小外壳。

\ | /
- RT -     Thread Operating System
/ | \     4.0.1 build Mar  8 2019
2006 - 2019 Copyright by rt-thread team
finsh >

尝试一些预定义的命令。

finsh >hello()
Hello RT-Thread!
       0, 0x00000000
finsh >list()
--Function List:
hello            -- say hello world
version          -- show RT-Thread version information
list             -- list available commands
list_mem         -- list memory usage information
list_thread      -- list thread
list_sem         -- list semaphore in system
list_mutex       -- list mutex in system
list_event       -- list event in system
list_mb          -- list mail box in system
list_mq          -- list message queue in system
list_memp        -- list memory pool in system
list_timer       -- list timer in system
led              -- Turn on/off builtin LED
--Variable List:
dummy            -- dummy variable for finsh
id               -- LED ID
state            -- LED state
       0, 0x00000000

您可能会注意到,在执行每个命令后,小 shell 会打印一行包含两个值“ 0, 0x00000000”。这两个值实际上是底层函数的返回值,有十进制和十六进制两种格式。hello()”和“ list()”返回“ void”。试图发出“ led(1, 0)”,你会得到一个不同的值(这是一个错误代码)。

现在尝试用户定义的命令和变量。正玩得开心!

finsh >id
       0, 0x00000000
finsh >state
       1, 0x00000001
finsh >led(id, state)
led0=1
       0, 0x00000000
finsh >state=0
       536870912, 0x20000000
finsh >led(id, state)
led0=0
       0, 0x00000000
finsh >led(1, 1)
led1=1
       1, 0x00000001
finsh >led(0, 1)
led0=1
       0, 0x00000000

下一步

我还没有展示如何使用信号量、互斥体、邮箱、内存池等内核实用程序的示例,尽管所有这些功能目前已在库中准备就绪。我稍后会更新库和这篇文章。同时,您可以查看原始 RT-Thread 项目中的示例

我还计划带回一些可选组件(我在移植时将其删除)并开发一些复杂的示例来展示 RT-Thread 的潜力。

谢谢阅读!

  • RT-Thread Primer(即将推出)

更新

  • 2019 年 3 月 15 日:该库已在“库管理器”中可用。
  • 2019 年 5 月 6 日:从 v0.5.1 开始,请使用ADD_FINSH_CMD而不是ADD_SHELL_CMD

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !