日韩中文无码视频中文字幕,久热中文字幕在线精品首页,亚洲精品东京热无码视频,一本一本久久aa综合精品

深圳市瑞申電子有限公司

深圳市瑞申電子有限公司是一家10年專業大功率電感生產加工廠商,主要以大功率,大電流、扁平線圈電感、平面變壓器設計、生產、銷售工廠。設計、繞線、組裝、檢測、包裝、出貨等全制程的工藝流程!擁有完整、科學的質量管理體系。專業技術團隊10人,我們的誠信、實力和產品質量獲得業界的認可。歡迎各界朋友蒞臨參觀、指導和業務洽談。 ...

setjmp構建簡單協作式多任務系統

時間:2016-06-24 15:55:45 點擊:

摘要:討論一個利用標準C語言setjmp庫函烽實現查詢式協作多任務系統,給出完整的內核和樣例程序并對源代碼進行說明。該系統具有簡單易用的特點,只需要編寫存取堆棧指針的宏就可方便地移植到新的平臺上。文章詳述了系統的優缺點,討論一些性能擴展的方法。該內核適用于中小規模的嵌入式軟件。 關鍵詞:協作式多任務 C語言 setjmp 引言 本文介紹的是利用標準C語言setjmp庫函數實現的具備此特點的協作式多任務系統。從本質上講,實時多任務操作系統應該具備按照優先級搶占調度的內核。然而,在實際應用中,搶中式的多任務某種程序上帶來了用戶程序設計時數據保護的困難,并且,具備搶占功能的多任務內核設計時困難也比較多,這會增加操作系統自身的代碼,也使它在小資源單片機系統中應用較少;而協作多任務系統的調度只在用戶指定的時機發生,這會大大簡化內核和用戶系統的設計,尤其本文實現的系統通過條件查詢來放棄CPU,既符合傳統單片機程序設計的思維,又帶來了多任務、模塊化、可重入的編程便利。 Setjmp是標準C語言庫函數的組成部分,它可以實現程序執行中的遠程轉操作。具體來說,它可以在一個http://www.rouxingban.com/貼片電感函數中使用setjmp來初始化一個全局標號,然后只要該函數未曾返回,那么在其它任何地方都可以通過longjmp調用來跳轉到setjmp的下一條語句執行。實際上,setjmp函數將發生調用處的局部環境保存在一個jmp_buf的結構當中,只要主調函數中對應的內存未曾釋放(函數返回時局部內存就失效了),那么在調用longjmp的時候就可以根據已保存的jmp_buf參數恢復到setjmp的地方執行。我們的系統中就是分析了setjmp標準庫函數的特點,以簡單的方式實現了協作式多任務。 1 演示程序 為了便于理解,首先給出多任務演示程序的源代碼。這個程序演示了協作式多任務切換、任務的動態生成、多任務共用代碼等功能,一共使用了init_coos 初始化根任務(也就是C語言main函數)、creat_task創建新任務和WAITFOR查詢條件這3個基本的系統調用。由于面向嵌入式系統,因而程序不會中止并且運行中也沒有進行任何輸出,需要借助適合的調試工具來理解多任務系統的運行。 example.c文件清單: #include #include“co-os.h” void tskfunc1(int argc,void *argv); void tskfunc2(int argc,void *argv); void subfunc(void); volatile int cnt,test; int main(void){ int i; init_coos(400); creat_tsk(tskfunc1,12,NULL,400); creat_tsk(tskfunc2,0,NULL,400); i=0; while(1){ WAITFOR(cnt= =8); while(i++argc); test=0x55; /*使用函數調用在子程序中測試WAITFOR*/ subfunc(); while(i++15); cnt=0; } } void subfunc(void){ int i; WAITFOR(cnt<5); for(i=0;i<++)test=0x10*i; } 2 內核構成 內核包括一個供外部用戶程序包含的頭文件(co-os.h)和具體實現的源文件(co-os.c),它們提供了演示程序中用到的3個系統調用。 內核的實現代碼假定了CPU堆棧是向下增長的,并且通過宏來直接操作堆棧指針。以下代碼在Microsoft VC6 for x86、Borland C++ Builder 5.5、SDS CrossCode7.0 for 68K和GCC3.2 for AVR四種平臺中測試過,只需在co-os.h頭文件中定義相應的平臺類型即可順利編譯。 (1)co-os.h文件清單 #include /*選擇X86_VC6,X86_BC5,AVR_GCC或M68H_SDS.*/ #define X86_VC6 #define MAX_TSK 10 typedef struct { void (*entry)(int argc,void *argv); jmp_buf env; int argc; void *argv; }TVB; extern TCB tcb[MAX_TSK]; extern int task_num,tskid; void init_coos(int mainstk); int creat_tsk(void(*entry)(int argc,void *argv),int argc,void *argv,int stksize); #define WAITFOR(condition)do{ setjmp(tcb[tskid].env); if(!(condition)){ tskid++; if(tskid>=task_num)tskid=0; longijmp(tcb[tskid].env,1); } }while(0) (2)co-os.c文件清單 #include "co-os.h" #if defined(X86_VC6)||defined(X86_BC5) #define SAVE_SP(p) _asm mov p,esp #define RESTORE_SP(p) _asm mov esp,p #elif defined(AVR_GCC) #include #define SAVE_SP(p) p=(int*)SP #define RESTORE_SP(p) SP=(int)p #elif defined(M68K_SDS) #define SAVE_SP(p) asm("MOVE.L A7,{"#p"}") #define RESTORE_SP(p) asm("MOVE.L {"#p"},A7") #endif TCB tcb[MAX_TSK]; Int task_num=1; Int tskid; Static int stktop,oldsp; Void init_coos(int mainstk){ SAVE_SP(stktop); stktop=stktop+sizeof(void(*)(void))/sizeof(int) -(mainstk+sizeof(int)-1)/sizeof(int); } int creat_tsk(void(*entry)(int argc,void *argv), int argc,void *argv,int stksize){ if(task_num>=MAX_TSK)terurn-1; SAVE_SP(oldsp); RESTORE_SP(stktop); If(!setjmp(tcb[task_num].env)){ RESTORE_SP(oldsp); tcb[task_num].entry=entry; tcb[task_num].argc=argc; tcb[task_num].argv=argv; task_num++; stktop-=(stksize+sizeof(int)-1)/sizeof(int); } else tcb[ts 大功率電感廠家 |大電流電感工廠

  • [DCDC]共輸入電壓的DC/DC變換器差頻干擾
    在筆記本電腦、LCDTV、藍光DVD以及通訊系統的主板上通常會用到多個非隔離的DCDC變換器或LDO,以得到不同的電壓分別給CPU的核及I/O、專用IC及存儲器等芯片供電。 為了提高系統
  • OLED顯示器結構/特點/原理
    OLED顯示器是一種由有機分子薄片組成的固態設備,施加電力之后就能發光。OLED能讓電子設備產生更明亮、更清晰的圖像,其耗電量小于傳統的傳統的LED顯示屏。OLED顯示屏的優點優點:1.相較于LED或
  • Atmel用于個人局域網的無線解決方案
    4月08日 第三屆·無線通信技術研討會 立即報名 12月04日 2015?第二屆中國IoT大會 精彩回顧 10月30日ETF?智能硬件開發技術培訓會 精彩回顧 10月23日ETF?第三屆 消費
  • 大功率電感