36 #include "priv/alt_irq_table.h"
116 FILE*
fpuart[G_NUMBER_OF_PCB];
136 void gk_ENTRY_RST_HANDLER (
void)
141 NIOS2_WRITE_STATUS(0);
143 NIOS2_WRITE_IENABLE (0);
145 SAMPLE_FUNCTION_BEGIN(1000);
147 GRTOS_USER_CRITICAL_SECTION_GET;
150 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
151 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
160 g_kcb.G_PCBTbl[GRTOS_CMD_PRC_ID -1].PCBState = GS_PCBState_RUNNING;
161 g_kcb.G_PCBTbl[GRTOS_CMD_PRC_ID -1].PCBID = GRTOS_CMD_PRC_ID ;
162 g_kcb.G_PCBTbl[GRTOS_CMD_PRC_ID -1].PCB_EXECTCB =
g_kcb.G_PCBTbl[GRTOS_CMD_PRC_ID -1].PCB_IDLETCB;
165 SAMPLE_FUNCTION_END(1000);
168 printf(
"******************************************** \n");
169 printf(
"ERROR Processor %d Init GRTOS \n", GRTOS_CMD_PRC_ID );
170 printf(
"******************************************** \n");
188 unsigned int event_code;
192 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
193 if ((alt_irq_pending() != 1) && (alt_irq_pending() != 0)) G_DEBUG_WHILEFOREVER;
194 if (
G_Running == G_FALSE) G_DEBUG_WHILEFOREVER;
199 GRTOS_CMD_PRC_INT_DSB;
200 GRTOS_CMD_INT_PRC_PND_CLR;
202 SAMPLE_FUNCTION_BEGIN(1001);
205 GRTOS_CMD_CRITICAL_SECTION_GET;
207 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
209 NIOS2_READ_SP(StackPointer);
210 if (((
int) StackPointer > (
int)
g_kcb.G_PCBTbl[GRTOS_CMD_PRC_ID -1].PCB_IDLETCB->TCB_StackBottom) || ((
int) StackPointer < (
int)
g_kcb.G_PCBTbl[GRTOS_CMD_PRC_ID -1].PCB_IDLETCB->TCB_StackTop - 300)) fprintf(stderr,
"[ FAIL ] Processor %d error in SP for IDLE in %s, %d\n", GRTOS_CMD_PRC_ID, __FUNCTION__,__LINE__);;
213 event_code = GRTOS_CMD_EVN_OCC;
216 switch (event_code) {
218 pevent =
g_kcb.KCB_NextECBTL;
221 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
222 ptcb = pevent->ECB_AssocTCB;
223 if ((
ECB_IsValid(pevent) != G_TRUE) || (pevent == (
struct gs_ecb *) 0)) G_DEBUG_WHILEFOREVER;
224 if ((
TCB_IsValid(ptcb) != G_TRUE) || (ptcb == (
struct gs_tcb *) 0)) G_DEBUG_WHILEFOREVER;
225 if (
g_kcb.KCB_NextECBTL == (
struct gs_ecb *) 0) G_DEBUG_WHILEFOREVER;
233 case EVN_CODE_FROZEN:
234 GRTOS_CMD_FRZ_EVN_CLR;
245 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
246 if (
g_kcb.KCB_ExtISR[event_code].G_TCB_ISR == (
struct gs_tcb *) 0) G_DEBUG_WHILEFOREVER;
247 if (!GRTOS_TASK_STATE_WAITING(
g_kcb.KCB_ExtISR[event_code].G_TCB_ISR)) G_DEBUG_WHILEFOREVER;
262 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
263 if (
TCB_IsValid(ptcbto) != G_TRUE) G_DEBUG_WHILEFOREVER;
264 if (
TCB_IsValid(ptcbfrom) != G_TRUE && ptcbfrom != (
struct gs_tcb *) 0) G_DEBUG_WHILEFOREVER;
265 if (ptcbto->TCBState != G_TCBState_READY && ptcbto->TCBState != G_TCBState_RUNNING) G_DEBUG_WHILEFOREVER;
268 if (ptcbfrom != ptcbto) {
269 if (ptcbfrom->TCBState == G_TCBState_RUNNING){
282 SAMPLE_FUNCTION_END(1001);
296 fprintf(
fpuart[GRTOS_CMD_PRC_ID-1],
"In %s, %d \n", __FUNCTION__, __LINE__);
311 GRTOS_CMD_CRITICAL_SECTION_GET;
356 SAMPLE_FUNCTION_BEGIN(1002);
358 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
359 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
362 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
363 if (
TCB_IsValid(ptcbtostart) != G_TRUE) G_DEBUG_WHILEFOREVER;
364 if (ptcbtostart->TCBState != G_TCBState_READY) G_DEBUG_WHILEFOREVER;
371 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
372 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
379 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
380 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
384 NIOS2_WRITE_IENABLE (1);
386 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
387 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
390 GRTOS_CMD_RLS_NXT_PRC;
392 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
393 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
397 SAMPLE_FUNCTION_END(1002);
401 printf(
"Error in GRTOS_STart. Processor %d", GRTOS_CMD_PRC_ID );
402 G_DEBUG_WHILEFOREVER;
413 SAMPLE_FUNCTION_BEGIN(1003);
415 GRTOS_USER_CRITICAL_SECTION_GET;
419 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
420 if (
TCB_IsValid(ptcbtostart) != G_TRUE) {PRINT_TO_DEBUG(
"ERROR TCB= %p\n",ptcbtostart); G_DEBUG_WHILEFOREVER;}
422 NIOS2_READ_SP(StackPointer);
423 if ((
int) StackPointer > (
int) ptcbtostart->TCB_StackBottom) G_DEBUG_WHILEFOREVER;
424 if ((
int) StackPointer < (
int) ptcbtostart->TCB_StackTop - 300) G_DEBUG_WHILEFOREVER;
425 if (ptcbtostart->TCBState != G_TCBState_RUNNING) G_DEBUG_WHILEFOREVER; PRINT_DEBUG_LINE
433 if (ptcbtostart->TCBType == G_TCBType_ISR) {
440 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
441 if ((
TCB_IsValid(ptcbtostart) != G_TRUE) || (ptcbtostart == (
struct gs_tcb *) 0)) G_DEBUG_WHILEFOREVER;
442 if (ptcbtostart->TCBState != G_TCBState_READY) G_DEBUG_WHILEFOREVER;
453 SAMPLE_FUNCTION_END(1003);
457 printf(
"Error in gk_KERNEL_TASK_COMPLETE. Processor %d", GRTOS_CMD_PRC_ID );
458 G_DEBUG_WHILEFOREVER;
472 SAMPLE_FUNCTION_BEGIN(1004);
474 if (ptcb->TCBState != G_TCBState_READY && ptcb->TCBState != G_TCBState_RUNNING)
480 if (ptcb->TCBState == G_TCBState_RUNNING){
484 GRTOS_CMD_PRC_INT(ptcb->TCB_AssocPCB);
492 SAMPLE_FUNCTION_END(1004);
507 SAMPLE_FUNCTION_BEGIN(1005);
509 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
510 if (
TCB_IsValid(ptcbfrom) != G_TRUE || ptcbfrom == (
GS_TCB *) 0) G_DEBUG_WHILEFOREVER;
511 if (ptcbfrom->TCBState != G_TCBState_RUNNING) G_DEBUG_WHILEFOREVER;
520 SAMPLE_FUNCTION_END(1005);
557 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
558 if (GRTOS_CMD_PRC_ID != (
int) 1)
while(1);
569 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
570 fprintf(stderr,
"[ MESSAGE ] INITIALIZE THE KCB STRUCTURE\n");
573 GRTOS_CMD_SET_TIME_PRESCALE((
int) GRTOS_DRIVER_PRESCALE);
581 g_kcb.KCB_NUMBER_OF_TCBs = 0;
582 g_kcb.KCB_NUMBER_OF_PCBs = 0;
583 g_kcb.KCB_NUMBER_OF_ECBs = 0;
584 g_kcb.KCB_NUMBER_OF_RCBs = 0;
585 g_kcb.KCB_NUMBER_OF_LCBs = 0;
586 g_kcb.KCB_NUMBER_OF_SCBs = 0;
587 g_kcb.KCB_NUMBER_OF_RRDSs = 0;
591 g_kcb.KCB_ROOT_RCBs = (
struct g_rcb *) 0;
598 void *mem1 = malloc(
sizeof(
INT32) * ALT_NIRQ * G_ISR_STACKSIZE + 31);
599 g_kcb.G_ISR_STACK = (
INT32 *) (((uintptr_t)mem1+15) & ~ (uintptr_t)0x0F);
602 void *mem2 = malloc(
sizeof(
GS_STK) * G_NUMBER_OF_PCB * G_IDLE_STACKSIZE + 31);
603 g_kcb.G_IDLE_STACK = (
GS_STK *) (((uintptr_t)mem2+15) & ~ (uintptr_t)0x0F);
609 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
610 fprintf(stderr,
"[ MESSAGE ] CREATING PCB STRUCTURES\n");
638 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
639 fprintf(stderr,
"[ MESSAGE ] INITIALIZE THE LCB LIST\n");
642 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
643 fprintf(stderr,
"[ MESSAGE ] INITIALIZE THE TIMED EVENT LIST\n");
647 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
650 GRTOS_CMD_NXT_OCC_TM_EVN_SET(G_LATEST_TIME);
653 g_kcb.KCB_NextECBTL->ECBValue.i64 = (
INT64) G_LATEST_TIME;
654 g_kcb.KCB_NextECBTL->ECB_AssocTCB = (
struct gs_tcb *) 0;
655 g_kcb.KCB_NextECBTL->ECB_PrevTCBAEL = (
struct gs_ecb *) 0;
656 g_kcb.KCB_NextECBTL->ECB_NextTCBAEL = (
struct gs_ecb *) 0;
657 g_kcb.KCB_NextECBTL->ECB_PrevECB = (
struct gs_ecb *) 0;
658 g_kcb.KCB_NextECBTL->ECB_NextECB = (
struct gs_ecb *) 0;
659 g_kcb.KCB_NextECBTL->ECB_NextECBASL = (
struct gs_scb *) 0;
660 g_kcb.KCB_NextECBTL->ECBType = (
INT32) G_ECBType_LASTEST_TIME;
661 g_kcb.KCB_NextECBTL->ECBState = GS_ECBState_WAITING_TIME;
664 for (i = 0; i < G_NUMBER_OF_PCB; i++) {
667 g_kcb.G_PCBTbl[i].GRTOS_PROCESSOR_BASE = (
int *) GRTOS_DRIVER_GRTOS_PROCESSOR_BASE[i];
670 if (
g_kcb.G_PCBTbl[i].PCB_IDLETCB == (
struct gs_tcb *) 0) G_DEBUG_WHILEFOREVER;
672 g_kcb.G_PCBTbl[i].PCB_IDLETCB->TCBType = G_TCBType_IDLE;
674 g_kcb.G_PCBTbl[i].PCB_IDLETCB->TCB_StackBottom = (
GS_STK *) ((((
INT32)
g_kcb.G_IDLE_STACK + (i * G_IDLE_STACKSIZE) + G_IDLE_STACKSIZE-8)-8)& ~0x3);
676 g_kcb.G_PCBTbl[i].PCB_IDLETCB->TCB_StackTop = (
GS_STK *)((
INT32)
g_kcb.G_PCBTbl[i].PCB_IDLETCB->TCB_StackBottom - ((
INT32)(G_IDLE_STACKSIZE)& ~0x3));
678 g_kcb.G_PCBTbl[i].PCB_IDLETCB->TCB_TaskArg = (
void *) NULL;
679 g_kcb.G_PCBTbl[i].PCB_IDLETCB->TCBReadyPriority = G_IDLETASK_PRIORITY;
680 g_kcb.G_PCBTbl[i].PCB_IDLETCB->TCBRunPriority = G_IDLETASK_PRIORITY;
686 g_kcb.G_PCBTbl[i].PCBState = GS_PCBState_NOTRUNNING;
688 g_kcb.G_PCBTbl[i].PCB_IDLETCB->TCB_AssocPCB = i + 1;
689 g_kcb.G_PCBTbl[i].PCB_EXECTCB =
g_kcb.G_PCBTbl[i].PCB_IDLETCB;
690 for (j = 0; j < G_NUMBER_OF_LCBs_FOR_PCB; j++) {
693 g_kcb.G_PCBTbl[i].PCBID = (int) 0;
694 g_kcb.G_PCBTbl[i].PCBType = (int) GS_PCBType_UNSPECIFIED;
695 g_kcb.G_PCBTbl[i].PCB_NextPCB = (
struct gs_pcb *) 0;
696 g_kcb.G_PCBTbl[i].PCB_PrevPCB = (
struct gs_pcb *) 0;
699 for (i=0 ; i<ALT_NIRQ ; i++)
701 g_kcb.KCB_ExtISR[i].G_TCB_ISR = (
struct gs_tcb *) 0;
702 g_kcb.KCB_ExtISR[i].G_EXT_INT_Count = (int) 0;
703 GRTOS_CMD_IRQ_ENB_CLR(i);
706 fprintf(stderr,
"[ OK ] Finishing gk_INIT_KERNEL \n");
720 static void gk_START_KERNEL (
void) __attribute__ ((destructor));
721 void gk_START_KERNEL (
void)
726 SAMPLE_FUNCTION_BEGIN(1006);
728 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
729 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
732 GRTOS_USER_CRITICAL_SECTION_GET;
733 GRTOS_USER_CRITICAL_SECTION_SET_RELEASE_TIME(200);
735 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
736 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
739 for (i=0; i<G_NUMBER_OF_PCB ; i++) {
741 sprintf(filename,
"/dev/%s_jtag_uart_%d", GRTOS_DRIVER_SYSTEM_NAME, i+2);
742 fpuart[i] = fopen (filename,
"r+");
745 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
746 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
750 NIOS2_WRITE_STATUS(0);
755 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
756 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
760 for (i=0; i<32 ; i++) {
761 alt_ic_irq_disable(0,i);
768 alt_ic_isr_register((alt_u32) GRTOS_DRIVER_GRTOS_S_PROCESSOR1_IRQ_INTERRUPT_CONTROLLER_ID,
769 (alt_u32) GRTOS_DRIVER_GRTOS_S_PROCESSOR1_IRQ,
777 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
778 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
781 NIOS2_WRITE_IENABLE (0);
782 NIOS2_WRITE_STATUS(0);
785 #if G_GRTOS_PRESERVE_HAL_ISR == 1
789 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
790 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
793 g_kcb.G_PCBTbl[GRTOS_CMD_PRC_ID -1].PCBState = GS_PCBState_RUNNING;
794 g_kcb.G_PCBTbl[GRTOS_CMD_PRC_ID -1].PCBID = GRTOS_CMD_PRC_ID ; PRINT_DEBUG_LINE
795 g_kcb.G_PCBTbl[GRTOS_CMD_PRC_ID -1].PCB_EXECTCB =
g_kcb.G_PCBTbl[GRTOS_CMD_PRC_ID -1].PCB_IDLETCB;
798 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
799 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
804 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
805 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
808 #if G_DEBUG_WHILEFOREVER_ENABLE == 1
809 fprintf(stderr,
"[ MESSAGE ] Executing %s, %d, Proc: %d\n",__FUNCTION__,__LINE__,GRTOS_CMD_PRC_ID);
812 SAMPLE_FUNCTION_END(1006);
816 printf(
"******************************************** \n");
817 printf(
"ERROR Processor %d Init GRTOS \n", GRTOS_CMD_PRC_ID );
818 printf(
"******************************************** \n");
837 SAMPLE_FUNCTION_BEGIN(68)
839 GS_SCB *psignal = ptcb->TCB_NextTCBPSL;
843 if (psignal != (
struct gs_scb *) 0)
845 if (psignal->SCBState == G_SCBState_PENDING) {
846 psignal->SCBState = G_SCBState_EXECUTING;
854 alt_dcache_flush_all();
855 SAMPLE_FUNCTION_END(68)
884 #if G_DEBUG_PRINT_WHEN_PROCESSOR_GOES_IDLE == 1
885 fprintf(
fpuart[GRTOS_CMD_PRC_ID-1],
"I\n");
887 GRTOS_CMD_HALT_PROCESSOR;