电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>Arduino上的多任务处理

Arduino上的多任务处理

2023-06-14 | zip | 0.00 MB | 次下载 | 免费

资料介绍

描述

背景

作为大多数 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():打印内存池信息

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

  • 首先,定义原因的功能。返回值可以是“ 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

下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费