Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AWS Lambda と Amazon SQS で「わかった気になれる」FreeRTOS 入門
Search
SORACOM
PRO
October 12, 2024
Technology
2
720
AWS Lambda と Amazon SQS で「わかった気になれる」FreeRTOS 入門
2024年10月12日開催『
JAWS FESTA 2024 in 広島
』で、ソラコム松下(max)が発表した資料です。
SORACOM
PRO
October 12, 2024
Tweet
Share
More Decks by SORACOM
See All by SORACOM
IoT でできること・取り組み方「後付け IoT」「組み込み IoT」と、IoTやSORACOMの仲間が共に学び交流するコミュニティ「SORACOM UG」
soracom
PRO
0
140
APIファーストで実現する運用性の高い IoT プラットフォーム: SORACOMのアプローチ
soracom
PRO
0
1.3k
IoTシステムの運用効率化に取り組もう! ― 回線管理とデバイス設定を自動化するための SORACOM API とプラットフォーム機能の活用
soracom
PRO
0
93
SORACOM のアーキテクチャと挑戦のフィールド
soracom
PRO
1
930
Technical Writing Meetup vol.39
soracom
PRO
2
910
今だからこそ振り返る、生成AIの基礎とこれからの使い道 ― デバイスから生成AIを使うには
soracom
PRO
0
62
【SORACOM UG】SORACOM におけるユーザーコミュニティの重要性とこれから
soracom
PRO
2
550
IoT とは?IoTプラットフォーム「SORACOM」の役割
soracom
PRO
0
430
Technical Writing Meetup vol.35
soracom
PRO
2
380
Other Decks in Technology
See All in Technology
『ささAI』ネタづくりをささえるAI📝 (にぼしいわし担当:GIFTech2025)
masapyon1212
0
100
データベース04: SQL (1/3) 単純質問 & 集約演算
trycycle
PRO
0
720
2025-04-24 "Manga AI Understanding & Localization" Furukawa Arata (CyberAgent, Inc)
ornew
2
400
2025年8月から始まるAWS Lambda INITフェーズ課金/AWS Lambda INIT phase billing changes
quiver
1
860
Aspire をカスタマイズしよう & Aspire 9.2
nenonaninu
0
380
C++26アップデート 2025-03
faithandbrave
0
1.2k
ビジネスとデザインとエンジニアリングを繋ぐために 一人のエンジニアは何ができるか / What can a single engineer do to connect business, design, and engineering?
kaminashi
2
890
RubyKaigi NOC 近況 2025
sorah
1
450
MCPを理解する
yudai00
14
9.9k
MCP でモノが動くとおもしろい/It is interesting when things move with MCP
bitkey
2
210
20 Years of Domain-Driven Design: What I’ve Learned About DDD
ewolff
1
270
猫でもわかるS3 Tables【Apache Iceberg編】
kentapapa
0
120
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
227
22k
The Cost Of JavaScript in 2023
addyosmani
49
7.8k
Scaling GitHub
holman
459
140k
Code Review Best Practice
trishagee
67
18k
Stop Working from a Prison Cell
hatefulcrawdad
268
20k
The Language of Interfaces
destraynor
158
25k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
Navigating Team Friction
lara
185
15k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.7k
Typedesign – Prime Four
hannesfritz
41
2.6k
Optimizing for Happiness
mojombo
378
70k
RailsConf 2023
tenderlove
30
1.1k
Transcript
AWS Lambda と Amazon SQS で 「わかった気になれる」FreeRTOS 入門 Oct. 12,
2024 JAWS FESTA 2024 in 広島 株式会社ソラコム テクノロジー・エバンジェリスト 松下 享平 (Max / @ma2shita)
株式会社ソラコム テクノロジー・エバンジェリスト 松下 享平 (まつした こうへい) "Max" • 静岡県民 新幹線通勤族
• 講演や執筆を中心に活動、登壇数600以上/累計 • 経歴: 東証二部ハードウェアメーカーで情シス、 EC 事業、IoT 事業開発を経て2017年より現職 • 好きな言葉「論よりコード」 • X(旧Twitter): @ma2shita • 好きなサービス: • SORACOM Funnel • AWS IoT Core • Pixel 9 Pro にしました WiJG?, Public domain, via Wikimedia Commons NEW!! NEW!!
運営の皆さん、ありがとうです! はじめましての人も (^^)/ #jawsfesta2024 #jawsfesta #jawsug
bus.jawsfesta2024.jaws-ug.jp は IoT ! GPS マルチユニット SORACOM Edition IoT の仲間が集まるコミュニティ
#SORACOMUG
19 < 43 そげんこげんにいる お気軽に話してみて、喜ぶから!
【このセッションは】 を知っていれば 20分後に このコードが読める ※しらんけど ※端折ったコードです AWS Lambda Amazon Simple
Queue Service (Amazon SQS) #include <FreeRTOS.h> struct QUEUE_DATA { uint8_t count; }; void readTask(void *pvParameters) { QueueHandle_t xQueue = pvParameters; struct QUEUE_DATA queue_data; for (;;) { int32_t data = _incoming_data(); if (data > 0) { queue_data.count = data; xQueueSend(xQueue, queue_data); } } } void sendTask(void *pvParameters) { QueueHandle_t xQueue = pvParameters; struct QUEUE_DATA queue_data; for (;;) { xQueueReceive(xQueue, queue_data); int16_t cId = Wio.SocketOpen("uni.soracom.io"); Wio.SocketSend(cId, queue_data.count); } } void setup() { QueueHandle_t xQueue = xQueueCreate(1); xTaskCreate(readButtonTask, xQueue); xTaskCreate(senddataTask, xQueue); vTaskStartScheduler(); } void loop () {} ※ コードは簡略化してます。正しい引数は調べてくださいね
FreeRTOS オープンソースの 組み込みシステム向け OS • OS(カーネル)名でもあり、 プロジェクト名でもある ライセンスは MIT #include
<FreeRTOS.h> struct QUEUE_DATA { uint8_t count; }; void readTask(void *pvParameters) { QueueHandle_t xQueue = pvParameters; struct QUEUE_DATA queue_data; for (;;) { int32_t data = _incoming_data(); if (data > 0) { queue_data.count = data; xQueueSend(xQueue, queue_data); } } } void sendTask(void *pvParameters) { QueueHandle_t xQueue = pvParameters; struct QUEUE_DATA queue_data; for (;;) { xQueueReceive(xQueue, queue_data); int16_t cId = Wio.SocketOpen("uni.soracom.io"); Wio.SocketSend(cId, queue_data.count); } } void setup() { QueueHandle_t xQueue = xQueueCreate(1); xTaskCreate(readButtonTask, xQueue); xTaskCreate(senddataTask, xQueue); vTaskStartScheduler(); } void loop () {} ※ コードは簡略化してます。正しい引数は調べてくださいね
改めて問おう、OS の機能とは? リソース 管理 入力、出力、記憶、 演算、制御 利用者の代わりに やってくれる
setup() {} loop() { int32_t data = _incoming_from_sensor(); if (data
> 0) { int16_t cId = Wio.SocketOpen("uni.soracom.io"); Wio.SocketSend(cId, data); } } センサーからデータを 読み出し (データがあったら) データを送信 え?明らかに簡潔で、 こっちの方が良くね? OS が無いと、どうなる? #include <FreeRTOS.h> struct QUEUE_DATA { uint8_t count; }; void readTask(void *pvParameters) { QueueHandle_t xQueue = pvParameters; struct QUEUE_DATA queue_data; for (;;) { int32_t data = _incoming_data(); if (data > 0) { queue_data.count = data; xQueueSend(xQueue, queue_data); } } } void sendTask(void *pvParameters) { QueueHandle_t xQueue = pvParameters; struct QUEUE_DATA queue_data; for (;;) { xQueueReceive(xQueue, queue_data); int16_t cId = Wio.SocketOpen("uni.soracom.io"); Wio.SocketSend(cId, queue_data.count); } } void setup() { QueueHandle_t xQueue = xQueueCreate(1); xTaskCreate(readButtonTask, xQueue); xTaskCreate(senddataTask, xQueue); vTaskStartScheduler(); } void loop () {} Arduino 初学者が書くと…? ※ コードは簡略化してます。正しい引数は調べてくださいね
OS が無いと、どうなる? じゃあ、どうする? センサーの読み出しと、 データ送信を 非同期(マルチタスク) 化とか? setup() {} loop()
{ int32_t data = _incoming_data(); if (data > 0) { int16_t cId = Wio.SocketOpen("uni.soracom.io"); Wio.SocketSend(cId, data); } } 通信に時間がかかっちゃったら そこで試合終了(この間のデータが読めない)だよ! ※ コードは簡略化してます。正しい引数は調べてくださいね
AWS なら、簡単なのに Amazon SQS AWS Lambda 《受付処理》 AWS Cloud AWS
Lambda 《API 呼び出し処理》 読み取りタスク 送信タスク プロセス間通信 センサー マイコン こうならないかなぁ? なんやかんやのデータ 横道: Lambda Web Adapter 便利っすよね
そこで FreeRTOS #include <FreeRTOS.h> struct QUEUE_DATA { uint8_t count; };
void readTask(void *pvParameters) { QueueHandle_t xQueue = pvParameters; struct QUEUE_DATA queue_data; for (;;) { int32_t data = _incoming_data(); if (data > 0) { queue_data.count = data; xQueueSend(xQueue, queue_data); } } } void sendTask(void *pvParameters) { QueueHandle_t xQueue = pvParameters; struct QUEUE_DATA queue_data; for (;;) { xQueueReceive(xQueue, queue_data); int16_t cId = Wio.SocketOpen("uni.soracom.io"); Wio.SocketSend(cId, queue_data.count); } } void setup() { QueueHandle_t xQueue = xQueueCreate(1); xTaskCreate(readButtonTask, xQueue); xTaskCreate(senddataTask, xQueue); vTaskStartScheduler(); } void loop () {} このコードが、 すでに Amazon SQS + AWS Lambda なコード ※ コードは簡略化してます。正しい引数は調べてくださいね
書き換えてみよう! #include <FreeRTOS.h> struct QUEUE_DATA { uint8_t count; }; void
readTask(void *pvParameters) { queue_url = pvParameters; struct QUEUE_DATA queue_data; for (;;) { int32_t data = _incoming_data(); if (data > 0) { queue_data.count = data; xQueueSend(queue_url, queue_data); } } } void sendTask(void *pvParameters) { queue_url = pvParameters; struct QUEUE_DATA queue_data; for (;;) { xQueueReceive(queue_url, queue_data); int16_t cId = Wio.SocketOpen("uni.soracom.io"); Wio.SocketSend(cId, queue_data.count); } } void setup() { SQS MyQueue = xQueueCreate(1); xTaskCreate(readButtonTask, MyQueue); xTaskCreate(senddataTask, MyQueue); vTaskStartScheduler(); } void loop () {} キュー作成 1 (データがあったら) キューへ送信 3 Queue 着信の トリガー設定 2 readTask sendTask MyQueue マイコン おめでとうございます! もう、読めるようになりましたね! ※ コードは簡略化してます。正しい引数は調べてくださいね
どこが “OS” なの? xTaskCreate() は fork(3) vTaskStartScheduler() は fg(1) xHoge
vBar 等の関数は #include <FreeRTOS.h> = “組み込む” ことで、 OS の機能が使えるから 組み込み OS !! #include <FreeRTOS.h> struct QUEUE_DATA { uint8_t count; }; void readTask(void *pvParameters) { queue_url = pvParameters; struct QUEUE_DATA queue_data; for (;;) { int32_t data = _incoming_data(); if (data > 0) { queue_data.count = data; xQueueSend(queue_url, queue_data); } } } void sendTask(void *pvParameters) { queue_url = pvParameters; struct QUEUE_DATA queue_data; for (;;) { xQueueReceive(queue_url, queue_data); int16_t cId = Wio.SocketOpen("uni.soracom.io"); Wio.SocketSend(cId, queue_data.count); } } void setup() { SQS MyQueue = xQueueCreate(1); xTaskCreate(readButtonTask, MyQueue); xTaskCreate(senddataTask, MyQueue); vTaskStartScheduler(); } void loop () {} ※ コードは簡略化してます。正しい引数は調べてくださいね
実は、SORACOM Discovery 2024 の 「心が動いたボタン」の実装に使ってました!
AWS Lambda と Amazon SQS で わかった気になれる FreeRTOS Disclaimer: 雰囲気での紹介だからね
FreeRTOS の 25% くらい こんなもんじゃない! IoT に興味があったり、 「実はハードウェア屋だぜ」な方、 ぜひ声かけてくださいね! FreeRTOS
IoT の「つなぐ」を簡単に You Create. We Connect.