Files
Gen4_R-Car_Trace32/2_Trunk/demo/arm/kernel/ecos/twothreads.c
2025-10-14 09:52:32 +09:00

63 lines
1.7 KiB
C

#include <cyg/kernel/kapi.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
/* now declare (and allocate space for) some kernel objects,
like the two threads we will use */
cyg_thread thread_s[2]; /* space for two thread objects */
char stack[2][4096]; /* space for two 4K stacks */
/* now the handles for the threads */
cyg_handle_t simple_threadA, simple_threadB;
/* and now variables for the procedure which is the thread */
cyg_thread_entry_t simple_program;
/* and now a mutex to protect calls to the C library */
cyg_mutex_t cliblock;
/* and now mutexes to for thread locking*/
cyg_mutex_t twothrlock[2];
/* we install our own startup routine which sets up threads */
void cyg_user_start(void)
{
printf("Entering twothreads' cyg_user_start() function\n");
cyg_mutex_init(&cliblock);
cyg_mutex_init(&twothrlock[0]);
cyg_mutex_init(&twothrlock[1]);
cyg_thread_create(4, simple_program, (cyg_addrword_t) 0,
"Thread A", (void *) stack[0], 4096,
&simple_threadA, &thread_s[0]);
cyg_thread_create(4, simple_program, (cyg_addrword_t) 1,
"Thread B", (void *) stack[1], 4096,
&simple_threadB, &thread_s[1]);
cyg_thread_resume(simple_threadA);
cyg_thread_resume(simple_threadB);
}
/* this is a simple program which runs in a thread */
void simple_program(cyg_addrword_t data)
{
int message = (int) data;
int count = 1;
printf("Beginning execution; thread data is %d\n", message);
for (;;) {
cyg_mutex_lock(&twothrlock[message]);
/* note: printf() must be protected by a call to cyg_mutex_lock() */
cyg_mutex_lock(&cliblock);
printf("Thread %d: looped %d times.\n", message, count);
cyg_mutex_unlock(&cliblock);
cyg_mutex_unlock(&twothrlock[message?0:1]);
count++;
}
}