LinuxアプリケーションをAliOSThingsに簡単に移植する方法

1はじめに

近年、スマートスピーカー、さまざまな支払いデバイス、路上や路地にあるさまざまなサイズの広告機など、多くのスマートデバイスが人々の生活に取り入れられています。これらのデバイスのほとんどは依然としてLinuxを使用しており、画面を備えたデバイスのほとんどはAndroidを使用しているため、より高価なハードウェアを使用することになります。

 

AliOS Thingsは、IoTスマートデバイスで使用するためにAlibaba Cloud IoTによって開発された組み込みのリアルタイムオペレーティングシステムであり、HaaS100によって実行されるオペレーティングシステムです現在、AliOS Things + appletフレームワークはLinuxまたはAndroidに取って代わり、機器のコストを大幅に削減できます。しかし、Linux(Androidを含む)の成熟した安定したフレームワーク、特にオーディオとビデオの処理フレームワーク、グラフィックスレンダリングなどを使用し、適応させて最適化できれば、ホイールを繰り返す必要はありません。美しくありません。

 

Unix / Linuxなどのこれらの優れたフレームワークをAliOSThingsに簡単に移植するにはどうすればよいですか?POSIXをサポートすることは、この目標を達成するための武器です。

 

2.POSIXとは

POSIX(Portable Operating System Interface)は、異なるオペレーティングシステム間のアプリケーションの互換性を維持するためにIEEE組織によって策定された標準です。これには主に、API、シェル、ユーティリティなどのアプリケーション操作環境の完全なセットが含まれていますUNIX / LINUXオペレーティングシステム、および一部の組み込みオペレーティングシステム(Zephyr、VxWorks、QNX、Fuchsia、FreeRTOS、RT-Thread、AliOS Thingsなど)で広く使用されています

 

POSIX標準は、IEEE 1003、ISO / IEC 9945とも呼ばれます。現在の標準開発者は、IEEE、Open Group、およびISO / IECの共同組織であるAustinGroupです。現在のPOSIX標準の最新バージョンはPOSIX.1-2017です。当初、POSIX標準(IEEE 1003)はさまざまなサブセットに分割され、そのうちIEEE1003.13はまだ有効でした。IEEE 1003.13は、埋め込みフィールド用に策定された標準です。範囲のサイズに応じて、PSE51、PSE52、PSE53、およびPSE54の4つの異なるプロファイルに分けられます。関係を次の図に示します。

image.png

 

3.なぜPOSIXが必要なのですか

Internet of Thingsに組み込まれたリアルタイムオペレーティングシステムとして、AliOS ThingsがPOSIX標準をサポートするのはなぜですか?序文で紹介した問題を解決することに加えて、他の目的はありますか?この章では、包括的な説明を行います。

 

3.1、POSIXによって解決されたコア問題

ソフトウェアエコロジー

ソフトウェアエコロジーはOSの存続の中核ですが、OSソフトウェアエコロジーの構築は成功を熱望することはできません。それは何年もの蓄積と蓄積を必要とします。明らかに、AliOS Thingsのエコロジーはまだ未成熟ですが、Linuxのエコロジーは数十年の降水量の後に非常に強力になっています。POSIXをサポートできます

  • Unix / Linuxソフトウェアエコロジーと互換性があります。
  • POSIX標準(FreeRTOSなど)をサポートする組み込みシステムのソフトウェアエコロジーと互換性があります。

 

標準

  • APIモデルは、国際的な権威ある組織によって定義され、広く使用および検証されており、成熟していて安定しています。

 

使いやすい

  • APIは大多数の開発者に馴染みがあり、開発者の学習コストを削減します。
  • 各APIには詳細に標準化されたドキュメントがあり、クエリと使用に便利です。
  • Linuxへの移植など、複数のプラットフォームの使用とサポートを容易にするために、AliOSThingsの内部​​コンポーネントに標準インターフェイスを提供します。

 

3.2.POSIX標準をサポートするその他のオペレーティングシステム

実際、そう考えているのは私たちだけではありません。業界に組み込まれているリアルタイムオペレーティングシステムがPOSIX標準をサポートしているかどうかを見てみましょう。

 

VxWorks

比較的古い組み込みのリアルタイムオペレーティングシステムとして、VxWorksは、航空宇宙、産業用制御、および高いリアルタイムパフォーマンスを必要とするその他の分野など、多くの分野で広く使用されています。また、すべてPSE52をサポートするPOSIX標準のサポートを非常に重要視しています。標準+ BSDソケット。そして、公式のPSE52認証に合格しました。

 

QNX

QNXは、自動車分野で広く使用されている組み込みのリアルタイムオペレーティングシステムおよび比較的成功している商用マイクロカーネルオペレーティングシステムとして、POSIX標準のサポートも非常に重要視しており、すべてがPSE52標準+ BSDソケットをサポートしています。

 

フクシア

Googleが設計および開発した新しいマイクロカーネルオペレーティングシステムとして、FuchsiaはPOSIX標準もサポートしています。

 

FreeRTOS

