主頁 >  其他 > 如何輕松地移植Linux應用到AliOS Things上

如何輕松地移植Linux應用到AliOS Things上

2020-12-17 12:21:23 其他

1、前言

近些年,大量的智能設備已經進入人們的生活, 如智能音箱,各種支付設備,大街小巷上各種大小的廣告機等,這些設備中大多還是采用Linux,帶屏的設備則大多采用Android,導致他們必須采用較高成本的硬體,

AliOS Things是阿里云IoT研發的應用于物聯網智能設備的嵌入式實時作業系統,是HaaS100搭載的作業系統,目前AliOS Things + 小程式框架已經可以替代Linux甚至Android,大大降低設備的成本,可是Linux(包括Android)上的成熟穩定的框架,尤其是音視頻處理的框架,圖形渲染等,如果可以拿來使用,再加以適配優化,不需要重復造輪子,豈不美哉,

那如何把Unix/Linux這些優秀的框架輕松地移植到AliOS Things上呢?支持POSIX就是實作這個目標的一把利器,

2、POSIX是什么

POSIX(Portable Operating System Interface)是IEEE組織為了維護應用在不同作業系統之間的兼容性而制定的標準, 主要包括API,Shell和Utility等一整套應用運行環境,廣泛應用于UNIX/LINUX作業系統,和一些嵌入式作業系統中(如Zephyr, VxWorks, QNX, Fuchsia,FreeRTOS,RT-Thread,AliOS Things),

POSIX標準也被稱為IEEE 1003,ISO/IEC 9945,目前標準的開發者是Austin Group,它是IEEE, Open Group, ISO/IEC的聯合組織,目前POSIX標準的最新版本是POSIX.1-2017, 剛開始時POSIX標準(IEEE 1003)又分為不同的子集,其中還處于有效狀態的有IEEE 1003.13, IEEE 1003.13是針對嵌入式領域制定的標準,根據范圍的大小又分為4個不同的Profile,PSE51, PSE52, PSE53和PSE54,其關系如下圖,

image.png

3、為什么需要POSIX

AliOS Things作為一個物聯網領域的嵌入式實時作業系統為什么要支持POSIX標準呢?除了解決前言引入的問題外,還有沒有其他的目的呢?本章節將進行一個全面的闡述,

3.1、POSIX解決的核心問題

軟體生態

軟體生態是一個OS的生存核心,但建設一個OS的軟體生態又不能急于求成, 需要經過多年的積累沉淀, 顯然AliOS Things的生態還不成熟,而Linux的生態則經過了幾十年的沉淀,變得非常強大,支持POSIX則可以

  • 兼容Unix/Linux軟體生態,
  • 兼容支持POSIX標準的嵌入式系統(如FreeRTOS)的軟體生態,

標準

  • API模型由國際權威組織定義,且被廣泛使用驗證過,成熟穩定,

易用

  • API被廣大開發者所熟悉,降低開發者學習成本,
  • 每個API都有標準化的檔案詳細說明,方便查詢使用,
  • 為AliOS Things內部組件提供標準介面,方便使用和支持多平臺如移植到Linux,

3.2、其它支持POSIX標準的作業系統

其實不只有我們這么想,讓我們一起看看業界的嵌入式實時作業系統是否支持POSIX標準,

VxWorks

作為比較老牌的嵌入式實時作業系統,VxWorks被廣泛應用于多個領域,如航空航天,工業控制等對實時性要求很高的領域, 它也是非常重視對POSIX標準的支持,其全部支持了PSE52標準 + BSD Socket,并通過官方的PSE52認證,

QNX

作為被廣泛應用于汽車領域的嵌入式實時作業系統,同時也是比較成功的商用微內核作業系統,QNX也是比較重視對POSIX標準的支持,其全部支持了PSE52標準 + BSD Socket,

Fuchsia

作為Google全新設計研發的微內核作業系統, Fuchsia也是支持POSIX標準的,

FreeRTOS

FreeRTOS雖然主要應用于資源比較受限的MCU設備, 其也實作部分PSE52范圍內的API,

RT-Thread

RT-Thread主要應用于物聯網領域的智能設備, 其也比較重視對POSIX標準的支持,實作PSE52范圍內的大部分API,

AliOS Things支持POSIX的長遠目標是實作POSIX.1的最新版本,如目前是POSIX.1-2017,它共有1191個API,數量是非常大的,但是有很多并不是經常使用的API,因此短期目標是實作PSE52 + Networking標準的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執行緒的關鍵資料,與內核task的tcb結構相對應,且通過tid相互關聯,POSIX執行緒的關鍵資料型別pthread_t會關聯到這個資料結構上,

  • magic 是POSIX執行緒的魔術字,以區別于使用AliOS Things原生的AOS API創建的執行緒,
  • attr 執行緒屬性,為POSIX執行緒設定屬性以更細粒度地控制執行緒的行為,如執行緒的堆疊地址,堆疊大小,執行緒的調度策略,調度引數等,
  • tid 指向內核task的tcb結構,
  • thread_entry 新創建執行緒的執行入口函式的指標,
  • thread_para 新創建執行緒的執行入口函式的引數結構指標,
  • join_sem 實作執行緒的JOINABLE的信號量,執行緒退出時自身不釋放ptcb資源,由其他執行緒呼叫pthread_join獲取回傳值,并釋放資源,
  • cancel_state/cancel_type/canceled 分別表示POSIX執行緒取消狀態(是否使能取消),取消型別(延遲取消、立馬取消),是否取消,目前POSIX執行緒的取消功能暫未實作,
  • cleanup 執行緒在退出時要執行的清理函式指標的鏈表,
  • 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 是保護內部資料的一把mutex鎖,
  • waiting 等待這個條件變數的執行緒數,
  • signals 已發送信號還未收到確認的數目,
  • wait_sem 執行緒等待的信號量,底層內核的信號量原語,
  • wait_done 用于發送執行緒與等待執行緒之間握手確認的信號量, 底層內核的信號量原語,
  • attr 記錄pthread條件變數的屬性,比如條件變數用到的時鐘clock,

POSIX條件變數的處理

pthread-cond.png

POSIX 條件變數不僅支持觸發單個等待的執行緒,同時還支持廣播(pthread_cond_broadcast),觸發多個等待的執行緒,

4.3、AliOS Things上POSIX介面實作

AliOS Things 支持了pthread,semaphore, message queue, timer, fs等多個模塊的豐富的API,開發者可以利用這些POSIX API,只需要簡單地修改,甚至無需修改,就可以移植Unix/Linux的應用到AliOS Things上,再結合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、移植到AliOS Things上

把上面的pthread_test.c 移植到AliOS Things上,改寫application/example/helloworld_demo 這個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;

由上可知,AliOS Things的應用入口是application_start, 不是main, AliOS Things上的posix頭檔案在posix目錄下,如posix/pthread.h,

編譯helloworld_demo

aos make helloworld_demo@haas100 -c config
aos make

下載燒錄并啟動,log如下, 與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下應用到AliOS Things之下是不是很簡單,一起來試試吧,

6、參考鏈接

POSIX.1-2017

AliOS Things物聯網作業系統

7、開發者技術支持

如需更多技術支持,可加入釘釘開發者群

更多技術與解決方案介紹,請訪問阿里云AIoT首頁https://iot.aliyun.com/

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236117.html

標籤:其他

上一篇:RT-Thread學習筆記系列之使用gt9147軟體包的坑(4)

下一篇:鴻蒙手機Beta版本官宣!我們帶著成果和Code來了!!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more