89 lines
2.8 KiB
C
89 lines
2.8 KiB
C
//*****************************************************************************
|
|
// user.c
|
|
// Runs on MSPM0
|
|
// An example user program that initializes the simple operating system
|
|
// Schedule three independent threads using preemptive round robin
|
|
// Each thread rapidly toggles a pin on Port B and increments its counter
|
|
// TIMESLICE is how long each thread runs
|
|
|
|
// Jonathan Valvano
|
|
// June 8, 2025
|
|
|
|
/*
|
|
Copyright 2025 by Jonathan W. Valvano, valvano@mail.utexas.edu
|
|
You may use, edit, run or distribute this file
|
|
as long as the above copyright notice remains
|
|
THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
|
OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
|
VALVANO SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
|
|
OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
|
For more information about my classes, my research, and my books, see
|
|
http://users.ece.utexas.edu/~valvano/
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
#include "osSimple.h"
|
|
#include "../inc/Clock.h"
|
|
#include "../inc/TExaS.h"
|
|
#include <ti/devices/msp/msp.h>
|
|
#include "../inc/LaunchPad.h"
|
|
#define TIMESLICE (TIME_2MS) // thread switch time in system time units
|
|
void OS_DisableInterrupts(void); // Disable interrupts
|
|
void OS_EnableInterrupts(void); // Enable interrupts
|
|
uint32_t Count0; // number of times Task0 loops
|
|
uint32_t Count1; // number of times Task1 loops
|
|
uint32_t Count2; // number of times Task2 loops
|
|
uint32_t Count3; // number of times Task3 loops
|
|
|
|
void Task0(void){
|
|
Count0 = 0;
|
|
for(;;){
|
|
Count0++;
|
|
GPIOA->DOUTTGL31_0 = 0x01; // toggle PA0
|
|
Clock_Delay(1000);
|
|
}
|
|
}
|
|
void Task1(void){
|
|
Count1 = 0;
|
|
for(;;){
|
|
Count1++;
|
|
GPIOA->DOUTTGL31_0 = 0x02; // toggle PA1
|
|
Clock_Delay(1000);
|
|
}
|
|
}
|
|
void Task2(void){
|
|
Count2 = 0;
|
|
for(;;){
|
|
Count2++;
|
|
GPIOA->DOUTTGL31_0 = 0x04; // toggle PA2
|
|
Clock_Delay(1000);
|
|
}
|
|
}
|
|
void Task3(void){
|
|
Count3 = 0;
|
|
for(;;){
|
|
Count3++;
|
|
GPIOA->DOUTTGL31_0 = 0x08; // toggle PA3
|
|
Clock_Delay(1000);
|
|
}
|
|
}
|
|
void PortA_Init(void){
|
|
IOMUX->SECCFG.PINCM[PA0INDEX] = (uint32_t) 0x00000081;
|
|
IOMUX->SECCFG.PINCM[PA1INDEX] = (uint32_t) 0x00000081;
|
|
IOMUX->SECCFG.PINCM[PA2INDEX] = (uint32_t) 0x00000081;
|
|
IOMUX->SECCFG.PINCM[PA3INDEX] = (uint32_t) 0x00000081;
|
|
GPIOA->DOE31_0 |= 0x0F;
|
|
}
|
|
int main(void){
|
|
OS_DisableInterrupts();
|
|
LaunchPad_Init();
|
|
Clock_Init80MHz(0); // set processor clock to 80 MHz
|
|
TExaS_Init(0,0,TExaS_PA60Logic);
|
|
OS_Init(); // initialize OS
|
|
PortA_Init();
|
|
OS_AddThreads(&Task0, &Task1, &Task2, &Task3);
|
|
OS_Launch(TIMESLICE); // doesn't return, interrupts enabled in here
|
|
return 0; // this never executes
|
|
}
|