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
660
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
APIファーストで実現する運用性の高い IoT プラットフォーム: SORACOMのアプローチ
soracom
PRO
0
1.2k
IoTシステムの運用効率化に取り組もう! ― 回線管理とデバイス設定を自動化するための SORACOM API とプラットフォーム機能の活用
soracom
PRO
0
73
SORACOM のアーキテクチャと挑戦のフィールド
soracom
PRO
1
870
Technical Writing Meetup vol.39
soracom
PRO
2
850
今だからこそ振り返る、生成AIの基礎とこれからの使い道 ― デバイスから生成AIを使うには
soracom
PRO
0
53
【SORACOM UG】SORACOM におけるユーザーコミュニティの重要性とこれから
soracom
PRO
2
500
IoT とは?IoTプラットフォーム「SORACOM」の役割
soracom
PRO
0
400
Technical Writing Meetup vol.35
soracom
PRO
2
350
AI でアップデートする既存テクノロジーと、クラウドエンジニアの生きる道
soracom
PRO
2
1.1k
Other Decks in Technology
See All in Technology
技術的負債を正しく理解し、正しく付き合う #phperkaigi / PHPerKaigi 2025
shogogg
7
1.8k
LINE Notify互換のボットを作った話
kenichirokimura
0
180
Vision Language Modelを活用した メルカリの類似画像レコメンドの性能改善
yadayuki
9
1.2k
Security response for open source ecosystems
frasertweedale
0
100
大規模プロジェクトにおける 品質管理の要点と実践 / 20250327 Suguru Ishii
shift_evolve
0
280
20250326_管理ツールの権限管理で改善したこと
sasata299
1
380
アプリケーション固有の「ロジックの脆弱性」を防ぐ開発者のためのセキュリティ観点
flatt_security
28
11k
Road to SRE NEXT@仙台 IVRyの組織の形とSLO運用の現状
abnoumaru
0
390
AIエージェント完全に理解した
segavvy
4
260
Restarting_SRE_Road_to_SRENext_.pdf
_awache
0
160
Keynote - KCD Brazil - Platform Engineering on K8s (portuguese)
salaboy
0
120
Amazon Q Developer 他⽣成AIと⽐較してみた
takano0131
1
120
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
693
190k
Product Roadmaps are Hard
iamctodd
PRO
52
11k
It's Worth the Effort
3n
184
28k
A better future with KSS
kneath
238
17k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Being A Developer After 40
akosma
90
590k
Git: the NoSQL Database
bkeepers
PRO
429
65k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Side Projects
sachag
452
42k
The Cult of Friendly URLs
andyhume
78
6.3k
Writing Fast Ruby
sferik
628
61k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.6k
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.