RenameThisPage : 페ì´ì§€ ì´ë¦„ ìˆ˜ì • í•„ìš”. ê¶ë¦¬ì¤‘ --["1002"] ---- [[TableOfContents]] == Chapter 1 == === Sample Code === ì´ëŸ°ì €ëŸ° 소개들. (컴파ì¼ëŸ¬ëŠ” ë¬´ì—‡ì„ ì‚¬ìš©í•œë‹¤. 머 ì–´ì©Œêµ¬ì €ì©Œêµ¬.) === Installing uCOS-II === ì¸ìŠ¤í†¨í•˜ëŠ” 방법ì¸ë° 별 í•„ìš” ì—†ì„듯.. 우리가 ì§ì ‘ uCOS-II 를 설치하진 않ì„꺼니까.. ì°¨ë¼ë¦¬ 소스를 구해다가 컴파ì¼ì„ 하면 몰ë¼ë„. === INCLUDES.H === ëª¨ë“ .c 파ì¼ì—서 ì¸í´ë£¨ë“œë˜ëŠ” í—¤ë”파ì¼ì´ë‹¤. ì´ íŒŒì¼ì˜ ë‚´ìš©ì€ íƒ€ê²Ÿí”„ë¡œì„¸ì„œë§ˆë‹¤ 다르게 ì 용시켜야한다. === Compiler-Independent Data Types === 프로세서마다 ê°ê° ê°€ì§€ê³ ìžˆëŠ” íŠ¹ì„±ì´ ë‹¤ë¥´ê¸° ë•Œë¬¸ì— ìš°ë¦¬ê°€ í¬íŒ…í•˜ë ¤ëŠ” 타겟 CPUì— ë§žì¶° 여러가지 글로벌 변수를 ì„ ì–¸í•´ì¤˜ì•¼ 한다. (글로벌 변수ë¼ê¸°ë³´ë‹¤ëŠ” 키워드 ìž¬ì •ì˜ë¼ê³ ë§í•˜ëŠ”ê²Œ ë” ë§žê² ë‹¤) [[BR]] ê°ê°ì˜ 프로세서마다 int 형 ë°ì´í„°ì˜ í¬ê¸° char 형 ë°ì´í„°ì˜ í¬ê¸°.. ë“±ë“±ì´ ë‹¤ë¥´ê¸° ë•Œë¬¸ì— ë‹¤ìŒê³¼ ê°™ì€ ì‹ìœ¼ë¡œ ìž¬ì •ì˜ë¥¼ 해준다. {{{~cpp // 형 ìž¬ì •ì˜ typedef ungisned char BOOLEAN; typedef unsigned char INT8U typedef signed int INT16S ... // 형 ìž¬ì •ì˜ (#defineì´ìš©) #define BYTE INT8S ... }}} === Global Variables === OS 를 작성하다보면 ì „ì—변수가 필요한 경우가 있다. ì „ì—변수는 어떻게 ì„ ì–¸í•˜ëŠ”ê°€? extern 키워드를 사용하면 ëœë‹¤. 하지만 uCOS-II ì—서는 extern í‚¤ì›Œë“œë§ˆì € #define 해서 다른 매í¬ë¡œë¡œ 사용한다. {{{~cpp #ifdef OS_GLOBALS #define OS_EXT #else #define OS_EXT_extern #endif }}} 위처럼 다ìŒê³¼ ê°™ì´ ë§¤í¬ë¡œ ì •ì˜ë¥¼ í•´ ë†“ê³ ë‹¤ìŒê³¼ ê°™ì€ ì†ŒìŠ¤ë¥¼ ì ìš©ì‹œí‚¨ë‹¤ê³ í•´ ë³´ìž {{{~cpp OS_EXT INT32U OSIdleCtr; OS_EXT INT32U OSIdleCtrRun; OS_EXT INT32U OSIdleCtrMax; }}} 그럼 ì‹¤ì œ 코드는 (컴파ì¼ì‹œ) 다ìŒê³¼ ê°™ì´ ì ìš©ëœë‹¤ëŠ”ê²ƒì„ ì•Œ 수 있다. {{{~cpp extern INT32U OSIdleCtr; extern INT32U OSIdleCtrRun; extern INT32U OSIdleCtrMax; }}} 만약 다ìŒê³¼ ê°™ì´ OS_GLOBALSë¼ëŠ” 매í¬ë¡œë¥¼ 미리 ì 용시키면 형 ì •ì˜ê°€ ë˜ì§€ ì•Šì€ ìƒíƒœì´ë¯€ë¡œ (ìœ„ì˜ #ifdef~#else ì—서 #else ì ˆì— ê±¸ë¦¬ê²Œ ëœë‹¤) 다ìŒê³¼ ê°™ì€ ì½”ë“œê°€ ëœë‹¤. {{{~cpp #define OS_GLOBALS #include "inlcudes.h" }}} ì‹¤ì œ ì ìš©ì€ ì•„ëž˜ì™€ê°™ì´ {{{~cpp INT32U OSIdleCtr; INT32U OSIdleCtrRun; INT32U OSIdleCtrMax; }}} 즉, 변수는 Local 하게 ì„ ì–¸ëœë‹¤ëŠ” ê²ƒì„ ì•Œ 수 있다. === OS_ENTER_CRITICAL and OS_EXIT_CRITICAL === OSì—서 ê³µìœ ìžì›ì´ë‚˜ íŠ¹ì •ì½”ë“œê°€ 수행ë˜ëŠ” ë„ì¤‘ì— ë‹¤ë¥¸ í”„ë¡œì„¸ìŠ¤ì— ì˜í•´ interrupt ë˜ëŠ”ê²ƒì„ ë°©ì§€í•˜ê¸° 위해 í¬ë¦¬í‹°ì»¬ ì„¹ì…˜ì„ ì‚¬ìš©í•˜ê²Œ ëœë‹¤. ì´ëŠ” 윈ë„우즈 프로그래ë°ì—서 ìŠ¤ë ˆë“œê´€ë ¨ 처리를 í•´ 줄 때ì—ë„ ë‚˜ì˜¤ëŠ” 용어ì´ë‹¤. uCOS-IIì—서는 단순히 매í¬ë¡œí•¨ìˆ˜ë¥¼ ì´ìš©í•´ í¬ë¦¬í‹°ì»¬ì„¹ì…˜ì— 들어오기와 나오기를 한다. 매í¬ë¡œí•¨ìˆ˜ê°€ 하는 ì¼ì€ 단순히 ì¸í„°ëŸ½íŠ¸ë¥¼ 무효화, ìœ íš¨í™” 시키는것 ë¿ì´ë‹¤. {{{~cpp #define OS_CRITICAL_METHOD #if OS_CRITICAL_METHOD == 1 // OS_CRITICAL_METHOD 는 ì–´ë””ì„ ê°€ ì´ë¯¸ ì •ì˜ë˜ì–´ìžˆë‹¤. 아마 CPUì— ë”°ë¼ ë‹¤ë¥´ê²Œ ê°’ì´ ì •í•´ì ¸ 있ì„것ì´ë‹¤. #define OS_ENTER_CRITICAL() asm CLI #deifne OS_EXIT_CRITICAL() asm STI #endif #if OS_CRITICAL_METHOD == 2 #define OS_ENTER_CRITICAL() asm {PUSHF; CLI} // PUSHFê°€ 몬지는 잘 ëª¨ë¥´ê² ë‹¤. 아마 스íƒì— 무얼 집어넣는것 ê°™ì€ë°. // PUSHF는 CPUë ˆì§€ìŠ¤í„°ë¥¼ 하나씩 ì¼ì¼ì´ 스íƒì— 넣는 ìž‘ì—…ì„ ê°„íŽ¸í•˜ê²Œ 하기 위하여 호출 하는 ASMëª…ë ¹ìœ¼ë¡œ ì •í•´ì§„ ìˆœì„œì— // ì˜í•´ ëª¨ë“ ë ˆì§€ìŠ¤í„°ì˜ ë‚´ìš©ì„ ìŠ¤íƒì— PUSH하는 ëª…ë ¹ìž„. 반대는 POPF로 PUSHFì˜ ì—순으로 스íƒì—서 꺼낸 ë°ì´í„°ë¡œ ê°ê°ì˜ // ë ˆì§€ìŠ¤í„°ë¥¼ 변경 시킴. í•ìƒ ì´ ë‘ ëª…ë ¹ì€ í•œìŒì´ ë˜ì–´ 사용 ë˜ì–´ì•¼ 한다. #deifne OS_EXIT_CRITICAL() asm STI #endif }}} === PC-Based Services === ì£¼ì ˆì£¼ì ˆ ê¶ì‹œë ê¶ì‹œë .. ==== Character-Based Display ==== ë””ìŠ¤í”Œë ˆì´ëŠ” 문ìžê¸°ë°˜ìœ¼ë¡œ 한다. x, yê°’ì„ ì´ìš©í•´ì„œ 아스키문ìžì™€ 특수문ìžë¥¼ ì¶œë ¥í• ìˆ˜ 있다. 1ê¸€ìž ì¶œë ¥ì— ì‚¬ìš©ë˜ëŠ” ë°”ì´íŠ¸ìˆ˜ëŠ” 2ì´ë‹¤. 1ë°”ì´íŠ¸ëŠ” 글ìžì´ê³ , 나머지 1ë°”ì´íŠ¸ëŠ” í¬ê·¸ë¼ìš´ë“œ/백그ë¼ìš´ë“œ 컬러ì´ë‹¤. (ìƒìœ„ 4비트가 백그ë¼ìš´ë“œì´ê³ 하위 4비트가 백그ë¼ìš´ë“œ 컬러ì´ë‹¤) {{{~cpp PC_DispClrScr() // Clear the screen PC_DispClrLine() // Clear a single row (or line) PC_DispChar() // Display a single ASCII chracter anywhere on the screen PC_DispStr() // Display and ASCII strin anywhere on the screen }}} ==== Elapsed Time Management ==== 수행시간 ì¸¡ì •ì€ í•œ task ì˜ ìˆ˜í–‰ì‹œê°„ì„ ì¸¡ì •í•˜ê¸° 위해서 한다. (당연한거 ì•„ëƒ?). ì´ ì¸¡ì •ì€ PCì˜ 82C52 타ì´ë¨¸ 2ë²ˆì„ í†µí•´ 수행ëœë‹¤. 수행시간 ì¸¡ì •ì„ ìœ„í•œ 함수로는 PC_ElapsedStart()와 PC_ElapsedStop()ì´ ìžˆë‹¤. 하지만 ì´ ë‘ í•¨ìˆ˜ë¥¼ 사용하기 ì „ì— PC_ElapsedInit()를 호출해야한다. ì´ í•¨ìˆ˜ëŠ” ë‘ í•¨ìˆ˜ì™€ ê´€ë ¨ëœ ì˜¤ë²„í—¤ë“œë¥¼ ì¸¡ì •í•˜ëŠ”ë° ì‚¬ìš©ëœë‹¤. ì´ë ‡ê²Œ 하면 PC_ElapsedStop í•¨ìˆ˜ì— ì˜í•´ ìˆ˜í–‰ì‹œê°„ì´ ë¦¬í„´ëœë‹¤(마ì´í¬ë¡œì„¸ì»¨ë“œ). ì´ ë‘ í•¨ìˆ˜ëŠ” ëª¨ë‘ ë¦¬ì—”í„°ëŸ°íŠ¸(주 : 몇 ê°œì˜ í”„ë¡œê·¸ëž¨ì´ ë™ì‹œì— í•˜ë‚˜ì˜ task나 subroutineì„ ê³µìœ í•˜ì—¬ 쓰는 ê²ƒì— ëŒ€í•´ ë§í•¨, from í•œì»´ì‚¬ì „) 하지 않아야한다. 다ìŒì€ PC_DispChar()í•¨ìˆ˜ì˜ ì¸¡ì •ì‹œê°„ì„ êµ¬í•˜ëŠ” 예ì´ë‹¤. {{{~cpp INT16U time; PC_ElapsedInit(); . . PC_ElapsedStart(); PC_DispChar(40, 24, 'A', DISP_FGND_WHITE); time = PC_ElapsedStop(); }}} ==== Miscellaneous ==== uCOS-II는 ì—¬íƒ€ì˜ DOS Application ê³¼ 비슷하다. 다른ë§ë¡œëŠ” uCOS-IIì˜ ì½”ë“œëŠ” main 함수ì—서부터 시작한다. uCOS-II는 멀티태스킹과 ê° task 마다 ê³ ìœ ì˜ ìŠ¤íƒì„ í• ë‹¹í•˜ê¸° 때문ì—, uCOS-II를 구ë™ì‹œí‚¤ë ¤ë©´ ì´ì „ DOSì˜ ìƒíƒœë¥¼ ì €ìž¥ì‹œì¼œì•¼í•˜ê³ , uCOS-IIì˜ êµ¬ë™ì´ 종료ë˜ë©´ì„œ ì €ìž¥ëœ ìƒíƒœë¥¼ 불러와 DOSìˆ˜í–‰ì„ ê³„ì†í•˜ì—¬ì•¼ 한다. ë„ìŠ¤ì˜ ìƒíƒœë¥¼ ì €ìž¥í•˜ëŠ” 함수는 PC_DosSaveReturn()ì´ê³ ì €ìž¥ëœ DOSì˜ ìƒíƒœë¥¼ ë¶ˆëŸ¬ì˜¤ëŠ”ê²ƒì€ PC_DOSReturn() 함수ì´ë‹¤. PC.C 파ì¼ì—는 ANSI C í•¨ìˆ˜ì¸ setjmp()함수와 longjmp()함수를 서로 연관시켜서 ë„ìŠ¤ì˜ ìƒíƒœë¥¼ ì €ìž¥ì‹œí‚¤ê³ , 불러온다. ì´ í•¨ìˆ˜ëŠ” Borland C++ 컴파ì¼ëŸ¬ ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 비롯한 ì—¬íƒ€ì˜ ì»´íŒŒì¼ëŸ¬ ë¼ì´ë¸ŒëŸ¬ë¦¬ì—서 ì œê³µí•œë‹¤.[[BR]] '''uCOS-II를 ë내기 ì „ì— PC_DOSSaveReturn 함수를 호출해야한다. ê·¸ë ‡ì§€ 않으면 DOSê°€ curruped mode ê°€ ë˜ì–´ë²„ë¦¬ê³ ì´ê²ƒì€ ë‹¹ì‹ ì˜ windowsì— ì˜í–¥ì„ 줄 ìˆ˜ë„ ìžˆë‹¤.''' === uCOS-II Examples === === Example 1 === ==== main() ==== ==== TaskStart() ==== ==== TaskN() ==== === Example 2 === ==== main() ==== ==== TaskStart() ==== ==== TaskN() ==== === Example 3 === ==== main() ==== ==== Tasks ==== ==== Notes ==== ---- [uCOS-II]