亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sci_ti1s.c

?? 時間觸發嵌入式系統設計模式源碼
?? C
字號:
/*------------------------------------------------------------------*-

   SCI_Ti1s.c (v1.00)

  ------------------------------------------------------------------

   This is an implementation of SCI SCHEDULER (TICK) for 8051/52.

   --- See Chapter 26 ---

   *** SLAVE NODE : TICK-ONLY (SIMPLEX) ***
   *** MASTER DOES NOT CHECK FOR SLAVE ACKNOWLEDEMENTS

   *** Uses 1232 watchdog timer ***

   *** Both Master and Slave share the same tick rate (1 ms) ***
   *** - See Master code for details ***


   COPYRIGHT
   ---------

   This code is from the book:

   PATTERNS FOR TIME-TRIGGERED EMBEDDED SYSTEMS by Michael J. Pont 
   [Pearson Education, 2001; ISBN: 0-201-33138-1].

   This code is copyright (c) 2001 by Michael J. Pont.
 
   See book for copyright details and other information.

-*------------------------------------------------------------------*/

#include "Main.h"
#include "Port.h"

#include "SCI_Ti1s.h"
#include "TLight_A.h"

// ------ Public variable declarations -----------------------------

// The array of tasks (see Sch51.c)
extern sTask SCH_tasks_G[SCH_MAX_TASKS];

// The error code variable (see Sch51.c)
extern tByte Error_code_G;

// ------ Private function prototypes ------------------------------

static void SCI_TICK1_SLAVE_Enter_Safe_State(void);

static void SCI_TICK1_SLAVE_Watchdog_Init(void);
static void SCI_TICK1_SLAVE_Watchdog_Refresh(void) reentrant;

/*------------------------------------------------------------------*-

  SCI_TICK1_SLAVE_Init()

  Scheduler initialisation function.  Prepares scheduler
  data structures and sets up timer interrupts at required rate.

  Must call this function before using the scheduler.  

-*------------------------------------------------------------------*/
void SCI_TICK1_SLAVE_Init(void) 
   {
   tByte i;
 
   // Sort out the tasks
   for (i = 0; i < SCH_MAX_TASKS; i++) 
      {
      SCH_Delete_Task(i);
      }

   // Reset the global error variable
   // - SCH_Delete_Task() will generate an error code, 
   //   (because the task array is empty)
   Error_code_G = 0;
 
   // ---------- External interrupt 0 ----------
   // The slave is driven by an interrupt input
   // The interrupt is enabled 
   // It is triggered by a falling edge at pin P3.2
   IT0 = 1;
   EX0 = 1;

   // Start the watchdog
   SCI_TICK1_SLAVE_Watchdog_Init();  
   }

/*------------------------------------------------------------------*-

  SCI_TICK1_SLAVE_Start()

  Starts the slave scheduler, by enabling interrupts.

  NOTE: Usually called after all regular tasks are added,
  to keep the tasks synchronised.

  NOTE: ONLY THE SCHEDULER INTERRUPT SHOULD BE ENABLED!!! 

-*------------------------------------------------------------------*/
void SCI_TICK1_SLAVE_Start(void) 
   {
   // Place system in a safe state
   // - slave will keep returning here if master does not start
   // - or otherwise fails.
   SCI_TICK1_SLAVE_Enter_Safe_State();

   // Now in a safe state
   // Wait here - indefinitely - for the first tick
   // (Refresh the watchdog to avoid constant watchdog restarts)
   while (IE0 == 0)
      {
      SCI_TICK1_SLAVE_Watchdog_Refresh();
      }

   // Clear the flag
   IE0 = 0;

   // Start the scheduler
   EA = 1;
   }

/*------------------------------------------------------------------*-

  SCI_TICK1_SLAVE_Update

  This is the scheduler ISR.  It is called at a rate 
  determined by the timer settings in SCI_TICK1_SLAVE_Init().

  This Slave is triggered by external interrupts.
 
-*------------------------------------------------------------------*/
void SCI_TICK1_SLAVE_Update(void) interrupt INTERRUPT_EXTERNAL_0  
   {
   tByte Index;

   // Feed the watchdog
   // Master will monitor this pin to check for slave activity 
   SCI_TICK1_SLAVE_Watchdog_Refresh();

   // Now do 'standard' scheduler updates

   // NOTE: calculations are in *TICKS* (not milliseconds)
   for (Index = 0; Index < SCH_MAX_TASKS; Index++)
      {
      // Check if there is a task at this location
      if (SCH_tasks_G[Index].pTask)
         {
         if (SCH_tasks_G[Index].Delay == 0)
            {
            // The task is due to run
            SCH_tasks_G[Index].RunMe += 1;  // Incr. the run flag

            if (SCH_tasks_G[Index].Period)
               {
               // Schedule this regular task to run again
               SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period;
               }
            }
         else
            {
            // Not yet ready to run: just decrement the delay 
            SCH_tasks_G[Index].Delay -= 1;
            }
         }         
      }
   }   

