---

layout: post

title: VxWorks培訓總結1

date: 2016-7-24

categories: blog

tags: [學習]

description: 頂著桑拿天學了幾天,寫個總結記錄一下

---

# VxWorks培訓

---

# 嵌入式實時操作系統介紹

實時操作系統:實時操作系統並不是要求快,是需要保證時間的可預料。

### VxWorks內核

* 多任務調度(採用基於優先順序搶佔方式,同時支持同優先順序任務間的分時間片調度)

* 任務間的同步

* 進程間通信機制

* 中斷處理

* 定時器和內存管理機制

### 嵌入式實時操作系統的選擇

1. 高可靠性

2. 裁剪性(可裁剪到幾百k)

3. 易用性

4. 技術支持 (風河)

5. 支持的處理器類型(PPC,X86,MIPS,ARM,6.9開始支持64位X86)

6. 源代碼(可以得到源代碼)

7. 工具(workbench)

8. 標準兼容(兼容POSIX的PSE51/52,部分支持53和54)

# VxWorks

## 開發方式

* 上位機上開發,通過串口或者網線載入到Target上運行。

* 使用wtregd這個進程下載到下位機中,5.x和6.x的不兼容,所以運行tornado或者workbench時需要先結束這個進程

### Target OS組成

---

### Application

---

### kernel和components

kernel不可拆分

*kernel對硬體不做假設,這一層隔離了應用和底層硬體。*

compones:WDB、TCP/IP、FileSystem、 I/O System

---

### 硬體層

各種驅動

BSP

---

## 鏡像文件

* 引導文件:bootrom

* 系統鏡像:vxworks

* 系統庫、第三方庫:*.a(靜態庫)

* 應用程序:*.o、 *.out

## 系統重啟

Ctr+X 熱重啟

*Vx沒有軟體關機,只能重新上電,並且沒有電源管理,所以功耗方面和其他的系統差很多。*

## 幫助獲取

* 去所在的docs文件夾查可能會快一些,直接搜慢的不行。。。*

## 工程管理

* 工程常用的VIP工程,生成系統鏡像

* DKM工程,生成應用程序,可以編譯成庫(驅動等)

* RTP工程(類似win下的應用程序,支持多進程)

## Host Shell 介紹

### Host Shell是一個運行在上位機上的Shell

* 可以同時運行多個

* 有C解釋器

* 函數調用

* 變數聲明

* 四則運算

---

### 常用命令

devs 查看設備

iosFdShow 查看哪些IO設備被打開

h history,查看歷史命令

lkup lookup(lkup 「show」表示產看和show相關的API)

d/m 讀/寫內存

repeat repeat(times,func,para),重複執行

pwd 查看當前路徑

ld 載入程序ld(1, 0, a.out)

taskSpown/sp 建立新任務(sp是taskSpown前四個參數使用默認,可以直接sp API)

printLogo 列印Logo

cd change dir, cd 「c:」

ls/ll list (和linux 一樣)

mkdir 新建文件夾

>< 重定向(ld < file / i > file)

*所有命令直接運行都是對server上的shell,要操作target中,需要在命令前面加@*

### host shell的其他一些注意事項

host shell和target中的shell 是有區別的,是運行在win下的一個shell,可以使用target console,

target console是將target中的IO強制重定向到shell中。

host shell 中支持cmd和GDB。

支持VI的命令。方向是hjkl,以及插入,刪除,替換,追加等。

## 多任務

VX中的任務類似於線程。是最小的調度單元,由TCB和Stack構成。TCB存儲系統相關控制信息,

CPU相關控制信息和任務的上下文。

Stack用於存儲局部變數和參數。

### 任務狀態

* 就緒態

* 執行態

* 阻塞態

* 延時態

* 掛起態

* 任務狀態可以組合

### 調度策略

* 基於優先順序搶佔(很好的保證實時性)

* 不同工作優先順序不同,CPU區別對待

* 搶佔基於優先順序,相同時按先來先執行

* ready隊列中優先順序最高的可以獲得資源

* 有kernel調用和終端發生時,重新進行調度

### 時間片輪轉(默認關閉的)

* 優先順序相同可以相互搶佔(基於時間片)

* 不同優先順序任務可以發生搶佔,高搶低

kernelTimeSlice(ticks) //打開時間片輪轉

### 禁止搶佔

* taskLock()和taskUnlock()來關閉和使能調度器

* 可以防止任務切換,但是對中斷不起作用

## 創建任務

int taskSpown(name, priority, options, stacksize, entryPt,arg1,...arg10)

* name 任務名稱(通常t開頭,可以同名)

* priority 0-255

* taskPriorityGet(tid,&prio)

* taskPrioritySet(tid,prio)

* stack 堆棧大小

* option

* VX_FP_TASK 支持浮點操作

* 返回值是taskID

* entryPt 函數入口

## 刪除任務

* taskDelete(ID)

* 刪除指定任務

* 釋放TCB和stack

*刪除任務存在危險,慎用*

## 任務重啟、掛起、恢復、延時

taskRestart(ID)

taskSuspend(ID)

taskResume(ID)

taskDelay(tick)

## 查看任務信息

i 類似任務管理器

ti(tid) 查看stack 、option、CPU寄存器

show 可以查看任何內核對象

## 錯誤狀態

* 高16位顯示module,低16位標識error number

* printErrno可以顯示具體信息

## 任務通信

* 共享內存

* 信號量

* 消息隊列

* 管道

### 信號量

* 二進位信號量

* 互斥信號量

* 計數信號量

#### 二進位信號量

SEM_ID semBCreate(int opt, STATE)

//opt排隊機制,SEM_Q_PRIORITY基於優先順序,SEM_Q_FIFO基於fifo

返回值為信號量ID或者NULL

#### 申請和釋放

semGive(SEM_ID);

semTake(sem_id,timeout)

//timeout:WAIT_FOREVER、NO_WAIT、Ticks

*take之後,信號量無效*

*其他兩類信號量類似,但是要注意死鎖和優先順序倒置的問題*

_中斷中不能申請信號量_

### 消息隊列

MSG_Q_ID msgQCreate(int maxMsgs, int Lenth, int option)

STATUS msgQSend(

MSG_Q_ID msgQId,

char* buffer,

UINT nBytes,

int timeout, //ticks to wait

int priority

int msgQReceive(

MSG_Q_ID msgQId,

char* buffer,

UINT maxNbytes,

int timeout)

* 消息隊列的通訊都是單向的

* 要是相互通信需要建立兩個隊列

### 管道

* 管道是以隊列為基礎,與其他以塊為基礎的不同

* 管道是一個虛擬的IO設備

* 可以使用標準的IO讀寫操作如open()/read()/write()/close()

*


推薦閱讀:
相关文章