FreeRTOSは、主にリソースが比較的限られているMCUデバイスに適用されますが、PSE52範囲の一部のAPIも実装しています。

 

RTスレッド

RT-Threadは、主にInternet of Thingsの分野のスマートデバイスで使用されます。また、POSIX標準のサポートにさらに注意を払い、PSE52範囲のほとんどのAPIを実装します。

 

POSIXをサポートするAliOSThingsの長期的な目標は、POSIX.1の最新バージョンを実現することです。たとえば、現在はPOSIX.1-2017です。合計1191個のAPIがあり、その数は非常に多いですが、頻繁に使用されないAPIが多数あるため、短期的な目標です。これは、PSE52 +ネットワーキング標準+プロジェクトに必要なAPIを実装するAPIです。

 

4.POSIXの設計と実装

カーネルとアプリケーションの間のインターフェース層として、POSIXはカーネルの多くの側面を含みます。以下では、POSIXスレッドとPOSIX条件変数のみを例として取り上げ、その設計と実装を紹介します。POSIXコンポーネントのコードはcore / osal / posix /にあり、ヘッダーファイルはinclude / posix /にあります。

4.1、POSIXスレッド

重要なデータ構造

typedef struct _pthread_tcb {
    unsigned int    magic;
    pthread_attr_t  attr;
    ktask_t        *tid;

    void *(*thread_entry)(void *para);
    void *thread_para;

    ksem_t *join_sem;

    unsigned char          cancel_state;
    volatile unsigned char cancel_type;
    volatile unsigned char canceled;

    _pthread_cleanup_t *cleanup;
    _pthread_environ_t *environ;

    void **tls;
    void  *return_value;
} _pthread_tcb_t;

_pthread_tcb_tは、POSIXスレッド内のコアデータ構造であり、POSIXスレッドのキーデータを保持します。カーネルタスクのtcb構造に対応し、tidを介して相互に関連付けられます。POSIXスレッドの主要なデータタイプpthread_tは、このデータ構造に関連付けられます。

  • Magicは、POSIXスレッドをAliOSThingsのネイティブAOSAPIを使用して作成されたスレッドと区別するための魔法の言葉です。
  • attrスレッド属性、POSIXスレッドの属性を設定して、スレッドの動作をよりきめ細かく制御します。スレッドスタックアドレス、スタックサイズ、スレッドスケジューリング戦略、スケジューリングパラメータなど。
  • tidは、カーネルタスクのtcb構造を指します。
  • thread_entry新しく作成されたスレッドの実行エントリ関数へのポインタ。
  • thread_para新しく作成されたスレッドの実行エントリ関数のパラメータ構造ポインタ。
  • join_semは、スレッドのJOINABLEセマフォを実装します。スレッドが終了しても、ptcbリソースは解放されません。他のスレッドはpthread_joinを呼び出して戻り値を取得し、リソースを解放します。
  • Cancel_state / cancel_type / cancelledはそれぞれ、POSIXスレッドのキャンセルステータス(キャンセルが有効かどうか)、キャンセルタイプ(遅延キャンセル、即時キャンセル)、およびキャンセルするかどうかを示します。POSIXスレッドのキャンセル機能はまだ実装されていません。
  • スレッドの終了時に実行されるクリーンアップ関数ポインターのリンクリスト。
  • tlsはスレッドのプライベートデータを格納します。
  • return_valueは、POSIXスレッドの戻り値へのポインターです。

 

POSIXスレッドの作成と破棄

pthread_createを使用してPOSIXスレッドを作成します。

pthread_exitを使用してPOSIXスレッドを破棄するか、スレッドのエントリ関数から戻ると、スレッド破棄プロセスにも進みます。

ロジックを明確にするために、次のフローチャートでは、例外処理などの多くの実装の詳細を省略しています。

posix1.png

 

4.2、POSIX条件変数

POSIX条件変数の標準定義:https//pubs.opengroup.org/onlinepubs/9699919799/

重要なデータ構造

typedef struct pthread_cond {
    kmutex_t *lock;
    int       waiting;
    int       signals;
    ksem_t   *wait_sem;
    ksem_t   *wait_done;

    pthread_condattr_t attr;
} pthread_cond_t;

pthread_cond_tは、POSIX条件変数を実装するコアデータ構造です。

  • lockは、内部データを保護するためのミューテックスロックです。
  • 待機中この条件変数を待機しているスレッドの数。
  • シグナル送信されたが確認されていないシグナルの数。
  • wait_semスレッドが待機するセマフォ、基礎となるカーネルのセマフォプリミティブ。
  • wait_doneは、スレッドと待機中のスレッドの間のハンドシェイク確認用のセマフォを送信するために使用されます。これは、基になるカーネルのセマフォプリミティブです。
  • attrは、条件変数によって使用されるクロックなど、pthread条件変数の属性を記録します。

 

POSIX条件変数処理

pthread-cond.png

POSIX条件変数は、単一の待機スレッドのトリガーをサポートするだけでなく、複数の待機スレッドをトリガーするブロードキャスト(pthread_cond_broadcast)もサポートします。

 

