Advertisement
abdullahkahraman

Microchip Forums: RTOS implementation - Inline C

Jun 13th, 2012
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.33 KB | None | 0 0
  1. /*
  2.  * File:   main.c
  3.  * Author: abdullah
  4.  *
  5.  * Created on 10 Haziran 2012 Pazar, 14:43
  6.  */
  7. #include <xc.h> // Include the header file needed by the compiler
  8. __CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & IOSCFS_4MHZ & BOREN_ON);
  9.  
  10. #define numOfTasks 4
  11. unsigned char currentTask; // This TCB pointer will point to the current task's TCB.
  12. unsigned char tasks[4];
  13.  
  14. void fTask1(void); // Prototype the function for task1.
  15. void fTask2(void); // Prototype the function for task2.
  16.  
  17. void main(void)
  18. {
  19.     TRISA = 0; // Set all of the PORTA pins as outputs.
  20.     TRISC = 0; // Set all of the PORTC pins as outputs.
  21.     ANSEL = 0; // Set all of the analog input pins as digital i/o.
  22.     PORTA = 0; // Clear PORTA bits.
  23.     PORTC = 0; // Clear PORTC bits.
  24.  
  25.     currentTask = 0;
  26.     fTask1();
  27.     currentTask++;
  28.     fTask2();
  29.  
  30. #asm
  31.     _taskswitcher
  32.         movlw   0x02                ; W = 2
  33.         addwf   _currentTask, f     ; Add 2 to currentTask, store it in currentTask.
  34.         movlw   numOfTasks          ; W = numOfTasks
  35.         subwf   _currentTask, w     ; w= f - w
  36.         btfsc   status, 0           ; If currentTask >= numOfTasks
  37.         clrf    _currentTask        ; Clear currentTask
  38.  
  39.         movlw   _tasks              ; Store the address of tasks, which is the start address of our task "array".
  40.         addwf   _currentTask, w     ; Add current task's index to the start address.
  41.                                    ; For example; task1's index is 2:  [task0_1][task0_2][task1_1][task1_2]....
  42.                                     ;                                       0        1        2        3
  43.         movwf   fsr                 ; We have the index of current task in W. Copy it to FSR
  44.         movf    indf, w             ; Copy the contents of current task's first item to W
  45.        movwf   pclath              ; Copy W to PCLATH. As a result, current task's PCLATH will be in PCLATH register.
  46.  
  47.         incf    fsr, f              ; Increment index, so that we will point to the next item of current task.
  48.         movf    indf, w             ; Copy the contents of current task's second item to W.
  49.        movwf   pcl                 ; Copy W to PCL. Finally, current task's PCL will be in PCL register.
  50. #endasm
  51. }
  52.  
  53. void fTask1(void)
  54. {
  55. #asm
  56.         movlw   _tasks               ; Store the address of tasks, which is the start address of our task "array".
  57.         addwf   _currentTask, w      ; Add current task's index to the start address.
  58.  
  59.        movwf   fsr                 ; We have the index of current task in W. Copy it to FSR
  60.        movf    pclath, w           ; Copy PCLATH register's contents to W register.
  61.         movwf   indf                ; Copy W to current task's first item. We now store PCLATH.
  62.  
  63.        incf    fsr,f               ; Increment index, so that we will point to the next item of current task.
  64.        movlw   low($+3)            ; Copy PCL+3 to W register. This will let us save the PCL of the start of the task.
  65.        movwf   indf                ; Copy W to task's next item. With that, we will initialize the current task.
  66.         return                      ; We have gathered our initialazation information. Return back to main.
  67. #endasm
  68.  
  69.     while (1)
  70.     {
  71.         PORTA = 0xAA; // Toggle PORTA.0
  72.  
  73. #asm
  74.         movlw   _tasks               ; Store the address of tasks, which is the start address of our task "array".
  75.         addwf   _currentTask, w      ; Add current task's index to the start address.
  76.  
  77.        movwf   fsr                 ; We have the index of current task in W. Copy it to FSR
  78.        movf    pclath, w           ; Copy PCLATH register's contents to W register.
  79.         movwf   indf                ; Copy W to current task's first item. We now store PCLATH of the current state of the task.
  80.  
  81.        incf    fsr, f               ; Increment index, so that we will point to the next item of current task.
  82.        movlw   low($+3)            ; Copy PCL+3 to W register. This will let us save the PCL of the current state of the task.
  83.        movwf   indf                ; Copy W to task's next item. With that, we will initialize the current task.
  84.  
  85.         goto    _taskswitcher        ; Yield the CPU to the awaiting task by going to task switcher.
  86. #endasm
  87.  
  88.         PORTA = 0x55; // Toggle PORTA.0
  89.     }
  90. }
  91.  
  92. void fTask2(void)
  93. {
  94. #asm
  95.         movlw   _tasks               ; Store the address of tasks, which is the start address of our task "array".
  96.         addwf   _currentTask, w      ; Add current task's index to the start address.
  97.  
  98.        movwf   fsr                 ; We have the index of current task in W. Copy it to FSR
  99.        movf    pclath, w           ; Copy PCLATH register's contents to W register.
  100.         movwf   indf                ; Copy W to current task's first item. We now store PCLATH.
  101.  
  102.        incf    fsr,f               ; Increment index, so that we will point to the next item of current task.
  103.        movlw   low($+3)            ; Copy PCL+3 to W register. This will let us save the PCL of the start of the task.
  104.        movwf   indf                ; Copy W to task's next item. With that, we will initialize the current task.
  105.         return                      ; We have gathered our initialazation information. Return back to main.
  106. #endasm
  107.  
  108.     while (1)
  109.     {
  110.         PORTA = 0xAA; // Toggle PORTA.0
  111.  
  112. #asm
  113.         movlw   _tasks               ; Store the address of tasks, which is the start address of our task "array".
  114.         addwf   _currentTask, w      ; Add current task's index to the start address.
  115.  
  116.        movwf   fsr                 ; We have the index of current task in W. Copy it to FSR
  117.        movf    pclath, w           ; Copy PCLATH register's contents to W register.
  118.         movwf   indf                ; Copy W to current task's first item. We now store PCLATH of the current state of the task.
  119.  
  120.        incf    fsr, f               ; Increment index, so that we will point to the next item of current task.
  121.        movlw   low($+3)            ; Copy PCL+3 to W register. This will let us save the PCL of the current state of the task.
  122.        movwf   indf                ; Copy W to task's next item. With that, we will initialize the current task.
  123.  
  124.         goto    _taskswitcher        ; Yield the CPU to the awaiting task by going to task switcher.
  125. #endasm
  126.  
  127.         PORTA = 0x55; // Toggle PORTA.0
  128.     }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement