关于LINUX系统编程架构问题——4412 camera V4L2 RTMP流工程源码分析
在程序猿界混跡了多年,一直有個苦惱的問題,不管是什么樣子的編程,最早的匯編,后來C語言,又接觸了JAVA,始終有個念頭就是整體程序架構問題,不管是你自己用不用操作系統,都要有一套很出色的編程模板。當然自己能搞出來的絕對是要花費大把時間,然而對于工作而言時間確實是非常奢侈的東西。那么,另一種方法就出現了,“抄襲”,但抄襲也是要自己有兩把刷子的,而且要有廣闊的眼界,有了眼界你才能找到多種多樣的模式,模板。廢話少說,先上個LINUX下編程的系統模板,這個是來自TI的ipnc中的對Linux下的系統編程。也當自己的記錄筆記。本代碼來源TI-IPNC DM365 APOLLO方案的源碼。
應用方法:
int AVSERVER_tskMain(struct OSA_TskHndl *pTsk, OSA_MsgHndl *pMsg, Uint32 curState )
{
? int status;
? Uint16 cmd = OSA_msgGetCmd(pMsg);
? #ifdef AVSERVER_DEBUG_MAIN_THR
? OSA_printf(" AVSERVER MAIN: Recevied CMD = 0x%04x, state = 0x%04x\n", cmd, curState);
? #endif
? switch(cmd) {
? ? case AVSERVER_MAIN_CMD_START:
? ? ? if(curState==AVSERVER_MAIN_STATE_IDLE) {
? ? ? ? status = AVSERVER_tskStart(pTsk, pMsg);
? ? ? ? if(status!=OSA_SOK)
? ? ? ? ? AVSERVER_tskStop(pTsk, pMsg);
? ? ? }
? ? ? OSA_tskAckOrFreeMsg(pMsg, OSA_SOK);
? ? ? break;
? ? case AVSERVER_MAIN_CMD_STOP:
? ? ? if(curState==AVSERVER_MAIN_STATE_RUNNING) {
? ? ? ? AVSERVER_tskStop(pTsk, pMsg);
? ? ? }
? ? ? OSA_tskAckOrFreeMsg(pMsg, OSA_SOK);
? ? ? break;
? }
? return OSA_SOK;
}
int AVSERVER_mainCreate()
{
? int status;
? status = OSA_mbxCreate(&gAVSERVER_ctrl.uiMbx);
? if(status!=OSA_SOK) {
? ? OSA_ERROR("OSA_mbxCreate()\n");
? ? return status;
? }
? status = OSA_tskCreate( &gAVSERVER_ctrl.mainTsk, AVSERVER_tskMain, AVSERVER_MAIN_THR_PRI, AVSERVER_MAIN_STACK_SIZE, AVSERVER_MAIN_STATE_IDLE);
? if(status!=OSA_SOK) {
? ? OSA_ERROR("OSA_tskCreate()\n");
? ? return status;
? }
? return status;
}
int AVSERVER_mainDelete()
{
? int status;
? status = OSA_tskDelete(&gAVSERVER_ctrl.mainTsk);
? status |= OSA_mbxDelete(&gAVSERVER_ctrl.uiMbx);
? if(status!=OSA_SOK)
? ? OSA_ERROR("\n");
? return status;
}
?
啟動:??
status |= OSA_tskSendMsg(&gVIDEO_ctrl.swosdTsk, pTsk, AVSERVER_CMD_DELETE, NULL, OSA_MBX_WAIT_ACK);
持續更新中。。。。
?
一個線程的生命周期,招式
/*
?* gioInputMainThr.cpp
?*
?*? Created on: Jun 30, 2019
?*????? Author: CaRn
?*/
extern "C"{
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdlib.h>
#include <unistd.h>
}
#include "../main_app/gioInputMainThr.h"
#include "../main_app/appServer.h"
#include "interface/Def.h"
//#define ELEGIO_DEVPAT?? ??? ??? ??? ??? ??? ??? ??? ??? ?"/dev/gioCtl_device"
//
//int mEleGioFd;
int gioInputTskCreate(){//任務創建,操作流程,運氣
?? ?int status = OSA_SOK;
//?? ?mEleGioFd = open(ELEGIO_DEVPAT, O_RDWR);
//?? ?if(mEleGioFd < 0){
//?? ??? ?OSA_ERROR(">>>>FLOOR: Open ELEGIO_DEVPAT device: %s failed\n", ELEGIO_DEVPAT);
//?? ??? ?return OSA_EFAIL;
//?? ?}
?? ?return status;
}
int gioInputTskStart(){//任務初始化,可以初始化首次運行參數 ,起手式
?? ?int status = OSA_SOK;
?? ?return status;
}
int gioInputTskRun(){//任務實際運行主體,數據處理主體, 出手式
?? ?int status = OSA_SOK;
?? ?return status;
}
int gioInputTskDelete(){//退出線程任務做的收尾工作, 收手式
?? ?int status = OSA_SOK;
//?? ?if(mEleGioFd > 0){
//?? ??? ?close(mEleGioFd);
//?? ?}
?? ?return status;
}
int gioInputTskMain(struct OSA_TskHndl *pTsk, OSA_MsgHndl *pMsg, Uint32 curState){//主線程運行
?? ?int status;
?? ?Bool done= FALSE, ackMsg = FALSE;
?? ?Uint16 cmd = OSA_msgGetCmd(pMsg);
#ifdef APPSERVER_DEBUG_GIOINPUTMAIN_THR
?? ?OSA_printf(" GIOINPUT: START Recevied CMD = 0x%04x\n", cmd);
#endif
?? ?if(cmd!=APPSERVER_CMD_CREATE) {
?? ??? ?OSA_tskAckOrFreeMsg(pMsg, OSA_SOK);
?? ??? ?return OSA_SOK;
?? ?}
#ifdef APPSERVER_DEBUG_GIOINPUTMAIN_THR
?? ?OSA_printf(" GIOINPUT: Create...\n");
#endif
?? ?status = gioInputTskCreate();
?? ?OSA_tskAckOrFreeMsg(pMsg, status);
?? ?if(status !=OSA_SOK) {
?? ??? ?OSA_ERROR(">>>>gioInputTskCreate()");
?? ??? ?return OSA_SOK;
?? ?}
#ifdef APPSERVER_DEBUG_GIOINPUTMAIN_THR
?? ?OSA_printf(" GIOINPUT: Create...DONE\n");
#endif
?? ?status = OSA_tskWaitMsg(pTsk, &pMsg);
?? ?if(status!=OSA_SOK)
?? ??? ?return OSA_SOK;
?? ?cmd = OSA_msgGetCmd(pMsg);
?? ?if(cmd==APPSERVER_CMD_DELETE) {
?? ??? ?done = TRUE;
?? ??? ?ackMsg = TRUE;
?? ?} else {
#ifdef APPSERVER_DEBUG_GIOINPUTMAIN_THR
?? ??? ?OSA_printf(" GIOINPUT: Start...\n");
#endif
?? ??? ?gioInputTskStart();
?? ??? ?OSA_tskAckOrFreeMsg(pMsg, OSA_SOK);
#ifdef APPSERVER_DEBUG_GIOINPUTMAIN_THR
?? ??? ?OSA_printf(" GIOINPUT: Start...DONE\n");
#endif
?? ?}
?? ?while(!done) {
?? ??? ?gioInputTskRun();
#ifdef APPSERVER_DEBUG_GIOINPUTMAIN_THR
//?? ???? OSA_printf("?? ?GIOINPUT: gioInputTskRun\n");
#endif
?? ??? ?OSA_waitMsecs(2000);
?? ???? status = OSA_tskCheckMsg(pTsk, &pMsg);
?? ???? if(status !=OSA_SOK)
?? ?????? continue;
?? ???? cmd = OSA_msgGetCmd(pMsg);
#ifdef APPSERVER_DEBUG_GIOINPUTMAIN_THR
?? ???? OSA_printf("?? ?GIOINPUT: Recevied CMD = 0x%04x\n", cmd);
#endif
?? ???? switch(cmd) {
?? ???? case APPSERVER_CMD_DELETE:
?? ??? ??? ?done = TRUE;
?? ??? ??? ?ackMsg = TRUE;
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?OSA_tskAckOrFreeMsg(pMsg, OSA_SOK);
?? ??? ??? ?break;
?? ???? }
?? ?? }
#ifdef APPSERVER_DEBUG_GIOINPUTMAIN_THR
?? ?OSA_printf("GIOINPUT: Delete...\n");
#endif
?? ?gioInputTskDelete();
?? ?if(ackMsg)
?? ??? ?OSA_tskAckOrFreeMsg(pMsg, OSA_SOK);
#ifdef APPSERVER_DEBUG_GIOINPUTMAIN_THR
?? ?OSA_printf("GIOINPUT: Delete...DONE\n");
#endif
?? ?return OSA_SOK;
}
int DEV_gioInputCreate(){//線程創建
?? ?int status;
?? ?status = OSA_tskCreate( &gCAPTURE_Ctl.gioInputTsk, gioInputTskMain, GIOINPUTMAIN_THR_PRI, GIOINPUTMAIN_STACK_SIZE, 0);
?? ?if(status!=OSA_SOK) {
?? ??? ?OSA_ERROR(">>>>DEV_gioInputCreate()\n");
?? ??? ?return status;
?? ?}
?? ?return status;
}
int DEV_gioInputDelete(){//線程刪除退出
?? ?int status;
?? ?status = OSA_tskDelete( &gCAPTURE_Ctl.gioInputTsk );
?? ?if(status!=OSA_SOK) {
?? ??? ?OSA_ERROR(">>>>DEV_gioInputDelete()\n");
?? ?}
?? ?return status;
}
關聯4412_V4L2cam_RTMP_工程源碼
?
總結
以上是生活随笔為你收集整理的关于LINUX系统编程架构问题——4412 camera V4L2 RTMP流工程源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wordpress主题下载,wp主题模板
- 下一篇: linux 其他常用命令