これは、ROMベースの、カット可能な、プリエンプティブな、リアルタイムのマルチタスクOSカーネルです。
剥奪可能なリアルタイムカーネルは、いつでも準備ができている最も優先度の高いタスクを実行します。
スレッドとも呼ばれるタスクは単純なプログラムであり、CPUはプログラムに属していると見なすことができます。
OSには、タスクスケジューリング、タスク管理、時間管理、メモリ管理、タスク間の通信と同期などの基本機能が含まれています。入出力管理、ファイルシステム、ネットワークなどの追加サービスは提供されていません。ただし、uC / OS-IIの優れたスケーラビリティとオープンソースコードにより、これらの必須ではない機能は、ユーザーのニーズに応じて個別に実装できます。
タスクが実行されると(タイムスライスがアップ)、CPUレジスタのすべての内容を自分のスタックに保存すると同時に、CPUを他のタスクに譲り、CPUを使用する権利を持つタスクを放棄します。スタックはそれ自体から独自のCPUレジスタを取得し、スタックは実際のCPUレジスタに配置されて実行を開始し、以下同様に繰り返し実行されます。
タスク管理:タスク作成時の優先度とスタック
時間管理:タイミング割り込みにより実現
メモリ管理:最初のアドレス、ブロックサイズ、およびブロック番号を指定します。連続アドレス配列をリストにリンクします。
取得:メモリ制御ブロックを指定し、リンクリストの最初のメモリブロックのアドレスを返し、リンクリストのポインタを次の空きメモリブロックに移動します。
リリース:メモリ制御ブロックとメモリの最初のアドレスを指定します。リリースされるブロック。このメモリブロックは、リンクリスト内の最初の空きメモリブロックのアドレスを格納し、それ自体を最初の空きメモリブロックとして割り当てます。
メールボックス:各タスクは、タスク間の通信の目的を達成するために、独自のデータをカプセル化し、メールボックスの形式で他のタスクに送信します。ポインタ変数。通常、ポインタは「メッセージ」を含む特定のデータ構造を指します。
1. µC / OS-IIはマルチタスクであり、タスクごとにスタックが開かれます
2. µC / OS-IIでは、ユーザーはサービスを使用する前にOSInit()[L1.5(2)]を呼び出す必要があります。
アイドルタスクと統計タスクの2つのタスクが作成されます。前者は、他のタスクが準備完了状態にないときに実行され、後者はCPU使用率を計算します。
3.ユーザーは、マルチタスクOSStart()を開始する前に、少なくとも1つのタスクを作成する必要があります。
4.スタックチェック操作を使用するには、OSTaskCreateExt()を使用してタスクを作成する必要があります
5. OSMemCreate()関数は、メモリ領域を作成して初期化します。メモリ領域は、静的配列を使用するか、初期化中にmalloc()関数を使用して作成できます。
msg = OSMemGet(CommMem, &err);
if (msg != (INT8U *)0) {
./* 内存块已经分配 */
}
6、
typedef struct {
/* MEMORY CONTROL BLOCK */
void *OSMemAddr; /* Pointer to beginning of memory partition */
void *OSMemFreeList; /* Pointer to list of free memory blocks */
INT32U OSMemBlkSize; /* Size (in bytes) of each block of memory */
INT32U OSMemNBlks; /* Total number of blocks in this partition */
INT32U OSMemNFree; /* Number of memory blocks remaining in this partition */
} OS_MEM;
#define OS_EVENT_TYPE_UNUSED 0
#define OS_EVENT_TYPE_MBOX 1
#define OS_EVENT_TYPE_Q 2
#define OS_EVENT_TYPE_SEM 3
#define OS_EVENT_TYPE_MUTEX 4
#define OS_EVENT_TYPE_FLAG 5
typedef struct {
INT8U OSEventType; /* Type of event control block (see OS_EVENT_TYPE_???) */
INT8U OSEventGrp; /* Group corresponding to tasks waiting for event to occur */
INT16U OSEventCnt; /* Semaphore Count (not used if other EVENT type) */
void *OSEventPtr; /* Pointer to message or queue structure */
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */
} OS_EVENT;
7. OSSchedLock()関数を呼び出すタスクは、他に優先度の高い準備ができているタスクがあるかどうかに関係なく、CPUを独占します。この場合でも、割り込みを受け入れて実行できます(割り込みを許可する必要があります)。OSSchedLock()関数とOSSchedUnlock()関数はペアで使用する必要があります。
タスクがOSSchedLock()関数を呼び出した後、現在のタスクをハングさせる可能性のあるシステム関数(OSTimeDly()、OSTimeDlyHMSM()、OSSemPend()、OSMboxPend()、OSQPend())を呼び出さないでください。タスクのスケジューリングが無効になっているため、他のタスクを実行できず、システムのデッドロックが発生します。
8. OSSemCreate()関数は、セマフォを作成して初期化します。セマフォの機能は次のとおりです。
タスクが他のタスクまたは割り込みと同期できるようにします。イベントの発生
を
マークするために機器を使用する権利を取得します
OS_EVENT *DispSem;
void main(void)
{
.
OSInit(); /* 初始化μC/OS-Ⅱ */
.
DispSem = OSSemCreate(1); /* 建立显示设备的信号量 */
.
OSStart(); /* 启动多任务内核 */
}
グローバル変数を定義する-初期化-ポストペンド-フラッシュ
CAN2_GLOBAL OS_EVENT *CAN2Receive;
CAN2Receive = OSQCreate(pCAN2RevBuf,USE_CAN2_RX_BUF_SIZE); //CAN2接收消息队列
stcRxBUF msg;
msg = RxBUF(j);
CAN2Rx_OSQPost(CAN2Receive,&msg);
mg=OSQPend(CAN2Receive,0,&err);
curRxBuf = *(stcRxBUF *) mg;
OSQFlush(CAN2Receive);
9.CPU使用率
void FirstAndOnlyTask (void *pdata)
{
.
OSStatInit(); /* 计算CPU使用率 */
.
OSTaskCreate(ノ ); /* 建立其他任务 */
OSTaskCreate(ノ );
.
for (;;) {
}
}
10、
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio);
11. OSTaskCreate()は新しいタスクを作成します。タスクは、マルチタスク環境が開始される前に確立することも、実行中のタスクで確立することもできます。割り込みハンドラーでタスクを作成することはできません。タスクは無限ループ構造である必要があり、リターンポイントを持つことはできません。
12.ユーザープログラムで割り込みが発生するかどうかに関係なく、タスクスタックを初期化する場合、スタック構造はCPU割り込み後のレジスタスタックのシーケンス構造と同じである必要があります。
13.
タスクでは、μC/ OSによって提供される次のプロセスのいずれかを呼び出す必要があります:遅延待機、タスクの一時停止、イベント発生の待機(セマフォ、メッセージメールボックス、メッセージキューの待機)。これにより、他のタスクがCPUを取得できるようになります。 。