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

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

?? sci_ti2s.c

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

   SCI_Ti2s.c (v1.00)

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

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

   --- See Chapter 26 ---

   *** SLAVE NODE : TICK-ONLY (DUPLEX) ***
   *** MASTER CHECKS 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_Ti2s.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_TICK2_SLAVE_Enter_Safe_State(void);

static void SCI_TICK2_SLAVE_Watchdog_Init(void);
static void SCI_TICK2_SLAVE_Watchdog_Refresh(void) reentrant;

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

  SCI_TICK2_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_TICK2_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_TICK2_SLAVE_Watchdog_Init();  
   }

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

  SCI_TICK2_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_TICK2_SLAVE_Start(void) 
   {
   // Place system in a safe state
   // - slave will keep returning here if master does not start
   // - or otherwise fails.
   SCI_TICK2_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_TICK2_SLAVE_Watchdog_Refresh();
      }

   // Clear the flag
   IE0 = 0;

   // Start the scheduler
   EA = 1;
   }

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

  SCI_TICK2_SLAVE_Update

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

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

   // Feed the watchdog
   // Master will monitor this pin to check for slave activity 
   SCI_TICK2_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 periodic 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_TICK2_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_TICK2_SLAVE_Watchdog_Init(void)   
   {
   // INIT NOT REQUIRED FOR 1232 EXTERNAL WATCHDOG
   // - May be required wwith different watchdog hardware
   //
   // Edit as required
   }


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

  SCI_TICK2_SLAVE_Watchdog_Refresh()

  Feed the external (1232) watchdog.

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

  HARDWARE: Assumes external 1232 watchdog

