integrating NXFLAT
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1962 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
f98ca3f781
commit
a1c828c484
@ -39,6 +39,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
|
||||
/****************************************************************************
|
||||
@ -49,23 +50,29 @@ static pthread_mutex_t mut;
|
||||
static volatile int my_mutex = 0;
|
||||
static unsigned long nloops[2] = {0, 0};
|
||||
static unsigned long nerrors[2] = {0, 0};
|
||||
static volatile boolean bendoftest;
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/* NOTE: it is necessary for functions that are referred to by function pointers
|
||||
* pointer to be declared with global scope (at least for ARM). Otherwise,
|
||||
* pointer to be declared with global scope (at least for ARM). Otherwise,
|
||||
* a relocation type that is not supported by NXFLAT is generated by GCC.
|
||||
*/
|
||||
|
||||
void thread_func(void *parameter)
|
||||
{
|
||||
int my_id = (int)parameter;
|
||||
int my_id = (int)parameter;
|
||||
int my_ndx = my_id - 1;
|
||||
volatile int i;
|
||||
|
||||
for (;;)
|
||||
int i;
|
||||
|
||||
/* Loop 20 times. There is a 100 MS delay in the loop so this should
|
||||
* take about 2 seconds. The main thread will stop this thread after
|
||||
* 2 seconds by setting bendoftest in any event.
|
||||
*/
|
||||
|
||||
for (i = 0; i < 20 && !bendoftest; i++);
|
||||
{
|
||||
if ((pthread_mutex_lock(&mut)) != 0)
|
||||
{
|
||||
@ -80,8 +87,8 @@ void thread_func(void *parameter)
|
||||
nerrors[my_ndx]++;
|
||||
}
|
||||
|
||||
my_mutex = 1;
|
||||
for (i = 0; i < 1000; i++);
|
||||
my_mutex = 1;
|
||||
usleep(100000);
|
||||
my_mutex = 0;
|
||||
|
||||
if ((pthread_mutex_unlock(&mut)) != 0)
|
||||
@ -99,9 +106,8 @@ void thread_func(void *parameter)
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
pthread_t thread1, thread2;
|
||||
|
||||
printf("Starting threads\n");
|
||||
pthread_t thread1;
|
||||
pthread_t thread2;
|
||||
|
||||
/* Initialize the mutex */
|
||||
|
||||
@ -109,20 +115,34 @@ int main(int argc, char **argv)
|
||||
|
||||
/* Start two thread instances */
|
||||
|
||||
if ((pthread_create(&thread1, NULL, (void*)&thread_func, (void*)1)) != 0)
|
||||
printf("Starting thread 1\n");
|
||||
bendoftest = FALSE;
|
||||
if ((pthread_create(&thread1, NULL, (void*)thread_func, (void*)1)) != 0)
|
||||
{
|
||||
fprintf(stderr, "Error in thread#1 creation\n");
|
||||
}
|
||||
|
||||
if ((pthread_create(&thread2, NULL, (void*)&thread_func, (void*)2)) != 0)
|
||||
printf("Starting thread 2\n");
|
||||
if ((pthread_create(&thread2, NULL, (void*)thread_func, (void*)2)) != 0)
|
||||
{
|
||||
fprintf(stderr, "Error in thread#2 creation\n");
|
||||
}
|
||||
|
||||
printf("Press control-C to terminate the example\n");
|
||||
/* Wait a bit for the threads to do their thing. */
|
||||
|
||||
sleep(2);
|
||||
|
||||
/* Then ask them politely to stop running */
|
||||
|
||||
printf("Stopping threads\n");
|
||||
bendoftest = TRUE;
|
||||
pthread_join(thread1, NULL);
|
||||
pthread_join(thread2, NULL);
|
||||
|
||||
printf("\tThread1\tThread2\n");
|
||||
printf("Loops\t%ld\t%ld\n", nloops[0], nloops[1]);
|
||||
printf("Errors\t%ld\t%ld\n", nerrors[0], nerrors[1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -76,7 +76,7 @@ enum exit_values_e
|
||||
****************************************************************************/
|
||||
|
||||
/* NOTE: it is necessary for functions that are referred to by function pointers
|
||||
* pointer to be declared with global scope (at least for ARM). Otherwise,
|
||||
* pointer to be declared with global scope (at least for ARM). Otherwise,
|
||||
* a relocation type that is not supported by NXFLAT is generated by GCC.
|
||||
*/
|
||||
|
||||
|
@ -54,12 +54,16 @@ static char child_name[] = "child";
|
||||
static char child_arg[] = "Hello from your parent!";
|
||||
static sem_t g_sem;
|
||||
|
||||
#if CONFIG_TASK_NAME_SIZE == 0
|
||||
static char no_name[] = "<noname>";
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Privite Functions
|
||||
****************************************************************************/
|
||||
|
||||
/* NOTE: it is necessary for functions that are referred to by function pointers
|
||||
* pointer to be declared with global scope (at least for ARM). Otherwise,
|
||||
* pointer to be declared with global scope (at least for ARM). Otherwise,
|
||||
* a relocation type that is not supported by NXFLAT is generated by GCC.
|
||||
*/
|
||||
|
||||
@ -74,15 +78,23 @@ static sem_t g_sem;
|
||||
printf("Child: Exit-ting with status=2\n");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
printf("Child: argv[0]=\"%s\"\n", argv[0]);
|
||||
|
||||
if (strcmp(argv[0], child_name) != 0)
|
||||
#if CONFIG_TASK_NAME_SIZE == 0
|
||||
if (strcmp(argv[0], no_name) != 0)
|
||||
{
|
||||
printf("Child: expected argv[0] to be \"%s\"\n", no_name);
|
||||
printf("Child: Exit-ting with status=3\n");
|
||||
exit(3);
|
||||
}
|
||||
#else
|
||||
if (strncmp(argv[0], child_name, CONFIG_TASK_NAME_SIZE) != 0)
|
||||
{
|
||||
printf("Child: expected argv[0] to be \"%s\"\n", child_name);
|
||||
printf("Child: Exit-ting with status=3\n");
|
||||
exit(3);
|
||||
}
|
||||
#endif
|
||||
|
||||
printf("Child: argv[1]=\"%s\"\n", argv[1]);
|
||||
|
||||
@ -106,7 +118,7 @@ int main(int argc, char **argv)
|
||||
{
|
||||
pid_t parent_pid = getpid();
|
||||
char *child_argv[2];
|
||||
int ret;
|
||||
pid_t child_pid;
|
||||
|
||||
printf("Parent: Started, pid=%d\n", parent_pid);
|
||||
|
||||
@ -116,15 +128,15 @@ int main(int argc, char **argv)
|
||||
|
||||
child_argv[0] = child_arg;
|
||||
child_argv[1] = 0;
|
||||
ret = task_create(child_name, 50, 512, child_task, (const char**)child_argv);
|
||||
if (ret != 0)
|
||||
child_pid = task_create(child_name, 50, 512, child_task, (const char**)child_argv);
|
||||
if (child_pid < 0)
|
||||
{
|
||||
printf("Parent: task_create failed: %d\n", errno);
|
||||
}
|
||||
|
||||
printf("Parent: Waiting for child\n");
|
||||
printf("Parent: Waiting for child (pid=%d)\n", child_pid);
|
||||
sem_wait(&g_sem);
|
||||
printf("Parent: Exiting\n");
|
||||
printf("Parent: Exit-ing\n");
|
||||
sem_destroy(&g_sem);
|
||||
return 0;
|
||||
}
|
||||
|
@ -47,8 +47,8 @@
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define NXFLAT_MAX_STRING_SIZE 64 /* Largest size of string (w/zterminator) */
|
||||
#define NXFLAT_MAGIC "NxFT" /* NXFLAT magic number */
|
||||
#define NXFLAT_MAX_STRING_SIZE 64 /* Largest size of string (w/zterminator) */
|
||||
#define NXFLAT_MAGIC "NxFT" /* NXFLAT magic number */
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
@ -69,7 +69,7 @@ struct nxflat_hdr_s
|
||||
* this magic number.
|
||||
*/
|
||||
|
||||
char h_magic[4];
|
||||
char h_magic[4];
|
||||
|
||||
/* The following fields provide the memory map for the nxflat binary.
|
||||
*
|
||||
@ -116,7 +116,7 @@ struct nxflat_hdr_s
|
||||
/* Imported symbol table (NOTE no symbols are exported):
|
||||
*
|
||||
* h_importsymbols - Offset to the beginning of an array of imported
|
||||
* symbol structures (struct nxflat_import). The
|
||||
* symbol structures (struct nxflat_import_s). The
|
||||
* h_importsymbols offset is relative to the
|
||||
* beginning of the file. Each entry of the
|
||||
* array contains an uint32 offset (again from
|
||||
@ -149,7 +149,7 @@ struct nxflat_reloc_s
|
||||
|
||||
/* Pack the type and the offset into one 32-bit value */
|
||||
|
||||
#define NXFLAT_RELOC(t,o) (((u_int32_t)((t) & 3) << 30) | ((o) & 0x1fffffff))
|
||||
#define NXFLAT_RELOC(t,o) (((u_int32_t)((t) & 3) << 30) | ((o) & 0x3fffffff))
|
||||
|
||||
/* The top three bits of the relocation info is the relocation type (see the
|
||||
* NXFLAT_RELOC_TYPE_* definitions below. This is an unsigned value.
|
||||
|
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* task_start.c
|
||||
*
|
||||
* Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
Loading…
Reference in New Issue
Block a user