4.3、AliOSThingsでのPOSIXインターフェイスの実装

AliOS Thingsは、pthread、semaphore、message queue、timer、fsなどの複数のモジュールの豊富なAPIをサポートします。開発者はこれらのPOSIX APIを使用して、Unix / Linuxアプリケーションを移植するために簡単に、または変更せずに変更できます。 AliOSThingsについて。開発者は、HaaS100開発ボードと組み合わせることで、スマートデバイスに必要なソフトウェアとハ​​ードウェアをより迅速に構築できます。

 

5.お試しください

5.1。LinuxでPOSIXインターフェイスに基づいてアプリケーションを作成する

POSIX PTHREAD APIを使用して簡単なLinuxアプリケーションを作成し、pthread_test.cとして保存しましょう。

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

static volatile int count = 1;
pthread_mutex_t count_lock;

void* increase_count(void *arg)
{
    while (1) {
        sleep(1);
        pthread_mutex_lock(&count_lock);
        count += 10;
        printf("In new thread: count:%d\n", count);
        pthread_mutex_unlock(&count_lock);
    }
}


int main(int argc, char* argv[])
{
    int ret = 0;
    pthread_t new_thread;

    pthread_mutex_init(&count_lock, NULL);

    ret = pthread_create(&new_thread, NULL, increase_count, NULL);
    if (ret != 0) {
        printf("Error:%s:%d:ret:%d\n", __FILE__, __LINE__, ret);
        return -1;
    }

    while(1) {
        sleep(1);
        pthread_mutex_lock(&count_lock);
        count++;
        printf("In main thread: count:%d\n", count);
        pthread_mutex_unlock(&count_lock);
    }
    
    return 0;
}

Linuxでコンパイル

gcc pthread_test.c -o pthread_test -lpthread

結果は次のとおりです。

$ ./pthread_test 
In main thread: count:2
In new thread: count:12
In main thread: count:13
In new thread: count:23
In main thread: count:24
In new thread: count:34
In main thread: count:35
In new thread: count:45
In main thread: count:46
In new thread: count:56
In main thread: count:57
In new thread: count:67
In main thread: count:68
In new thread: count:78
In main thread: count:79
In new thread: count:89
In main thread: count:90
In new thread: count:100

5.2。AliOSThingsに移植

上記のpthread_test.cをAliOSThingsに移植し、デモアプリケーションapplication / example / helloworld_demoを書き直します。pthread_test.cのコンテンツをapplication / example / helloworld_demo / appdemo.cのコンテンツ全体に置き換え、次の2つの簡単な変更を加えます。

$ diff -ru ~/app/pthread_test.c  ~/project/gitee/AliOS-Things/AliOS-Things/application/example/helloworld_demo/appdemo.c 
--- ~/app/pthread_test.c	2020-12-10 23:02:56.915084914 +0800
+++ ~/project/gitee/AliOS-Things/AliOS-Things/application/example/helloworld_demo/appdemo.c	2020-12-10 23:06:10.616376591 +0800
@@ -1,6 +1,6 @@
 #include <stdio.h>
 #include <unistd.h>
-#include <pthread.h>
+#include <posix/pthread.h>
 
 static volatile int count = 1;
 pthread_mutex_t count_lock;
@@ -17,7 +17,7 @@
 }
 
 
-int main(int argc, char* argv[])
+int application_start(int argc, char* argv[])
 {
     int ret = 0;
     pthread_t new_thread;

上記から、AliOSThingsのアプリケーションエントリはmainではなくapplication_startであることがわかります。AliOS Thingsのposixヘッダーファイルは、posix /pthread.hなどのposixディレクトリにあります。

 

helloworld_demoをコンパイルします

aos make helloworld_demo@haas100 -c config
aos make

ダウンロードして書き込み、開始すると、ログは次のようになり、Linuxの実行結果と一致します。

             Welcome to AliOS Things           
     1592/main_task | sys_init aos_components_init done
     1592/main_task |         mesh has been opened        
     1986/mcu_audio | mcu_audio_main exit
[Jan 01 00:00:01.491]<I>ULOG-test sys_init aos_components_init done

In main thread: count:2
In new thread: count:12
In main thread: count:13
In new thread: count:23
In main thread: count:24
In new thread: count:34
In main thread: count:35
In new thread: count:45
In main thread: count:46
In new thread: count:56
In main thread: count:57
In new thread: count:67
In main thread: count:68
In new thread: count:78
In main thread: count:79
In new thread: count:89
In main thread: count:90
In new thread: count:100

LinuxからAliOSThingsにアプリケーションを移植するのは簡単ですか?一緒に試してみましょう。

 

6.参照リンク

POSIX.1-2017

AliOSThingsインターネットオブシングスオペレーティングシステム

 

7.開発者のテクニカルサポート

さらに技術的なサポートが必要な場合は、Dingding DeveloperGroupに参加できます

テクノロジーとソリューションの詳細については、AliyunAIoTホームページhttps://iot.aliyun.com/をご覧ください。

おすすめ

転載: blog.csdn.net/HaaSTech/article/details/111244885