-*------------------------------------------------------------------*/
void SCI_TICK2_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_TICK2_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_TICK2_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一区二区三区免费野_久草精品视频
在线观看www91| 国产成人精品aa毛片| 欧美日韩国产另类一区| 怡红院av一区二区三区| 欧美日韩精品系列| 免费在线观看日韩欧美| 久久综合99re88久久爱| 成人av电影免费在线播放| 中文字幕视频一区二区三区久| 91原创在线视频| 视频一区二区三区中文字幕| 精品国精品自拍自在线| 成人网在线免费视频| 一区二区高清在线| 日韩亚洲欧美综合| 成人精品免费看| 亚洲一区二区精品久久av| 精品国产三级a在线观看| av电影一区二区| 亚洲va欧美va天堂v国产综合| 欧美大片一区二区| 91在线无精精品入口| 丝袜美腿高跟呻吟高潮一区| 久久久久久久久免费| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 日本午夜精品一区二区三区电影| 精品捆绑美女sm三区| eeuss鲁一区二区三区| 亚洲一区在线观看视频| 精品成人一区二区三区四区| 色哟哟一区二区在线观看| 美女视频网站久久| 亚洲欧美一区二区三区孕妇| 日韩一区二区免费在线观看| 91免费国产视频网站| 看电视剧不卡顿的网站| 亚洲欧美激情插 | 国产欧美一区二区在线| 色天天综合久久久久综合片| 狠狠色综合播放一区二区| 亚洲一区二区在线免费看| 国产日产精品1区| 91精品欧美久久久久久动漫| 99视频一区二区| 国产揄拍国内精品对白| 五月激情丁香一区二区三区| 国产精品国产自产拍高清av| 精品久久久久久久久久久久包黑料 | 欧美日韩综合在线免费观看| 国产69精品久久777的优势| 日韩国产欧美三级| 亚洲综合免费观看高清在线观看| 亚洲国产精品精华液ab| 日韩欧美一区二区免费| 制服丝袜激情欧洲亚洲| 在线亚洲高清视频| 一本色道a无线码一区v| 成人黄色综合网站| 国产一区二区看久久| 毛片基地黄久久久久久天堂| 亚洲成人免费在线| 亚洲影院免费观看| 亚洲最色的网站| 一区二区三区高清在线| 亚洲婷婷国产精品电影人久久| 国产色婷婷亚洲99精品小说| 欧美成人一区二区三区片免费| 欧美日韩成人一区二区| 欧美日韩三级视频| 欧美日韩你懂得| 在线不卡中文字幕| 日韩欧美一级在线播放| 国产福利精品一区| 国产一区二区中文字幕| 麻豆精品视频在线| 久久精工是国产品牌吗| 美脚の诱脚舐め脚责91 | 99久久免费视频.com| av中文字幕一区| 91婷婷韩国欧美一区二区| 波多野结衣亚洲| 91一区二区三区在线观看| 91免费视频大全| 欧美怡红院视频| 91精品国产色综合久久| 综合久久久久久久| 亚洲人精品一区| 久久国产日韩欧美精品| 国产欧美日韩综合精品一区二区| 欧美综合一区二区三区| 亚洲乱码中文字幕综合| 亚洲人成人一区二区在线观看| 亚洲欧洲美洲综合色网| 一区二区三区在线播| 日韩电影一区二区三区四区| 久久国产三级精品| 粉嫩久久99精品久久久久久夜| 成人国产精品免费观看动漫| 色婷婷久久综合| 欧美人狂配大交3d怪物一区| 欧美xxxxx裸体时装秀| 国产视频在线观看一区二区三区| 国产精品人妖ts系列视频| 亚洲精品中文在线| 亚洲午夜久久久久久久久久久| 亚洲成av人综合在线观看| 久久精品国产久精国产爱| 国产成人av自拍| 在线亚洲一区观看| 久久亚洲精品小早川怜子| 国产精品麻豆网站| 亚洲综合在线观看视频| 麻豆精品一区二区av白丝在线| 成人免费视频一区二区| 亚洲精品在线网站| 亚洲免费资源在线播放| 欧美性大战xxxxx久久久| 亚洲第一在线综合网站| 欧美激情一区二区三区四区| 色噜噜夜夜夜综合网| 欧洲亚洲国产日韩| 色噜噜狠狠成人网p站| 亚洲国产精品精华液ab| 国产一区二区三区国产| 日本精品免费观看高清观看| 欧美日韩一区二区三区四区| 久久日韩粉嫩一区二区三区| 亚洲第一成年网| 久久九九久久九九| 欧美色图12p| 麻豆成人久久精品二区三区小说| 久久婷婷一区二区三区| 国产乱码精品一区二区三区忘忧草 | 久久久久国产成人精品亚洲午夜| 欧美国产精品劲爆| 91年精品国产| 中文字幕亚洲在| 亚洲综合色婷婷| 日本亚洲一区二区| 日本乱人伦一区| 国产日韩欧美精品一区| 日本欧美在线看| 欧美亚洲动漫另类| 中文字幕一区在线观看| 久久不见久久见免费视频1| 欧美伊人久久久久久久久影院| 国产女人18毛片水真多成人如厕| 日韩在线一区二区| 欧洲一区二区三区免费视频| ...xxx性欧美| 成人短视频下载| 国产日韩欧美精品在线| 国产一区二区三区免费看| 欧美一区二区三区男人的天堂| 亚洲地区一二三色| 欧美亚洲国产bt| 亚洲一区在线看| 欧美午夜电影在线播放| 亚洲激情图片一区| 色综合色狠狠综合色| 亚洲欧洲日韩综合一区二区| 国产91精品免费| 久久久99精品久久| 国产精品亚洲专一区二区三区| 精品免费99久久| 国模冰冰炮一区二区| 久久综合国产精品| 国产传媒久久文化传媒| 日本一区二区三区高清不卡| 国产一区二区在线视频| 国产视频911| bt欧美亚洲午夜电影天堂| 国产精品久久久久久久久快鸭 | 国产精品久久久久久一区二区三区| 国产一区二区在线视频| 国产欧美日韩在线| 成人avav影音| 亚洲综合视频在线观看| 91精品国产高清一区二区三区 | 亚洲人成亚洲人成在线观看图片| 99国产精品久| 亚洲资源中文字幕| 666欧美在线视频| 免费在线视频一区| 久久亚洲综合av| 99精品视频在线观看| 夜夜精品视频一区二区 | 中文字幕第一区第二区| 91女神在线视频| 日本欧美肥老太交大片| 亚洲精品一区二区三区99| 国产91丝袜在线观看| 樱桃国产成人精品视频| 欧美一区二区三级| 国产伦精品一区二区三区免费迷 | 中文字幕高清不卡| 在线区一区二视频| 久久精品国产亚洲高清剧情介绍| 日本一区免费视频| 欧美特级限制片免费在线观看|