Vxworks培訓總結
---
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()
*
推薦閱讀:
※物聯網嵌入式應用已經滲透到我們生活的方方面面
※Uboot啟動內核命令詳解
※精簡封裝技巧6---- 『:』 關鍵詞的用法
※要認識嵌入式Linux,看這一篇就夠了
※RTOS移植與naked選項的使用-1_必要性與用法