Ye Cheng
/
cmsis_rtos_demo_mutex
cmsis rtos demo: mutex
Diff: main.cpp
- Revision:
- 0:fba50ae123e6
- Child:
- 1:1308d7d6d53e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jan 06 14:20:05 2013 +0000 @@ -0,0 +1,101 @@ +#include "mbed.h" +#include "cmsis_os.h" + +Serial debug(USBTX, USBRX); + +typedef struct +{ + double *a; + double *b; + double sum; + int veclen; +} DOTDATA; + +#define NUMTHRDS 4 +#define VECLEN 200 +DOTDATA dotstr; +osMutexId stdio_mutex; +osMutexDef(stdio_mutex); + + + +void dotprod(void const *arg) +{ + osThreadId id; + int i, start, end, len ; + long offset; + double mysum, *x, *y; + offset = (long)arg; + + len = dotstr.veclen; + start = offset*len; + end = start + len; + x = dotstr.a; + y = dotstr.b; + + mysum = 0; + for (i=start; i<end ; i++) + { + mysum += (x[i] * y[i]); + } + + osMutexWait(stdio_mutex, osWaitForever); + dotstr.sum += mysum; + printf("Thread %ld did %d to %d: mysum=%f global sum=%f\n",offset,start,end,mysum,dotstr.sum); + osMutexRelease(stdio_mutex); + + id = osThreadGetId(); + osThreadTerminate(id); +} + + +void t0(void const *argument) {dotprod(argument);} +osThreadDef(t0, osPriorityNormal, DEFAULT_STACK_SIZE); + +void t1(void const *argument) {dotprod(argument);} +osThreadDef(t1, osPriorityNormal, DEFAULT_STACK_SIZE); + +void t2(void const *argument) {dotprod(argument);} +osThreadDef(t2, osPriorityNormal, DEFAULT_STACK_SIZE); + +void t3(void const *argument) {dotprod(argument);} +osThreadDef(t3, osPriorityNormal, DEFAULT_STACK_SIZE); + +int main() { + debug.baud(57600); + + long i; + double *a, *b; + //void *status; + + /* Assign storage and initialize values */ + + a = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double)); + b = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double)); + + for (i=0; i<VECLEN*NUMTHRDS; i++) { + a[i]=1; + b[i]=a[i]; + } + + dotstr.veclen = VECLEN; + dotstr.a = a; + dotstr.b = b; + dotstr.sum=0; + + stdio_mutex = osMutexCreate(osMutex(stdio_mutex)); + + for(i=0;i<NUMTHRDS;i++) + { + if(i==0) osThreadCreate(osThread(t0), (void *)i); + if(i==1) osThreadCreate(osThread(t1), (void *)i); + if(i==2) osThreadCreate(osThread(t2), (void *)i); + if(i==3) osThreadCreate(osThread(t3), (void *)i); + } + + printf ("Sum = %f \n", dotstr.sum); + free (a); + free (b); +} + +