[172] | 1 |
|
---|
| 2 | ATK2 éä¿¡é ¼ISRå¯¾å¿ è¨è¨ã¡ã¢ =CONFIDENTIAL=
|
---|
| 3 | 対å¿ãã¼ã¸ã§ã³: Release 1.4.1
|
---|
| 4 | æçµæ´æ°: 2016å¹´3æ4æ¥
|
---|
| 5 |
|
---|
| 6 | Copyright (C) 2016 by Center for Embedded Computing Systems
|
---|
| 7 | Graduate School of Information Science, Nagoya Univ\., JAPAN
|
---|
| 8 |
|
---|
| 9 | $Id: ntisr_design_memo.txt 250 2016-03-17 01:54:59Z t_ishikawa $
|
---|
| 10 |
|
---|
| 11 | ãã®ããã¥ã¡ã³ãã¯ï¼TOPPERS/ATK2ã«ããã¦ï¼éä¿¡é ¼ISRããµãã¼ãããããã®
|
---|
| 12 | è¨è¨ã¡ã¢ã§ããï¼ä½æéä¸ã®ãã®ã§ããï¼ç¶²ç¾
|
---|
| 13 | çã§ã¯ãªãï¼
|
---|
| 14 |
|
---|
| 15 | ======================================================================
|
---|
| 16 | ⯠ç¨èªã®å®ç¾©ããã³è¡¨è¨ã«ã¼ã«
|
---|
| 17 | ======================================================================
|
---|
| 18 |
|
---|
| 19 | ã»æ±ç¨ã¬ã¸ã¹ã¿ï¼ããã»ããµã®æã¤ã¬ã¸ã¹ã¿ã§ï¼å®è¡ä¸å¦çåä½ã®ã³ã³ããã¹ãã
|
---|
| 20 | ã管çããããã«å¿
|
---|
| 21 | è¦ãªãã®ãã¹ã¦
|
---|
| 22 | ã»spï¼ããã»ããµã®æã¤ã¹ã¿ãã¯ãã¤ã³ã¿ã¬ã¸ã¹ã¿
|
---|
| 23 | ã»pcï¼ããã»ããµã®æã¤ããã°ã©ã ã«ã¦ã³ã¿ã¬ã¸ã¹ã¿
|
---|
| 24 | ã»ã·ã¼ã±ã³ã¹ä¸ã«ãã "xxx<label>:"ã¨ããè¨è¿°ã¯ï¼Cè¨èªãã¢ã»ã³ããªè¨èªã®
|
---|
| 25 | ãã©ãã«ã«ç¸å½ãã
|
---|
| 26 | ã»ã·ã¼ã±ã³ã¹ä¸ã«ãã "xxx()"ã¨ããè¨è¿°ã¯ï¼Cè¨èªãã¢ã»ã³ããªè¨èªã®
|
---|
| 27 | ãé¢æ°å¼åºãã«ç¸å½ãã
|
---|
| 28 | ã»ã·ã¼ã±ã³ã¹ä¸ã«ãã "<<xxx>>"ã¨ããè¨è¿°ã¯ï¼ç¹å®ã®SC/MC/TPã«ã®ã¿åå¨ãã
|
---|
| 29 | ããã¨ã表ã
|
---|
| 30 |
|
---|
| 31 | ======================================================================
|
---|
| 32 | ⯠大åæ
|
---|
| 33 | ======================================================================
|
---|
| 34 |
|
---|
| 35 | ã»ç¹æ¨©ã¢ã¼ãå®è¡æã«ä¿è·éåãçºçããã¨ï¼ç¡è¦ãOSã·ã£ãããã¦ã³ããã§ããªã
|
---|
| 36 | ã»p_runtskã¯ï¼dispatcherã®ã¿ã§æ´æ°ããã
|
---|
| 37 |
|
---|
| 38 | ======================================================================
|
---|
| 39 | ⯠ã³ã³ããã¹ããã¨ã«ä½¿ç¨ããã¹ã¿ãã¯
|
---|
| 40 | ======================================================================
|
---|
| 41 | TASK<<MC/TP以å¤>> æ¡å¼µã¿ã¹ã¯ï¼åå¥ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 42 | åºæ¬ã¿ã¹ã¯ï¼åªå
|
---|
| 43 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 44 | TASK<<MC>> æ¡å¼µã¿ã¹ã¯ï¼åå¥ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 45 | åºæ¬ã¿ã¹ã¯ï¼ã³ã¢æ¯ãã¤åªå
|
---|
| 46 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã
|
---|
| 47 | ã¹ã¿ãã¯
|
---|
| 48 | TASK<<TP>> æ¡å¼µã¿ã¹ã¯ï¼åå¥ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 49 | åºæ¬ã¿ã¹ã¯ï¼ã¦ã£ã³ãã¦æ¯ãã¤åªå
|
---|
| 50 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&
|
---|
| 51 | ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 52 | C2ISR<<MC/TP以å¤>> åªå
|
---|
| 53 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 54 | C2ISR<<MC>> ã³ã¢æ¯ãã¤åªå
|
---|
| 55 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 56 | C2ISR<<TP>> ã¦ã£ã³ãã¦æ¯ãã¤åªå
|
---|
| 57 | 度æ¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯&ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 58 | C1ISR OS管çå¤
|
---|
| 59 | ããã¯ã«ã¼ãã³ OSã¹ã¿ãã¯
|
---|
| 60 | ã¢ã¤ãã«ã«ã¼ã OSã¹ã¿ã㯠â»ã¿ã¹ã¯ãåå¨ããªãconfigãèæ
|
---|
| 61 | ®
|
---|
| 62 | OSå²è¾¼ã¿ OSã¹ã¿ãã¯
|
---|
| 63 | mainé¢æ° OSã¹ã¿ãã¯
|
---|
| 64 |
|
---|
| 65 | â ããã¯ã«ã¼ãã³(1)âC1ISRâããã¯ã«ã¼ãã³(2)ã¨ãã¹ãããå ´åï¼ãã¤ï¼
|
---|
| 66 | C1ISRãç¬èªã®ã¹ã¿ãã¯ã使ç¨ãã¦ããå ´åï¼ããã¯ã«ã¼ãã³(1)ã®ä½¿ç¨ãã
|
---|
| 67 | ç¶ãããã¹ã¿ãã¯ã使ç¨ããå¿
|
---|
| 68 | è¦ããããï¼ããã¨ãC1ISRã§çºçãã
|
---|
| 69 | ããã¯ã«ã¼ãã³ã§ã¯ï¼ãã®ã¨ãã®ã¹ã¿ãã¯(C1ISRã®ã¹ã¿ãã¯)ããã®ã¾ã¾
|
---|
| 70 | 使ç¨ããã°ãããï¼
|
---|
| 71 |
|
---|
| 72 | ======================================================================
|
---|
| 73 | ⯠ã³ã³ããã¹ãã¨ãã¦ä¿åãã¹ãæ
|
---|
| 74 | å ±
|
---|
| 75 | ======================================================================
|
---|
| 76 | æ±ç¨ã¬ã¸ã¹ã¿
|
---|
| 77 | å²è¾¼ã¿åªå
|
---|
| 78 | 度ãã¹ã¯ ISRã®å¼·å¶çµäºã«åãã
|
---|
| 79 | callevel
|
---|
| 80 | pc
|
---|
| 81 | ã¦ã¼ã¶ã¹ã¿ãã¯sp
|
---|
| 82 | ã·ã¹ãã ã¹ã¿ãã¯sp
|
---|
| 83 |
|
---|
| 84 | ======================================================================
|
---|
| 85 | ⯠ã³ã³ããã¹ãåæ¿å¦çã®è¨è¨
|
---|
| 86 | ======================================================================
|
---|
| 87 |
|
---|
| 88 | ======================================================================
|
---|
| 89 | â start_dispatch
|
---|
| 90 | æ¦è¦:
|
---|
| 91 | ã»StartOSçµäºå¾ã«å¦çåä½ãèµ·åãã
|
---|
| 92 | ã³ã³ããã¹ãåæ¿:
|
---|
| 93 | ã»mainé¢æ° â ã¿ã¹ã¯
|
---|
| 94 | ã»mainé¢æ° â ã¢ã¤ãã«ã«ã¼ã
|
---|
| 95 | åæ:
|
---|
| 96 | ã»å
|
---|
| 97 | ¨å²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
| 98 | ã§å¼ã°ãã
|
---|
| 99 | ã»saved_ostkpt == NULL
|
---|
| 100 | ã·ã¼ã±ã³ã¹:
|
---|
| 101 | sp = _ostkpt
|
---|
| 102 | OSå²è¾¼ã¿ç¦æ¢
|
---|
| 103 | å
|
---|
| 104 | ¨å²è¾¼ã¿ç¦æ¢ã解é¤
|
---|
| 105 | dispatcher_0()
|
---|
| 106 |
|
---|
| 107 | ======================================================================
|
---|
| 108 | â dispatch
|
---|
| 109 | æ¦è¦:
|
---|
| 110 | ã»ã¿ã¹ã¯ã³ã³ããã¹ãããAPIãå¼ã³åºãï¼ãã®ä¸ã§ã¿ã¹ã¯åæ¿ã
|
---|
| 111 | ãçºçãã
|
---|
| 112 | ã³ã³ããã¹ãåæ¿:
|
---|
| 113 | ã»ã¿ã¹ã¯ â ã¿ã¹ã¯
|
---|
| 114 | åæ:
|
---|
| 115 | ã»OSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
| 116 | ã§å¼ã°ãã
|
---|
| 117 | ã»sp == å¼åºãå
|
---|
| 118 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 119 | ã»å¼åºãå
|
---|
| 120 | ã¿ã¹ã¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã¯ï¼ã·ã¹ãã ãµã¼ãã¹
|
---|
| 121 | ãã®å
|
---|
| 122 | ¥ãå£ã§ä¿åæ¸ã¿
|
---|
| 123 | ã»å¼åºãå
|
---|
| 124 | ã¿ã¹ã¯ã®caller-savedã¬ã¸ã¹ã¿ã¯ï¼dispatchå¼åºãæã«
|
---|
| 125 | ãå¼åºãå
|
---|
| 126 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯ã«ä¿åæ¸ã¿
|
---|
| 127 | ã»callevel == TCL_TASK | TSYS_NULL
|
---|
| 128 | ã»å²è¾¼ã¿åªå
|
---|
| 129 | 度ãã¹ã¯å
|
---|
| 130 | ¨è§£é¤ç¶æ
|
---|
| 131 |
|
---|
| 132 | ã»ãã£ã¹ãããä¿çç¶æ
|
---|
| 133 | ã§ãªãï¼TPã§ã®OSAPéãªã½ã¼ã¹åå¾ç¶æ
|
---|
| 134 | ã§ãªãï¼
|
---|
| 135 | ã·ã¼ã±ã³ã¹:
|
---|
| 136 | callee-savedã¬ã¸ã¹ã¿ãå¼åºãå
|
---|
| 137 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯ã«ä¿å
|
---|
| 138 | spãå¼åºãå
|
---|
| 139 | ã¿ã¹ã¯ã®TCB.spã«ä¿å
|
---|
| 140 | dispatch_rãå¼åºãå
|
---|
| 141 | ã¿ã¹ã¯ã®TCB.pcã«ä¿å
|
---|
| 142 | å®è¡ä¸ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯ã®ã¢ãã¿ãªã³ã°
|
---|
| 143 | 4-1. ã¹ã¿ãã¯ãã¤ã³ã¿ãã§ãã¯
|
---|
| 144 | 4-2. ãã¸ãã¯ãã³ãã¼ãã§ãã¯
|
---|
| 145 | dispatcher()
|
---|
| 146 |
|
---|
| 147 | ======================================================================
|
---|
| 148 | â dispatch_r
|
---|
| 149 | æ¦è¦:
|
---|
| 150 | ã»APIå¼åºã(dispatchå¼åºã)ã§ããªã¨ã³ãããããã¿ã¹ã¯ã³ã³ããã¹ã
|
---|
| 151 | ãã®å¾©å¸°
|
---|
| 152 | ã³ã³ããã¹ãåæ¿:
|
---|
| 153 | ã»ã¿ã¹ã¯ â ã¿ã¹ã¯
|
---|
| 154 | åæ:
|
---|
| 155 | ã»OSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
| 156 | ã§å¼ã°ãã
|
---|
| 157 | ã»sp == å¼åºãå
|
---|
| 158 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 159 | ã»å¼åºãå
|
---|
| 160 | ã¿ã¹ã¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã¯ï¼ã·ã¹ãã ãµã¼ãã¹
|
---|
| 161 | ãã®åºå£ã§å¾©å¸°ããã
|
---|
| 162 | ã»å¼åºãå
|
---|
| 163 | ã¿ã¹ã¯ã®caller-savedã¬ã¸ã¹ã¿ã¯ï¼dispatch_rããã®ãªã¿ã¼ã³
|
---|
| 164 | æã«å¼åºãå
|
---|
| 165 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯ãã復帰ããã
|
---|
| 166 | ã»callevel == TCL_TASK | TSYS_NULL
|
---|
| 167 | ã»å²è¾¼ã¿åªå
|
---|
| 168 | 度ãã¹ã¯å
|
---|
| 169 | ¨è§£é¤ç¶æ
|
---|
| 170 |
|
---|
| 171 | ã»ãã£ã¹ãããä¿çç¶æ
|
---|
| 172 | ã§ãªãï¼TPã§ã®OSAPéãªã½ã¼ã¹åå¾ç¶æ
|
---|
| 173 | ã§ãªãï¼
|
---|
| 174 | ã·ã¼ã±ã³ã¹:
|
---|
| 175 | callee-savedã¬ã¸ã¹ã¿ãå¼åºãå
|
---|
| 176 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯ãã復帰
|
---|
| 177 | return;
|
---|
| 178 |
|
---|
| 179 | ======================================================================
|
---|
| 180 | â C2ISRåºå
|
---|
| 181 | ¥ãå£
|
---|
| 182 | æ¦è¦(a):
|
---|
| 183 | ã»å²è¾¼ã¿çºçã«ä¼´ãã³ã³ããã¹ãåæ¿ããã³C2ISRã®èµ·å
|
---|
| 184 | æ¦è¦(b):
|
---|
| 185 | ã»ISRçµäºã«ä¼´ãã³ã³ããã¹ãåæ¿
|
---|
| 186 | ã»ãã®æç¹ã§ã¯å®è¡ä¸ã¿ã¹ã¯ã®åæ¿ã¯ã¾ã çºçããªã
|
---|
| 187 | æ¦è¦(c):
|
---|
| 188 | ã»ISRä¸ã«çããã¿ã¹ã¯åæ¿è¦æ±ã«ä¼´ãé
|
---|
| 189 | 延ã¿ã¹ã¯ãã£ã¹ããã
|
---|
| 190 | æ¦è¦(d):
|
---|
| 191 | ã»é
|
---|
| 192 | 延ã¿ã¹ã¯ãã£ã¹ãããããã¿ã¹ã¯ã³ã³ããã¹ãã®å¾©å¸°
|
---|
| 193 | ã³ã³ããã¹ãåæ¿(a):
|
---|
| 194 | ã»ã¿ã¹ã¯ â C2ISR
|
---|
| 195 | ã»C2ISR â C2ISR
|
---|
| 196 | ã»ã¢ã¤ãã« â C2ISR
|
---|
| 197 | ã³ã³ããã¹ãåæ¿(b):
|
---|
| 198 | ã»C2ISR â ã¿ã¹ã¯ï¼é常çµäºï¼
|
---|
| 199 | ã»C2ISR â C2ISRï¼é常çµäºï¼
|
---|
| 200 | ã»C2ISR â ã¢ã¤ãã«ï¼é常çµäºï¼
|
---|
| 201 | ã»ããã¯ã«ã¼ãã³ â C2ISRï¼C2ISRå¼·å¶çµäºï¼
|
---|
| 202 | ã»ããã¯ã«ã¼ãã³ â ã¿ã¹ã¯ï¼C2ISRå¼·å¶çµäºï¼
|
---|
| 203 | ã»ããã¯ã«ã¼ãã³ â ã¢ã¤ãã«ï¼C2ISRå¼·å¶çµäºï¼
|
---|
| 204 | ã³ã³ããã¹ãåæ¿(c):
|
---|
| 205 | ã»ã¿ã¹ã¯ â ã¿ã¹ã¯
|
---|
| 206 | ã³ã³ããã¹ãåæ¿(d):
|
---|
| 207 | ã»ã¿ã¹ã¯ â ã¿ã¹ã¯
|
---|
| 208 | åæ:
|
---|
| 209 | ã»callevel == TCL_NULL || TCL_TASK || TCL_ISR2 | TSYS_NULL
|
---|
| 210 | ã·ã¼ã±ã³ã¹:
|
---|
| 211 | ------------------------------ ãããã(a) ------------------------------
|
---|
| 212 | å°ãªãã¨ãOSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
| 213 | ã¨ãã
|
---|
| 214 | if (å²è¾¼ã¿çºçæã«ã¦ã¼ã¶ã¢ã¼ã) :
|
---|
| 215 | if (p_runisr != NULL) : // C2ISRã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
| 216 | p_runisr->usp = sp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å
|
---|
| 217 | sp = p_runisr->p_isrinib->sstk_bottom; // ã·ã¹ãã ã¹ã¿ãã¯ã«åæ¿ã
|
---|
| 218 | else : // ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
| 219 | p_runtsk->usp = sp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å
|
---|
| 220 | sp = p_runtsk->p_tinib->sstk_bottom; // ã·ã¹ãã ã¹ã¿ãã¯ã«åæ¿ã
|
---|
| 221 | /*
|
---|
| 222 | * ãã®æç¹ã§ï¼spã¯ä»¥ä¸ã®ãããããæãã¦ãã
|
---|
| 223 | * - ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 224 | * - ISRã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 225 | * - OSã¹ã¿ãã¯ï¼ã¢ã¤ãã«ã«ã¼ãã®ã³ã³ããã¹ãï¼
|
---|
| 226 | */
|
---|
| 227 | ãã¹ã¦ã®æ±ç¨ã¬ã¸ã¹ã¿ãspã«ä¿å
|
---|
| 228 | å²è¾¼ã¿çºçæã®å²è¾¼ã¿åªå
|
---|
| 229 | 度ãã¹ã¯ãspã«ä¿å
|
---|
| 230 | å²è¾¼ã¿çºçæã®callevelãspã«ä¿å
|
---|
| 231 | /* ãã®æç¹ã§ã®spãæãã¹ã¿ãã¯ã¢ãã¿ãªã³ã° */
|
---|
| 232 | /* å²è¾¼ã¿çºçæã®å¦çåä½ã®ããªã¨ã³ãã */
|
---|
| 233 | if (p_runisr != NULL) : // ISRã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
| 234 | p_runisr->ssp = sp
|
---|
| 235 | queue_insert_next(&isr_ready_queue, p_runisr)
|
---|
| 236 | else if (p_runtsk != NULL) : // ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
| 237 | p_runtsk->ssp = sp
|
---|
| 238 | else : // ã¢ã¤ãã«ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
| 239 | saved_ostkpt = sp
|
---|
| 240 | /* çºçããå²è¾¼ã¿ã®ISRãèµ·å */
|
---|
| 241 | callevel |= TCL_ISR2
|
---|
| 242 | p_runisr = &isrcb_table[çºçããå²è¾¼ã¿ã«å¯¾å¿ããISR ID]
|
---|
| 243 | p_runosap = p_runisr->p_isrinib->p_osapcb
|
---|
| 244 | run_trusted = p_runosap->p_osapinib->osap_trusted
|
---|
| 245 | if (run_trusted) : // èµ·åããISRãä¿¡é ¼
|
---|
| 246 | sp = p_runisr->p_isrinib->sstk_bottom
|
---|
| 247 | OSå²è¾¼ã¿ç¦æ¢ã解é¤ãã
|
---|
| 248 | å²è¾¼ã¿ãã³ãã©ã¸ã¸ã£ã³ã
|
---|
| 249 | else : // èµ·åããISRãéä¿¡é ¼
|
---|
| 250 | p_runisrã«å¯¾å¿ããMPUè¨å®ã¨ãªãããã«æºå
|
---|
| 251 | sp = p_runisr->p_isrinib->ustk_bottomã¨ãªãããã«æºå
|
---|
| 252 | æ»ãçªå°ãexit_uisrã¨ãªãããã«æºå
|
---|
| 253 | OSå²è¾¼ã¿ç¦æ¢è§£é¤ç¶æ
|
---|
| 254 | ã¨ãªãããã«æºåãã
|
---|
| 255 | éç¹æ¨©ã¢ã¼ãã¨ãªãããã«æºå
|
---|
| 256 | å²è¾¼ã¿ãã³ãã©ã¸ã¸ã£ã³ããï¼MPUï¼spï¼æ»ãçªå°ï¼éç¹æ¨©ã¢ã¼ãè¨å®ãåæ
|
---|
| 257 | ------------------------------ ããã¾ã§(a) ------------------------------
|
---|
| 258 | ------------------------------ ãããã(b) ------------------------------
|
---|
| 259 | /* å²è¾¼ã¿ãã³ãã©çµäºå¾ã«ï¼ç¹æ¨©ã¢ã¼ãã§ããã«æ¥ã */
|
---|
| 260 | âTODO syscallãéä¿¡é ¼ã¿ã¹ã¯ãå¼ãã å ´åãèæ
|
---|
| 261 | ®ãã¹ãï¼p_runisrãNULLã§ãªã
|
---|
| 262 | ãã¨ããã§ãã¯ããã°ããï¼ï¼[protection_hookãå¼ã¶ï¼]
|
---|
| 263 | end_int_handler<label>:
|
---|
| 264 | å°ãªãã¨ãOSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
| 265 | ã¨ãã
|
---|
| 266 | /* å²è¾¼ã¿ãã³ãã©çµäºæã®ã¹ã¿ãã¯ã¢ãã¿ãªã³ã° */
|
---|
| 267 | exit_isr2() // ISRã®ä¸æ£çµäºãã§ãã¯
|
---|
| 268 | /* å®è¡ä¸ã®å²è¾¼ã¿ãã³ãã©ãå¼·å¶çµäºãããå ´åã«ï¼ç¹æ¨©ã¢ã¼ãã§ããã«æ¥ã */
|
---|
| 269 | exit_and_dispatch_isr<label>:
|
---|
| 270 | p_runisr = NULL
|
---|
| 271 | if (!queue_empty(&isr_ready_queue)) : // ããªã¨ã³ãããããISRããã
|
---|
| 272 | p_runisr = queue_delete_next(&isr_ready_queue)
|
---|
| 273 | p_runosap = p_runisr->p_isrinib->p_osapcb
|
---|
| 274 | run_trusted = p_runosap->p_osapinib->osap_trusted
|
---|
| 275 | p_runisrã«å¯¾å¿ããMPUè¨å®ã¨ãªãããã«æºå
|
---|
| 276 | sp = p_runisr->ssp
|
---|
| 277 | else if (p_runtsk != NULL) : // ããªã¨ã³ãããããã¿ã¹ã¯ããã
|
---|
| 278 | p_runosap = p_runtsk->p_tskinib->p_osapcb
|
---|
| 279 | run_trusted = p_runosap->p_osapinib->osap_trusted
|
---|
| 280 | p_runtskã«å¯¾å¿ããMPUè¨å®ã¨ãªãããã«æºå
|
---|
| 281 | sp = p_runtsk->ssp
|
---|
| 282 | else : // ããªã¨ã³ãããããå¦çåä½ããªãï¼ã¢ã¤ãã«ã«æ»ãï¼
|
---|
| 283 | sp = saved_ostkpt
|
---|
| 284 | å²è¾¼ã¿çºçæã®callevelãspãã復帰
|
---|
| 285 | å²è¾¼ã¿çºçæã®å²è¾¼ã¿åªå
|
---|
| 286 | 度ãã¹ã¯ãspãã復帰
|
---|
| 287 | OSå²è¾¼ã¿ç¦æ¢ãã©ã°ããªã»ãã
|
---|
| 288 | if (ã¿ã¹ã¯ã³ã³ããã¹ãã«æ»ãå ´å) :
|
---|
| 289 | /*
|
---|
| 290 | * ã¢ã¤ãã«âISRâã¿ã¹ã¯ã®å ´åã¯ï¼ä¸æ¦ã¢ã¤ãã«ã«æ»ã£ã¦ãã
|
---|
| 291 | * ãã£ã¹ãããããã®ã§ããã«ã¯ããªã
|
---|
| 292 | */
|
---|
| 293 | ret_int_task()
|
---|
| 294 | ãã¹ã¦ã®æ±ç¨ã¬ã¸ã¹ã¿ãspãã復帰
|
---|
| 295 | if (å²è¾¼ã¿çºçæã«ã¦ã¼ã¶ã¢ã¼ã) :
|
---|
| 296 | if (p_runisr != NULL) : // C2ISRã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
| 297 | sp = p_runisr->usp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®å¾©å¸°
|
---|
| 298 | else : // ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
| 299 | sp = p_runtsk->usp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®å¾©å¸°
|
---|
| 300 | å²è¾¼ã¿ãããªã¿ã¼ã³
|
---|
| 301 | ------------------------------ ããã¾ã§(b) ------------------------------
|
---|
| 302 | ------------------------------ ãããã(c) ------------------------------
|
---|
| 303 | ret_int_task<label>:
|
---|
| 304 | if ((p_runtsk != p_schedtsk) && ãã£ã¹ãããä¿çç¶æ
|
---|
| 305 | ã§ãªã<<TP>>):
|
---|
| 306 | OSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
| 307 |
|
---|
| 308 | å
|
---|
| 309 | ¨å²è¾¼ã¿ç¦æ¢ã解é¤
|
---|
| 310 | /* æ±ç¨ã¬ã¸ã¹ã¿ã¯(a)ã§ä¿åæ¸ã¿ */
|
---|
| 311 | p_runtsk->ssp = sp
|
---|
| 312 | p_runtsk->pc = ret_int_r
|
---|
| 313 | dispatcher()
|
---|
| 314 | ------------------------------ ããã¾ã§(c) ------------------------------
|
---|
| 315 | ------------------------------ ãããã(d) ------------------------------
|
---|
| 316 | ret_int_r<label>:
|
---|
| 317 | å²è¾¼ã¿ã®åºå£å¦çã¨åãå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
| 318 | ã¨ãã
|
---|
| 319 | return;
|
---|
| 320 | /* returnå¾ã¯ï¼(b)ã¨åæ§ã®ã·ã¼ã±ã³ã¹ã§æ±ç¨ã¬ã¸ã¹ã¿ã復帰ãã */
|
---|
| 321 | ------------------------------ ããã¾ã§(d) ------------------------------
|
---|
| 322 |
|
---|
| 323 | ======================================================================
|
---|
| 324 | â dispatcher
|
---|
| 325 | æ¦è¦:
|
---|
| 326 | ã»ã¿ã¹ã¯åæ¿ãå®è¡ãã
|
---|
| 327 | ã³ã³ããã¹ãåæ¿:
|
---|
| 328 | ã»ã¿ã¹ã¯ â ã¿ã¹ã¯
|
---|
| 329 | åæ:
|
---|
| 330 | ã»OSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
| 331 | ã§å¼ã°ãã
|
---|
| 332 | ã»sp == å¼åºãå
|
---|
| 333 | ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 334 | ã»å¼åºãå
|
---|
| 335 | ã¿ã¹ã¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã¯ï¼ã·ã¹ãã ãµã¼ãã¹
|
---|
| 336 | ãã®å
|
---|
| 337 | ¥ãå£ or å²è¾¼ã¿çºçæã«ä¿åæ¸ã¿
|
---|
| 338 | ã»å¼åºãå
|
---|
| 339 | ã¿ã¹ã¯ã®ã¬ã¸ã¹ã¿ã¯ï¼dispatch or å²è¾¼ã¿çºçæã«ä¿åæ¸ã¿
|
---|
| 340 | ã»callevel == TCL_TASK | TSYS_NULL || TSYS_DISALLINT
|
---|
| 341 | ã»å²è¾¼ã¿åªå
|
---|
| 342 | 度ãã¹ã¯å
|
---|
| 343 | ¨è§£é¤ç¶æ
|
---|
| 344 |
|
---|
| 345 | ã»ãã£ã¹ãããä¿çç¶æ
|
---|
| 346 | ã§ãªãï¼TPã§ã®OSAPéãªã½ã¼ã¹åå¾ç¶æ
|
---|
| 347 | ã§ãªãï¼
|
---|
| 348 | ã·ã¼ã±ã³ã¹:
|
---|
| 349 | stack_change_and_call_func(call_posttaskhook)
|
---|
| 350 | exit_and_dispatch_nohook<label>:
|
---|
| 351 | dispatcher_0<label>:
|
---|
| 352 | /*å
|
---|
| 353 | ¨å²è¾¼ã¿ç¦æ¢(TSYS_DISALLINT)解é¤*/
|
---|
| 354 | callevel ~= TSYS_DISALLINT â callevel = TCL_TASKã§ããã®ã§ã¯ï¼â
|
---|
| 355 | å
|
---|
| 356 | ¨å²è¾¼ã¿ç¦æ¢ã解é¤
|
---|
| 357 | dispatcher_1<label>:
|
---|
| 358 | p_runtsk = p_schedtsk
|
---|
| 359 | if (p_runtsk == NULL) :
|
---|
| 360 | /*ã¢ã¤ãã«*/
|
---|
| 361 | sp = _ostkpt
|
---|
| 362 | OSå²è¾¼ã¿ç¦æ¢ã解é¤
|
---|
| 363 | /* ããã§å²è¾¼ã¿ãåãä»ãã */
|
---|
| 364 | /* ã¹ãªã¼ãã¢ã¼ãã«ãããªã© */
|
---|
| 365 | OSå²è¾¼ã¿ç¦æ¢
|
---|
| 366 | dispatcher_1()
|
---|
| 367 | p_runosap = p_runtsk->p_tskinib->p_osapcb
|
---|
| 368 | run_trusted = p_runosap->p_osapinib->osap_trusted
|
---|
| 369 | p_runtskã«å¯¾å¿ããMPUè¨å®ã¨ãªãããã«æºå
|
---|
| 370 | sp = p_runtsk->sp
|
---|
| 371 | stack_change_and_call_func(call_pretaskhook)
|
---|
| 372 | pc = p_runtsk->pc
|
---|
| 373 |
|
---|
| 374 | ======================================================================
|
---|
| 375 | â stack_change_and_call_func(func, arg1, arg2, ...)
|
---|
| 376 | æ¦è¦:
|
---|
| 377 | ã»ããã¯ã«ã¼ãã³å¼åºãã®åºå
|
---|
| 378 | ¥å£
|
---|
| 379 | ã»call_pretaskhook
|
---|
| 380 | ã»call_posttaskhook
|
---|
| 381 | ã»call_errorhook
|
---|
| 382 | ã»call_protectionhk_main
|
---|
| 383 | ã³ã³ããã¹ãåæ¿(a):
|
---|
| 384 | ã»ã¿ã¹ã¯ â ããã¯ã«ã¼ãã³
|
---|
| 385 | ã»ISR â ããã¯ã«ã¼ãã³
|
---|
| 386 | ã»ããã¯ã«ã¼ãã³ â ããã¯ã«ã¼ãã³
|
---|
| 387 | ã³ã³ããã¹ãåæ¿(b):
|
---|
| 388 | ã»ããã¯ã«ã¼ãã³ â ã¿ã¹ã¯ï¼é常çµäºï¼
|
---|
| 389 | ã»ããã¯ã«ã¼ãã³ â ISRï¼é常çµäºï¼
|
---|
| 390 | ã»ããã¯ã«ã¼ãã³ â ããã¯ã«ã¼ãã³ï¼é常çµäºï¼
|
---|
| 391 | ã³ã³ããã¹ãåæ¿(c):
|
---|
| 392 | ã»ããã¯ã«ã¼ãã³ â ã¿ã¹ã¯ï¼ã¿ã¹ã¯/C2ISRå¼·å¶çµäºï¼
|
---|
| 393 | ã»ããã¯ã«ã¼ãã³ â C2ISRï¼C2ISRå¼·å¶çµäºï¼
|
---|
| 394 | ã»ããã¯ã«ã¼ãã³ â ã¢ã¤ãã«ï¼ã¿ã¹ã¯/C2ISRå¼·å¶çµäºï¼
|
---|
| 395 | åæ:
|
---|
| 396 | ã»OSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
| 397 | ã§å¼ã°ãã
|
---|
| 398 | ã»sp == å¼åºãå
|
---|
| 399 | ã¿ã¹ã¯/ISRã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 400 | ã»å¼åºãå
|
---|
| 401 | ã¿ã¹ã¯ã®ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã¯ï¼ã·ã¹ãã ãµã¼ãã¹
|
---|
| 402 | ãã®å
|
---|
| 403 | ¥ãå£ or å²è¾¼ã¿çºçæã«ä¿åæ¸ã¿
|
---|
| 404 | ã»å¼åºãå
|
---|
| 405 | ã¿ã¹ã¯ã®ã¬ã¸ã¹ã¿ã¯ï¼dispatch or å²è¾¼ã¿çºçæã«ä¿åæ¸ã¿
|
---|
| 406 | ããããã¯ï¼callee-savedã§ããã°ï¼å¼ã³åºãå
|
---|
| 407 | ã³ã³ããã¹ãã§ä¿åï¼å¾©å¸°
|
---|
| 408 | ãããã
|
---|
| 409 | ã·ã¼ã±ã³ã¹:
|
---|
| 410 | ------------------------------ ãããã(a) ------------------------------
|
---|
| 411 | caller-savedã¬ã¸ã¹ã¿ãä¿å
|
---|
| 412 | if (callevel & ~(TCL_TASK | TCL_ISR2 | TSYSMASK) == 0U): /*TASK or ISR2*/
|
---|
| 413 | if (saved_ostkpt != NULL): /*ã¢ã¤ãã«ã«ã¼ãã§ã¹ã¿ãã¯ä½¿ç¨ä¸*/
|
---|
| 414 | *(saved_ostkpt - 1) = sp
|
---|
| 415 | sp = saved_ostkpt - 1
|
---|
| 416 | else:
|
---|
| 417 | *(_ostkpt - 1) = sp
|
---|
| 418 | sp = _ostkpt - 1
|
---|
| 419 | func(arg1, arg2, ...)
|
---|
| 420 | ------------------------------ ããã¾ã§(a) ------------------------------
|
---|
| 421 | ------------------------------ ãããã(b) ------------------------------
|
---|
| 422 | if (callevel & ~(TCL_TASK | TCL_ISR2 | TSYSMASK) == 0U): /*TASK or ISR2*/
|
---|
| 423 | sp = *(sp+1)
|
---|
| 424 | caller-savedã¬ã¸ã¹ã¿ã復帰
|
---|
| 425 | return;
|
---|
| 426 | ------------------------------ ããã¾ã§(b) ------------------------------
|
---|
| 427 | ------------------------------ ãããã(c) ------------------------------
|
---|
| 428 | /*
|
---|
| 429 | * OSAP/ã¿ã¹ã¯/ISRã®å¼·å¶çµäºãã§ããã®ã¯ï¼å段ã®ããã¯ã«ã¼ãã³ã®ã¿ï¼å®è¡
|
---|
| 430 | * ä¸ã®OSAP/ã¿ã¹ã¯/ISRãå¼·å¶çµäºããã¨ãã ãã§ãã
|
---|
| 431 | * - ãããã¯ã·ã§ã³ããã¯ããã®å¼·å¶çµäºï¼ããã¯ã«ã¼ãã³ã®å¼åºãå
|
---|
| 432 | ãã¦ã¼ã¶
|
---|
| 433 | * ã¢ã¼ãã®ã¿OSAP/ã¿ã¹ã¯/ISRã®å¼·å¶çµäºãå¯è½ã§ãããã
|
---|
| 434 | * - ã¨ã©ã¼ããã¯ããã®å¼·å¶çµäºï¼ããã¯ã«ã¼ãã³ããã¹ããã¦ããå ´åï¼
|
---|
| 435 | * ãã¹ãå
|
---|
| 436 | ã®å¼åºãå¶éã«ããï¼TerminateApplicationãå¼ã¹ãªã
|
---|
| 437 | * ï¼ã¨ã©ã¼ããã¯ãå¤éã«å¼ã°ãããã¨ã¯ãªãï¼
|
---|
| 438 | * 以ä¸ã®çç±ããï¼force_term_osapã§ï¼
|
---|
| 439 | * - exit_and_dispatch_nohook
|
---|
| 440 | * - isr_dispatcher
|
---|
| 441 | * ã«ã¸ã£ã³ãããã°ãã
|
---|
| 442 | */
|
---|
| 443 | ------------------------------ ããã¾ã§(c) ------------------------------
|
---|
| 444 |
|
---|
| 445 | ======================================================================
|
---|
| 446 | â ä¾å¤ã®åºå
|
---|
| 447 | ¥å£
|
---|
| 448 | æ¦è¦:
|
---|
| 449 | ã»ãããã¯ã·ã§ã³ããã¯å¼åºãã®åºå
|
---|
| 450 | ¥å£
|
---|
| 451 | ã³ã³ããã¹ãåæ¿(a):
|
---|
| 452 | ã»ã¿ã¹ã¯ â ããã¯ã«ã¼ãã³
|
---|
| 453 | ã»ISR â ããã¯ã«ã¼ãã³
|
---|
| 454 | ã»ããã¯ã«ã¼ãã³ â ããã¯ã«ã¼ãã³
|
---|
| 455 | ã»ã¢ã¤ãã« â ããã¯ã«ã¼ãã³
|
---|
| 456 | ã³ã³ããã¹ãåæ¿(b):
|
---|
| 457 | ã»ããã¯ã«ã¼ãã³ â ã¿ã¹ã¯ï¼é常çµäºï¼
|
---|
| 458 | ã»ããã¯ã«ã¼ãã³ â ISRï¼é常çµäºï¼
|
---|
| 459 | ã»ããã¯ã«ã¼ãã³ â ããã¯ã«ã¼ãã³ï¼é常çµäºï¼
|
---|
| 460 | ã³ã³ããã¹ãåæ¿(c):
|
---|
| 461 | ã»ããã¯ã«ã¼ãã³ â ã¿ã¹ã¯ï¼ã¿ã¹ã¯/C2ISRå¼·å¶çµäºï¼
|
---|
| 462 | ã»ããã¯ã«ã¼ãã³ â C2ISRï¼C2ISRå¼·å¶çµäºï¼
|
---|
| 463 | ã»ããã¯ã«ã¼ãã³ â ã¢ã¤ãã«ï¼ã¿ã¹ã¯/C2ISRå¼·å¶çµäºï¼
|
---|
| 464 | åæ:
|
---|
| 465 | ã·ã¼ã±ã³ã¹:
|
---|
| 466 | ------------------------------ ãããã(a) ------------------------------
|
---|
| 467 | å°ãªãã¨ãOSå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
| 468 | ã¨ãã
|
---|
| 469 | if (å²è¾¼ã¿çºçæã«ã¦ã¼ã¶ã¢ã¼ã) :
|
---|
| 470 | if (p_runisr != NULL) : // C2ISRã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
| 471 | p_runisr->usp = sp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å
|
---|
| 472 | sp = p_runisr->p_isrinib->sstk_bottom; // ã·ã¹ãã ã¹ã¿ãã¯ã«åæ¿ã
|
---|
| 473 | else : // ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
| 474 | p_runtsk->usp = sp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å
|
---|
| 475 | sp = p_runtsk->p_tinib->sstk_bottom; // ã·ã¹ãã ã¹ã¿ãã¯ã«åæ¿ã
|
---|
| 476 | /*
|
---|
| 477 | * ãã®æç¹ã§ï¼spã¯ä»¥ä¸ã®ãããããæãã¦ãã
|
---|
| 478 | * - ã¿ã¹ã¯ã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 479 | * - ISRã®ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 480 | * - OSã¹ã¿ãã¯ï¼ã¢ã¤ãã«ã«ã¼ãã®ã³ã³ããã¹ãï¼
|
---|
| 481 | */
|
---|
| 482 | caller-savedã¬ã¸ã¹ã¿ãä¿å
|
---|
| 483 | if (callevel & ~(TCL_TASK | TCL_ISR2 | TSYSMASK) == 0U): /*TASK or ISR2*/
|
---|
| 484 | if (saved_ostkpt != NULL): /*ã¢ã¤ãã«ã«ã¼ãã§ã¹ã¿ãã¯ä½¿ç¨ä¸*/
|
---|
| 485 | *(saved_ostkpt - 1) = sp
|
---|
| 486 | sp = saved_ostkpt - 1
|
---|
| 487 | else:
|
---|
| 488 | *(_ostkpt - 1) = sp
|
---|
| 489 | sp = _ostkpt - 1
|
---|
| 490 | if (C1ISRå®è¡ä¸ã§ãªã):
|
---|
| 491 | OSå²è¾¼ã¿ç¦æ¢
|
---|
| 492 | if (ä¾å¤çºçæã«å
|
---|
| 493 | ¨å²è¾¼ã¿ç¦æ¢ã§ãªã):
|
---|
| 494 | å
|
---|
| 495 | ¨å²è¾¼ã¿ç¦æ¢è§£é¤
|
---|
| 496 | call_protectionhk_main(ã¨ã©ã¼ã³ã¼ã)
|
---|
| 497 | ------------------------------ ããã¾ã§(a) ------------------------------
|
---|
| 498 | ------------------------------ ãããã(b) ------------------------------
|
---|
| 499 | if (callevel & ~(TCL_TASK | TCL_ISR2 | TSYSMASK) == 0U): /*TASK or ISR2*/
|
---|
| 500 | sp = *(sp++)
|
---|
| 501 | caller-savedã¬ã¸ã¹ã¿ã復帰
|
---|
| 502 | if (å²è¾¼ã¿çºçæã«ã¦ã¼ã¶ã¢ã¼ã) :
|
---|
| 503 | if (p_runisr != NULL) : // C2ISRã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
| 504 | sp = p_runisr->usp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®å¾©å¸°
|
---|
| 505 | else : // ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç
|
---|
| 506 | sp = p_runtsk->usp; // ã¦ã¼ã¶ã¹ã¿ãã¯ãã¤ã³ã¿ã®å¾©å¸°
|
---|
| 507 | return;
|
---|
| 508 | ------------------------------ ããã¾ã§(b) ------------------------------
|
---|
| 509 | ------------------------------ ãããã(c) ------------------------------
|
---|
| 510 | /*
|
---|
| 511 | * OSAP/ã¿ã¹ã¯/ISRã®å¼·å¶çµäºãã§ããã®ã¯ï¼å段ã®ããã¯ã«ã¼ãã³ã®ã¿ï¼å®è¡
|
---|
| 512 | * ä¸ã®OSAP/ã¿ã¹ã¯/ISRãå¼·å¶çµäºããã¨ãã ãã§ãã
|
---|
| 513 | * - ãããã¯ã·ã§ã³ããã¯ããã®å¼·å¶çµäºï¼ããã¯ã«ã¼ãã³ã®å¼åºãå
|
---|
| 514 | ãã¦ã¼ã¶
|
---|
| 515 | * ã¢ã¼ãã®ã¿OSAP/ã¿ã¹ã¯/ISRã®å¼·å¶çµäºãå¯è½ã§ãããã
|
---|
| 516 | * - ã¨ã©ã¼ããã¯ããã®å¼·å¶çµäºï¼ããã¯ã«ã¼ãã³ããã¹ããã¦ããå ´åï¼
|
---|
| 517 | * ãã¹ãå
|
---|
| 518 | ã®å¼åºãå¶éã«ããï¼TerminateApplicationãå¼ã¹ãªã
|
---|
| 519 | * ï¼ã¨ã©ã¼ããã¯ãå¤éã«å¼ã°ãããã¨ã¯ãªãï¼
|
---|
| 520 | * 以ä¸ã®çç±ããï¼force_term_osapã§ï¼
|
---|
| 521 | * - exit_and_dispatch_nohook
|
---|
| 522 | * - isr_dispatcher
|
---|
| 523 | * ã«ã¸ã£ã³ãããã°ãã
|
---|
| 524 | */
|
---|
| 525 | ------------------------------ ããã¾ã§(c) ------------------------------
|
---|
| 526 |
|
---|
| 527 | ======================================================================
|
---|
| 528 | ⯠OSAPå¼·å¶çµäºå¦çã®è¨è¨ï¼ã·ã³ã°ã«ã³ã¢ã®å ´åï¼
|
---|
| 529 | ======================================================================
|
---|
| 530 |
|
---|
| 531 | /*
|
---|
| 532 | * ãããã¯ã·ã§ã³ããã¯ã®åºå£ï¼TerminateApplicationï¼ã¨ãã«
|
---|
| 533 | * ããã¸æ¥ã
|
---|
| 534 | * ããã«æ¥ããã¹ã¯ä»¥ä¸ã®ã¨ãã
|
---|
| 535 | * - ã¿ã¹ã¯ â ãããã¯ã·ã§ã³ãã㯠â PRO_TERMINATE_APPL
|
---|
| 536 | * - ISR â ãããã¯ã·ã§ã³ãã㯠â PRO_TERMINATE_APPL
|
---|
| 537 | * - ã¿ã¹ã¯ â ã¨ã©ã¼ãã㯠â TerminateApplication
|
---|
| 538 | * - ISR â ã¨ã©ã¼ãã㯠â TerminateApplication
|
---|
| 539 | * - ã¿ã¹ã¯ â TerminateApplication
|
---|
| 540 | * - ISR â TerminateApplication
|
---|
| 541 | */
|
---|
| 542 | void
|
---|
| 543 | force_term_osap(OSAPCB *p_osapcb, RestartType RestartOption)
|
---|
| 544 | {
|
---|
| 545 | TCB *p_tcb;
|
---|
| 546 | PriorityType remove_task_pri;
|
---|
| 547 |
|
---|
| 548 | /* osap_statã®æ´æ° */
|
---|
| 549 | if (RestartOption == RESTART) {
|
---|
| 550 | p_osapcb->osap_stat = APPLICATION_RESTARTING;
|
---|
| 551 | if (p_osapcb->p_osapinib->p_restart_tcb->p_tinib->task == NULL) {
|
---|
| 552 | /* ãªã¹ã¿ã¼ãã¿ã¹ã¯ã®è¨å®ããªãã«ããããããï¼*/
|
---|
| 553 | /* RESTARTãªãã·ã§ã³ãè¨å®ããå ´åã¯ã·ã£ãããã¦ã³ãå®æ½ãã */
|
---|
| 554 | /* TerminateApplicationã®å ´åã¯ããã«æ¥ãåã«ã¯ããã¦ãã */
|
---|
| 555 | internal_shutdownos(E_OS_PROTECTION_FATAL);
|
---|
| 556 | }
|
---|
| 557 | }
|
---|
| 558 | else {
|
---|
| 559 | p_osapcb->osap_stat = APPLICATION_TERMINATED;
|
---|
| 560 | }
|
---|
| 561 |
|
---|
| 562 | /*ã¢ã©ã¼ã ã¨ã¹ã±ã¸ã¥ã¼ã«ãã¼ãã«ãåæ¢*/
|
---|
| 563 | force_term_osap_alarm(p_osapcb);
|
---|
| 564 | force_term_osap_schtbl(p_osapcb);
|
---|
| 565 | /*ISRãåæ¢*/
|
---|
| 566 | force_term_osap_isr(p_osapcb);
|
---|
| 567 |
|
---|
| 568 | p_tcb = p_osapcb->p_osapinib->p_restart_tcb;
|
---|
| 569 |
|
---|
| 570 | /* ãªã¹ã¿ã¼ãã¿ã¹ã¯ãæ¢ã«READYç¶æ
|
---|
| 571 | ã®å ´åã¯ã¬ãã£ãã¥ã¼ããåé¤ãã */
|
---|
| 572 | if (p_tcb->tstat == READY) {
|
---|
| 573 | /* ãªã¹ã¿ã¼ãã¿ã¹ã¯ã®çµäº */
|
---|
| 574 | p_tcb->actcnt = 0U;
|
---|
| 575 | #ifdef CFG_USE_PROTECTIONHOOK
|
---|
| 576 | p_tcb->calltfn = FALSE;
|
---|
| 577 | #endif /* CFG_USE_PROTECTIONHOOK */
|
---|
| 578 | /* curpriã¨inipriãç°ãªãå¤ã§ã¬ãã£ãã¥ã¼ã«ç¹ããã¦ããå ´åã¸ã®å¯¾å¿ */
|
---|
| 579 | remove_task_pri = p_tcb->curpri;
|
---|
| 580 |
|
---|
| 581 | /* ãªã½ã¼ã¹ç¢ºä¿ããã¾ã¾ã®å ´åï¼ãªã½ã¼ã¹è§£æ¾ */
|
---|
| 582 | release_taskresources(p_tcb);
|
---|
| 583 |
|
---|
| 584 | /* ã«ã¦ã³ã¿ã®ç¶æ
|
---|
| 585 | ãåæåãã */
|
---|
| 586 | cancel_taskcounters(p_tcb);
|
---|
| 587 |
|
---|
| 588 | /* 対象ã¿ã¹ã¯ãSUSPENDç¶æ
|
---|
| 589 | ã¨ãï¼ã¬ãã£ãã¥ã¼ããåé¤ãã */
|
---|
| 590 | p_tcb->tstat = SUSPENDED;
|
---|
| 591 | if (p_tcb != p_schedtsk) {
|
---|
| 592 | remove_task_from_queue(p_tcb, remove_task_pri);
|
---|
| 593 | /* p_schedtskããã¥ã¼ã®å
|
---|
| 594 | é ã«éé¿ */
|
---|
| 595 | move_schedtsk();
|
---|
| 596 | }
|
---|
| 597 | }
|
---|
| 598 | else if (p_schedtsk != NULL) {
|
---|
| 599 | /* p_schedtskãNULLã§ãªããã°ï¼ãã¥ã¼ã®å
|
---|
| 600 | é ã«éé¿ */
|
---|
| 601 | move_schedtsk();
|
---|
| 602 | }
|
---|
| 603 | else {
|
---|
| 604 | /* p_schedtskãNULLã®å ´åã¯ä½ãããªã */
|
---|
| 605 | }
|
---|
| 606 |
|
---|
| 607 | /* ãªã¹ã¿ã¼ãã¿ã¹ã¯ã®pcã«force_term_osap_mainã®ã¢ãã¬ã¹ãæ ¼ç´ */
|
---|
| 608 | activate_force_term_osap_main(p_tcb);
|
---|
| 609 |
|
---|
| 610 | /* curpriãæé«åªå
|
---|
| 611 | 度ã«å¤æ´ */
|
---|
| 612 | p_tcb->curpri = TPRI_MAXTASK;
|
---|
| 613 |
|
---|
| 614 | /* p_schedtskã«p_restart_tcbãæ ¼ç´ */
|
---|
| 615 | p_schedtsk = p_tcb;
|
---|
| 616 |
|
---|
| 617 | if (p_osapcb != p_runosap) {
|
---|
| 618 | /* ä»ã®OSAPãçµäº/åèµ·åããå ´å */
|
---|
| 619 | if ((callevel_stat & TCL_ISR2) != TCL_NULL) {
|
---|
| 620 | /* C2ISRããå¼ã³åºãããå ´åã¯,C2ISRã®åºå£å¦ç㧠*/
|
---|
| 621 | /* ãã£ã¹ããããè¡ãããï¼ããã§ã¯å®æ½ããªã */
|
---|
| 622 | }
|
---|
| 623 | else {
|
---|
| 624 | /*ã¿ã¹ã¯ããå¼ã³åºãããå ´åã¯ãªã¹ã¿ã¼ãã¿ã¹ã¯ã«ãã£ã¹ããã*/
|
---|
| 625 | dispatch();
|
---|
| 626 | }
|
---|
| 627 | }
|
---|
| 628 | else {
|
---|
| 629 | /* èªOSAPãçµäº/åèµ·åããå ´åã¯,å¼ã³åºãå
|
---|
| 630 | ã«æ»ããªã */
|
---|
| 631 | if (p_runisr != NULL) {
|
---|
| 632 | /* ISRã®å²è¾¼ã¿ç¦æ¢ãè§£é¤ */
|
---|
| 633 | /* OSå²è¾¼ã¿ç¦æ¢ãã©ã°ã¯ï¼å²è¾¼ã¿åºå£ã§å²è¾¼ã¿åªå
|
---|
| 634 | 度ãã¹ã¯ã
|
---|
| 635 | ã åæ ãããããã«ï¼å²è¾¼ã¿åºå£ã§ä¸å¾è§£é¤ããã */
|
---|
| 636 | if (sus_os_cnt > 0U) {
|
---|
| 637 | sus_os_cnt = 0U;
|
---|
| 638 | }
|
---|
| 639 | exit_and_dispatch_isr();
|
---|
| 640 | }
|
---|
| 641 | else {
|
---|
| 642 | /* ã¿ã¹ã¯ã®å²è¾¼ã¿ç¦æ¢ï¼ãã©ã°ããã³ã«ã¦ã³ã¿ï¼ã¯
|
---|
| 643 | ãªã¹ã¿ã¼ãã¿ã¹ã¯ã§è§£é¤ */
|
---|
| 644 | /* TODO: ã¿ã¹ã¯ã®å²è¾¼ã¿ç¦æ¢ã«ã¦ã³ã¿ãããã§è§£é¤ãã¦ãããã */
|
---|
| 645 | exit_and_dispatch_nohook();
|
---|
| 646 | }
|
---|
| 647 | }
|
---|
| 648 | }
|
---|
| 649 |
|
---|
| 650 | void
|
---|
| 651 | force_term_osap_isr(OSAPCB *p_osapcb)
|
---|
| 652 | {
|
---|
| 653 | ISRType i;
|
---|
| 654 | ISRCB *p_isrcb
|
---|
| 655 | const INTINIB *p_intinib;
|
---|
| 656 |
|
---|
| 657 | /* ã¬ãã£ãã¥ã¼ã«ç¹ããã¦ããISRãå¼·å¶çµäº */
|
---|
| 658 | for (p_isrcb = (&isr_ready_queue)->p_next;
|
---|
| 659 | p_isrcb != &isr_ready_queue;
|
---|
| 660 | p_isrcb = p_isrcb->isr_queue.p_next) {
|
---|
| 661 | if (p_isrcb->p_isrinib->p_osapcb == p_osapcb) {
|
---|
| 662 | #ifdef CFG_USE_PROTECTIONHOOK
|
---|
| 663 | p_isrcb->calltfn = FALSE;
|
---|
| 664 | #endif /* CFG_USE_PROTECTIONHOOK */
|
---|
| 665 | /* ãªã½ã¼ã¹ç¢ºä¿ããã¾ã¾ã®å ´åï¼ãªã½ã¼ã¹è§£æ¾ */
|
---|
| 666 | release_isrresources(p_isrcb);
|
---|
| 667 | /* ã«ã¦ã³ã¿ã®ç¶æ
|
---|
| 668 | ãåæåãã */
|
---|
| 669 | cancel_isrcounters(p_isrcb);
|
---|
| 670 | /*ã¬ãã£ãã¥ã¼ããé¤å¤*/
|
---|
| 671 | queue_delete(p_isrcb);
|
---|
| 672 | }
|
---|
| 673 | }
|
---|
| 674 |
|
---|
| 675 | if (p_runisr != NULL && p_runisr->p_isrinib->p_osapcb == p_osapcb) {
|
---|
| 676 | #ifdef CFG_USE_PROTECTIONHOOK
|
---|
| 677 | p_isrcb->calltfn = FALSE;
|
---|
| 678 | #endif /* CFG_USE_PROTECTIONHOOK */
|
---|
| 679 | /* ãªã½ã¼ã¹ç¢ºä¿ããã¾ã¾ã®å ´åï¼ãªã½ã¼ã¹è§£æ¾ */
|
---|
| 680 | release_isrresources(p_isrcb);
|
---|
| 681 | /* ã«ã¦ã³ã¿ã®ç¶æ
|
---|
| 682 | ãåæåãã */
|
---|
| 683 | cancel_isrcounters(p_isrcb);
|
---|
| 684 | }
|
---|
| 685 |
|
---|
| 686 | for (i = 0U; i < tnum_isr2; i++) {
|
---|
| 687 | p_isrcb = &(isrcb_table[i]);
|
---|
| 688 | if (p_isrcb->p_isrinib->p_osapcb == p_osapcb) {
|
---|
| 689 | p_intinib = &(intinib_table[i]);
|
---|
| 690 | x_disable_int(p_intinib->intno);
|
---|
| 691 | }
|
---|
| 692 | }
|
---|
| 693 | }
|
---|
| 694 |
|
---|
| 695 | ======================================================================
|
---|
| 696 | ⯠ISRå¼·å¶çµäºå¦çã®è¨è¨ï¼ã·ã³ã°ã«ã³ã¢ã®å ´åï¼
|
---|
| 697 | ======================================================================
|
---|
| 698 |
|
---|
| 699 | /*
|
---|
| 700 | * ãããã¯ã·ã§ã³ããã¯ã®åºå£ããããã¸æ¥ã
|
---|
| 701 | * ããã«æ¥ããã¹ã¯ä»¥ä¸ã®ã¨ãã
|
---|
| 702 | * - ISR â ãããã¯ã·ã§ã³ãã㯠â PRO_TERMINATE_TASKISR
|
---|
| 703 | */
|
---|
| 704 | void
|
---|
| 705 | force_terminate_isr(ISRCB *p_isrcb)
|
---|
| 706 | {
|
---|
| 707 | /*
|
---|
| 708 | * å²è¾¼ã¿ç¦æ¢ã解é¤ãã
|
---|
| 709 | * ã¨ã©ã¼ããã¯ãå¼ã°ãªãããï¼å¼æ°ã«OSServiceId_Invalidããã
|
---|
| 710 | */
|
---|
| 711 | release_interrupts(OSServiceId_Invalid);
|
---|
| 712 |
|
---|
| 713 | /* ãªã½ã¼ã¹ç¢ºä¿ããã¾ã¾ã®å ´åï¼ãªã½ã¼ã¹è§£æ¾ */
|
---|
| 714 | release_isrresources(p_isrcb);
|
---|
| 715 | /* ã«ã¦ã³ã¿ã®ç¶æ
|
---|
| 716 | ãåæåãã */
|
---|
| 717 | cancel_isrcounters(p_isrcb);
|
---|
| 718 |
|
---|
| 719 | exit_and_dispatch_isr();
|
---|
| 720 | }
|
---|
| 721 |
|
---|
| 722 | void
|
---|
| 723 | call_protectionhk_main(StatusType protection_error)
|
---|
| 724 | {
|
---|
| 725 | ...
|
---|
| 726 | pret = ProtectionHook(protection_error);
|
---|
| 727 | LOG_PROHOOK_LEAVE(pret);
|
---|
| 728 | run_trusted = saved_run_trusted;
|
---|
| 729 |
|
---|
| 730 | LEAVE_CALLEVEL(TCL_PROTECT);
|
---|
| 731 |
|
---|
| 732 | /* ä»¥ä¸ ProtectionHook å®è¡å¾ã®å¦ç */
|
---|
| 733 | switch (pret) {
|
---|
| 734 | case PRO_SHUTDOWN:
|
---|
| 735 | internal_shutdownos(protection_error);
|
---|
| 736 | break;
|
---|
| 737 | case PRO_TERMINATETASKISR:
|
---|
| 738 | if ((p_runisr != NULL) || (pre_protection_supervised == FALSE)) {
|
---|
| 739 | /* éä¿¡é ¼ISRã®å ´å */
|
---|
| 740 | force_terminate_isr(p_runisr);
|
---|
| 741 | }
|
---|
| 742 | else if ((p_runtsk != NULL) || (pre_protection_supervised == FALSE)) {
|
---|
| 743 | /* éä¿¡é ¼ã¿ã¹ã¯ã®å ´å */
|
---|
| 744 | force_terminate_task(p_runtsk);
|
---|
| 745 | }
|
---|
| 746 | else {
|
---|
| 747 | /* ä¿¡é ¼é åããã®ããã¯æã¯ã·ã£ãããã¦ã³ */
|
---|
| 748 | internal_shutdownos(E_OS_PROTECTION_FATAL);
|
---|
| 749 | }
|
---|
| 750 | break;
|
---|
| 751 | ...
|
---|
| 752 | }
|
---|
| 753 | ...
|
---|
| 754 | }
|
---|
| 755 |
|
---|
| 756 | ======================================================================
|
---|
| 757 | ⯠ISRåèµ·åã®è¨è¨ï¼ã·ã³ã°ã«ã³ã¢ã®å ´åï¼
|
---|
| 758 | ======================================================================
|
---|
| 759 |
|
---|
| 760 | ã»EnableInterruptSourceã§åèµ·åæã«å²è¾¼ã¿ã復帰ãã
|
---|
| 761 | ã»å²è¾¼ã¿ã®å¾©å¸°ã¯ãªã¹ã¿ã¼ãã¿ã¹ã¯ï¼ã¦ã¼ã¶å®ç¾©ï¼ã«å®æ½ããã
|
---|
| 762 | ã»EnableInterruptSource/DisableInterruptSourceã¯ï¼ã¿ã¹ã¯ãªã©ã¨åæ§ã«ï¼
|
---|
| 763 | ããªã¹ã¿ã¼ãç¶æ
|
---|
| 764 | ã§ã¯èªèº«ã®OSAPã®ã¿ãæä½ã§ããããã«ãã
|
---|
| 765 | ã»ä¸è¨ã®æä½ãEnableInterruptSource/DisableInterruptSourceã«å
|
---|
| 766 | ¥ãã
|
---|
| 767 | {
|
---|
| 768 | x_nested_lock_os_int();
|
---|
| 769 | D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
|
---|
| 770 | (p_osapcb == p_runosap));
|
---|
| 771 | ...
|
---|
| 772 | x_nested_unlock_os_int();
|
---|
| 773 | }
|
---|
| 774 |
|
---|
| 775 | ======================================================================
|
---|
| 776 | ⯠ISRãã¼ã¿æ§é ã®è¨è¨ï¼ã·ã³ã°ã«ã³ã¢ã®å ´åï¼
|
---|
| 777 | ======================================================================
|
---|
| 778 | /* ISRã¬ãã£ãã¥ã¼ */
|
---|
| 779 | QUEUE isr_ready_queue;
|
---|
| 780 | ã»interrupt_initializeå
|
---|
| 781 | ã§ï¼queue_initializeã«ããåæå
|
---|
| 782 | ã»ç¡å¹å¤ã¯queue_emptyã«ããå¤å®
|
---|
| 783 |
|
---|
| 784 | /* ISRåæåã³ã³ããã¹ããããã¯ã追å */
|
---|
| 785 | typedef struct isr_initialization_block {
|
---|
| 786 | const INTINIB *p_intinib; /* å²è¾¼ã¿è¦æ±ã©ã¤ã³åæåãããã¯ã¸ã®ãã¤ã³ã¿ */
|
---|
| 787 | OSAPCB *p_osapcb; /* æå±ããOSã¢ããªã±ã¼ã·ã§ã³ã®ç®¡çããã㯠*/
|
---|
| 788 | uint32 acsbtmp; /* ã¢ã¯ã»ã¹è¨±å¯OSã¢ããªã±ã¼ã·ã§ã³ ãããããã */
|
---|
| 789 | #ifdef NTC2ISR
|
---|
| 790 | TSKINICTXB tskinictxb; /* ã¿ã¹ã¯åæåã³ã³ããã¹ãããã㯠*/
|
---|
| 791 | STKMPUINFOB stkmpu; /* ã¹ã¿ãã¯ã®MPUæ
|
---|
| 792 | å ± */
|
---|
| 793 | #endif /* NTC2ISR */
|
---|
| 794 | } ISRINIB;
|
---|
| 795 |
|
---|
| 796 | /* ISR管çã³ã³ããã¹ããããã¯ï¼ã«ã¦ã³ã¿ãã§ã¼ã³ï¼å¼·å¶çµäºç¨ï¼ã追å */
|
---|
| 797 | typedef struct isr_control_block {
|
---|
| 798 | #ifdef NTC2ISR
|
---|
| 799 | QUEUE isr_queue;
|
---|
| 800 | #endif /* NTC2ISR */
|
---|
| 801 | const ISRINIB *p_isrinib;
|
---|
| 802 | RESCB *p_lastrescb; /* æå¾ã«ç²å¾ãããªã½ã¼ã¹ç®¡çãããã¯ã¸ã®ãã¤ã³ã¿ */
|
---|
| 803 | #ifdef NTC2ISR
|
---|
| 804 | CNTCB *p_lastcntcb; /* æå¾ã«æä½ããã«ã¦ã³ã¿ç®¡çãããã¯ã¸ã®ãã¤ã³ã¿ */
|
---|
| 805 | TSKCTXB tskctxb; /* ã¿ã¹ã¯ã³ã³ããã¹ãããã㯠*/
|
---|
| 806 | #endif /* NTC2ISR */
|
---|
| 807 | #ifdef CFG_USE_PROTECTIONHOOK
|
---|
| 808 | boolean calltfn; /* ä¿¡é ¼é¢æ°å¼ã³åºãä¸ãã©ã° */
|
---|
| 809 | #endif /* CFG_USE_PROTECTIONHOOK */
|
---|
| 810 | } ISRCB;
|
---|
| 811 |
|
---|
| 812 |
|
---|
| 813 | ======================================================================
|
---|
| 814 | ⯠tfã®è¦ä¿®æ£ç®æï¼ã·ã³ã°ã«ã³ã¢ã®å ´åï¼
|
---|
| 815 | ======================================================================
|
---|
| 816 |
|
---|
| 817 | ã»OsIsrãéä¿¡é ¼ã«configã§ããããã«ãã
|
---|
| 818 | - $IF !OSAP.TRUSTED[ISR.OSAPID[isrid]]$ ã§ãã§ãã¯ãã¦
|
---|
| 819 | ãããç®æãï¼$IF !OSAP.TRUSTED[ISR.OSAPID[isrid]]
|
---|
| 820 | ã&& EQ(ISR.CATEGORY[isrid], "CATEGORY_1")$ã¨ãã
|
---|
| 821 | ã»å²è¾¼ã¿ãã³ãã©é¢æ°ãæå±ããOSAPããã¢ã¯ã»ã¹ã§ããé åã«é
|
---|
| 822 | ç½®ããã
|
---|
| 823 | - GENERATE_USER_INTHDRãã¿ã¼ã²ããä¾åé¨ã§å®ç¾©ãã
|
---|
| 824 | ã»ISRå°ç¨ã¹ã¿ãã¯ãçæãã
|
---|
| 825 | ãã»ã¦ã¼ã¶ã¹ã¿ãã¯ï¼ã·ã¹ãã ã¹ã¿ãã¯
|
---|
| 826 | ãã»åºæ¬ã¿ã¹ã¯ã¨åæ§ã®ãã¸ãã¯ã§çæãã/*TODO*/
|
---|
| 827 | - ã¹ã¿ãã¯å
|
---|
| 828 | ±æ
|
---|
| 829 | ã»ã¦ã¼ã¶ã¹ã¿ãã¯ãã¡ã¢ãªãªãã¸ã§ã¯ãã¨ãã¦ç»é²ãã
|
---|
| 830 |
|
---|
| 831 | 以ä¸
|
---|
| 832 |
|
---|