/*------------------------------------------------------------------*-

  SCI_TICK1_SLAVE_Watchdog_Init()

  This function sets up the watchdog timer.

  If the Master fails (or other error develop), 
  no tick messages will arrive, and the scheduler
  will stop.  

  To detect this situation, we have a (hardware) watchdog
  running in the slave.  This watchdog - which should be set to
  overflow at around 100ms - is used to set the system into a
  known (safe) state.  The slave will then wait (indefinitely)
  for the problem to be resolved.

  NOTE: The slave will not be generating Ack messages in these 
  circumstances.  The Master (if running) will therefore be aware
  that there is a problem.  

-*------------------------------------------------------------------*/
void SCI_TICK1_SLAVE_Watchdog_Init(void)   
   {
   // INIT NOT REQUIRED FOR 1232 EXTERNAL WATCHDOG
   // - May be required wwith different watchdog hardware
   //
   // Edit as required
   }


/*------------------------------------------------------------------*-

  SCI_TICK1_SLAVE_Watchdog_Refresh()

  Feed the external (1232) watchdog.

  Timeout is between ~60 and 250 ms (hardware dependent)

  HARDWARE: Assumes external 1232 watchdog

-*------------------------------------------------------------------*/
void SCI_TICK1_SLAVE_Watchdog_Refresh(void) reentrant
   {
   static bit WATCHDOG_state;

   // Change the state of the watchdog pin
   if (WATCHDOG_state == 1)
      {
      WATCHDOG_state = 0;
      WATCHDOG_pin = 0;
      }
   else
      {
      WATCHDOG_state = 1;
      WATCHDOG_pin = 1;
      }
   }    

/*------------------------------------------------------------------*-

  SCI_TICK1_SLAVE_Enter_Safe_State()

  This is the state enterted by the system when:
  (1) The node is powered up or reset
  (2) The Master node fails
  (3) The network has an error
  (4) Tick messages are delayed for any other reason

  Try to ensure that the system is in a 'safe' state in these 
  circumstances.

-*------------------------------------------------------------------*/
void SCI_TICK1_SLAVE_Enter_Safe_State(void)
   {
   // USER DEFINED - Edit as required
   TRAFFIC_LIGHTS_Display_Safe_Output();
   }   

