RTOS_2 Semaphore resource locking test automation added to test suite

pull/234/head
Przemek Wirkus 2014-03-25 14:33:22 +00:00
parent c1c470bf6f
commit 773e0ce493
3 changed files with 105 additions and 23 deletions

View File

@ -1,24 +1,69 @@
#include "mbed.h" #include "mbed.h"
#include "test_env.h"
#include "rtos.h" #include "rtos.h"
Mutex stdio_mutex; #define THREAD_DELAY 50
#define SIGNALS_TO_EMIT 100
void notify(const char* name, int state) { void print_char(char c = '*')
stdio_mutex.lock(); {
printf("%s: %d\n\r", name, state); printf("%c", c);
stdio_mutex.unlock(); fflush(stdout);
}
Mutex stdio_mutex;
DigitalOut led(LED1);
volatile int change_counter = 0;
volatile bool changing_counter = false;
bool manipulate_protected_zone(const int thread_delay) {
bool result = true;
stdio_mutex.lock(); // LOCK
if (changing_counter == true) {
print_char('e'); // if changing_counter is true access is not exclusively
result = false;
notify_completion(false);
exit(1);
}
changing_counter = true;
// Some action on protected
led = !led;
change_counter++;
print_char('.');
Thread::wait(thread_delay);
changing_counter = false;
stdio_mutex.unlock(); // UNLOCK
return result;
} }
void test_thread(void const *args) { void test_thread(void const *args) {
const int thread_delay = int(args);
while (true) { while (true) {
notify((const char*)args, 0); Thread::wait(1000); manipulate_protected_zone(thread_delay);
notify((const char*)args, 1); Thread::wait(1000);
} }
} }
int main() { int main() {
Thread t2(test_thread, (void *)"Th 2"); const int t1_delay = THREAD_DELAY * 1;
Thread t3(test_thread, (void *)"Th 3"); const int t2_delay = THREAD_DELAY * 2;
const int t3_delay = THREAD_DELAY * 3;
test_thread((void *)"Th 1"); Thread t2(test_thread, (void *)t2_delay);
Thread t3(test_thread, (void *)t3_delay);
bool result = true;
while (true) {
// Thread 1 action
Thread::wait(t1_delay);
manipulate_protected_zone(t1_delay);
if (change_counter >= SIGNALS_TO_EMIT) {
break;
}
}
notify_completion(result);
return 0;
} }

View File

@ -1,20 +1,55 @@
#include "mbed.h" #include "mbed.h"
#include "test_env.h"
#include "rtos.h" #include "rtos.h"
Semaphore two_slots(2); #define THREAD_DELAY 100
#define SEMAPHORE_SLOTS 2
#define SEM_CHANGES 100
void test_thread(void const *name) { void print_char(char c = '*')
{
printf("%c", c);
fflush(stdout);
}
Semaphore two_slots(SEMAPHORE_SLOTS);
volatile int change_counter = 0;
volatile int sem_counter = 0;
void test_thread(void const *delay) {
const int thread_delay = int(delay);
while (true) { while (true) {
two_slots.wait(); two_slots.wait();
printf("%s\n\r", (const char*)name); sem_counter++;
Thread::wait(1000); const bool sem_lock_failed = sem_counter > SEMAPHORE_SLOTS;
const char msg = sem_lock_failed ? 'e' : sem_counter + '0';
print_char(msg);
if (sem_lock_failed) {
notify_completion(false);
exit(1);
}
Thread::wait(thread_delay);
print_char('.');
sem_counter--;
change_counter++;
two_slots.release(); two_slots.release();
} }
} }
int main (void) { int main (void) {
Thread t2(test_thread, (void *)"Th 2"); const int t1_delay = THREAD_DELAY * 1;
Thread t3(test_thread, (void *)"Th 3"); const int t2_delay = THREAD_DELAY * 2;
const int t3_delay = THREAD_DELAY * 3;
test_thread((void *)"Th 1"); Thread t1(test_thread, (void *)t1_delay);
Thread t2(test_thread, (void *)t2_delay);
Thread t3(test_thread, (void *)t3_delay);
while (true) {
if (change_counter >= SEM_CHANGES) {
notify_completion(true);
break;
}
}
return 0;
} }

View File

@ -507,15 +507,17 @@ TESTS = [
"host_test": "wait_us_auto" "host_test": "wait_us_auto"
}, },
{ {
"id": "RTOS_2", "description": "Mutex", "id": "RTOS_2", "description": "Mutex resource lock/1",
"source_dir": join(TEST_DIR, "rtos", "mbed", "mutex"), "source_dir": join(TEST_DIR, "rtos", "mbed", "mutex"),
"dependencies": [MBED_LIBRARIES, RTOS_LIBRARIES], "dependencies": [MBED_LIBRARIES, RTOS_LIBRARIES, TEST_MBED_LIB],
"duration": 20 "duration": 20,
"automated": True,
}, },
{ {
"id": "RTOS_3", "description": "Semaphore", "id": "RTOS_3", "description": "Semaphore",
"source_dir": join(TEST_DIR, "rtos", "mbed", "semaphore"), "source_dir": join(TEST_DIR, "rtos", "mbed", "semaphore"),
"dependencies": [MBED_LIBRARIES, RTOS_LIBRARIES], "dependencies": [MBED_LIBRARIES, RTOS_LIBRARIES, TEST_MBED_LIB],
"automated": True,
}, },
{ {
"id": "RTOS_4", "description": "Signals", "id": "RTOS_4", "description": "Signals",