/*------------------------------------------------------------------*-
  ---- END OF FILE -------------------------------------------------
-*------------------------------------------------------------------*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91极品美女在线| 国产传媒日韩欧美成人| 欧美性猛交xxxxxx富婆| 亚洲午夜av在线| 日韩视频在线观看一区二区| 极品少妇xxxx精品少妇| 久久久久亚洲蜜桃| 成人黄色大片在线观看| 一区二区三区丝袜| 欧美丰满嫩嫩电影| 韩国一区二区在线观看| 亚洲欧美一区二区视频| 精品视频1区2区3区| 久久成人久久鬼色| 成人免费在线视频观看| 欧美日韩日日骚| 狠狠色狠狠色综合系列| 亚洲码国产岛国毛片在线| 欧美男男青年gay1069videost| 99精品1区2区| 亚洲五码中文字幕| 国产亚洲一区二区在线观看| 91亚洲精华国产精华精华液| 亚洲成人tv网| 国产亚洲精品久| 欧美三级在线视频| 国模一区二区三区白浆| 一区二区在线观看免费| 精品欧美久久久| 91小视频免费看| 精品写真视频在线观看| 伊人色综合久久天天人手人婷| 日韩午夜在线观看| 99热99精品| 美女视频黄 久久| 亚洲免费观看高清在线观看| 日韩免费视频线观看| 91丨九色丨国产丨porny| 免费视频一区二区| 一区二区三区四区中文字幕| www国产精品av| 欧美美女一区二区在线观看| 大尺度一区二区| 奇米一区二区三区| 亚洲日本韩国一区| 久久久国产一区二区三区四区小说| 欧美亚洲国产怡红院影院| 成人精品一区二区三区中文字幕| 日本成人在线网站| 亚洲一区在线观看网站| 国产女人18水真多18精品一级做| 7777精品伊人久久久大香线蕉 | 婷婷丁香激情综合| 国产精品久久久久精k8| 国产亚洲污的网站| 日韩精品一区二区在线| 欧美喷水一区二区| 91美女片黄在线观看91美女| 国产精品一区2区| 日本vs亚洲vs韩国一区三区二区 | 欧美一级在线观看| 欧美中文字幕一二三区视频| 99综合影院在线| 成人精品国产福利| www.爱久久.com| 成人视屏免费看| 丁香婷婷深情五月亚洲| 国产久卡久卡久卡久卡视频精品| 免费看日韩精品| 美女尤物国产一区| 久久精工是国产品牌吗| 奇米色777欧美一区二区| 蜜桃久久久久久| 琪琪一区二区三区| 蜜臀久久99精品久久久久久9| 日韩精品成人一区二区三区| 亚洲国产精品久久久男人的天堂 | 精品一区二区av| 久久精品久久精品| 国产精品一区二区视频| 韩国欧美国产1区| 国产乱对白刺激视频不卡| 久久99这里只有精品| 国产在线播精品第三| 国产一区二区三区四| 国产制服丝袜一区| 国产成人av影院| 91免费看视频| 欧美日韩视频第一区| 日韩一级欧美一级| 久久久青草青青国产亚洲免观| 久久精品在线免费观看| √…a在线天堂一区| 夜夜夜精品看看| 日韩av一区二区在线影视| 国产专区综合网| 91亚洲男人天堂| 欧美区视频在线观看| 精品国免费一区二区三区| 中文字幕乱码久久午夜不卡| 亚洲欧洲另类国产综合| 亚洲成a人片在线不卡一二三区| 日韩激情视频网站| 国产剧情一区二区| 欧美性猛片xxxx免费看久爱| 欧美videossexotv100| 国产精品沙发午睡系列990531| 亚洲免费av网站| 久久精品国产一区二区三 | 91麻豆国产香蕉久久精品| 欧洲国产伦久久久久久久| 日韩一区二区精品葵司在线| 国产精品你懂的| 婷婷久久综合九色国产成人 | 亚洲久草在线视频| 免费观看91视频大全| 国产宾馆实践打屁股91| 欧美日韩国产色站一区二区三区| 久久久久久久久久久久久夜| 亚洲久草在线视频| 国产乱色国产精品免费视频| 欧美在线免费观看视频| 久久蜜桃av一区二区天堂 | 色呦呦国产精品| 亚洲精品一区二区三区四区高清| 亚洲天堂久久久久久久| 国产一区二区影院| 欧美日韩一区精品| 国产欧美精品在线观看| 免费不卡在线观看| 一本到三区不卡视频| 久久久亚洲高清| 亚洲6080在线| 色哟哟在线观看一区二区三区| 久久天堂av综合合色蜜桃网| 午夜久久福利影院| 91麻豆自制传媒国产之光| 久久蜜桃一区二区| 美女性感视频久久| 欧美午夜电影网| 综合av第一页| 国产成人精品免费在线| 精品免费视频.| 免费成人av资源网| 7777精品伊人久久久大香线蕉完整版 | 夜夜精品视频一区二区| 国产精品亚洲午夜一区二区三区 | 97精品国产97久久久久久久久久久久| 欧美一区二区三区喷汁尤物| 亚洲高清在线精品| 91美女蜜桃在线| 亚洲欧洲无码一区二区三区| 国产一区二区网址| 久久综合久久综合九色| 麻豆高清免费国产一区| 欧美猛男男办公室激情| 亚洲国产你懂的| 在线欧美日韩精品| 亚洲一区二区视频在线观看| 91在线观看下载| 日韩码欧中文字| 91香蕉视频污在线| 亚洲免费观看高清完整版在线观看| fc2成人免费人成在线观看播放| 久久精品亚洲精品国产欧美| 国产精品亚洲一区二区三区妖精| 精品国精品自拍自在线| 久久国产三级精品| 亚洲精品在线观看视频| 国产伦精品一区二区三区视频青涩| 欧美成人免费网站| 国产精品中文有码| 久久久久久久综合色一本| 国产精品88888| 国产精品久久久久aaaa樱花| 成人免费av资源| 一区二区三区不卡在线观看 | 在线免费观看不卡av| 亚洲一区二区三区小说| 欧美人妇做爰xxxⅹ性高电影| 青青草视频一区| 亚洲精品一区二区在线观看| 国产成人在线色| 亚洲视频在线一区| 欧美三区免费完整视频在线观看| 午夜成人免费电影| 日韩视频中午一区| 国产成人福利片| 一区二区三区四区激情| 欧美日韩成人综合天天影院 | 久久精品视频一区二区三区| zzijzzij亚洲日本少妇熟睡| 一区二区三区在线观看视频| 欧美视频一区二区三区四区| 蜜桃视频在线观看一区二区| 久久色在线观看| 日本黄色一区二区| 日韩av网站在线观看| 国产精品全国免费观看高清| 欧美亚洲日本一区|