/* main.c - Hello World demo */ /* * Copyright (c) 2012-2014 Wind River Systems, Inc. * * SPDX-License-Identifier: Apache-2.0 */ #include #include /* size of stack area used by each thread */ #define STACKSIZE 512 /* scheduling priority used by each thread */ #define PRIORITY 7 /* delay between greetings (in ms) */ #define SLEEPTIME 500 /* delay between greetings (in ms) */ #define SCHEDTIME 30 /* Focaccia tastes better than DEEDBEEF ;-) */ #define STACK_GUARD_CANARY 0xF0CACC1A struct stack_guard_buffer { /* Make sure canary is not optimized by the compiler */ struct k_thread thread; volatile u32_t canary; K_THREAD_STACK_MEMBER(stack, STACKSIZE); }; #define LAST_THREAD_NUM 6 struct stack_guard_buffer buf[LAST_THREAD_NUM+1]; u32_t recursive_loop(u32_t counter, int num, void *dummy) { if (buf[num].canary != STACK_GUARD_CANARY) { printk("Canary = 0x%08x\tTest not passed.\n", buf[num].canary); while (1) { k_sleep(SLEEPTIME); } } counter++; if (dummy == 0) return counter; return recursive_loop(counter, num, dummy) +recursive_loop(counter, num, dummy); } /* stack_guard_thread is a dynamic thread */ void stack_guard_thread(void *dummy1, void *dummy2, void *dummy3) { ARG_UNUSED(dummy1); recursive_loop(0, (int)dummy1, dummy2); } void main(void) { int i; bool failed; printk("STACK_ALIGN 0x%x\n", STACK_ALIGN); for (i = 0; i <= LAST_THREAD_NUM; i++) { buf[i].canary = STACK_GUARD_CANARY; failed = (i == LAST_THREAD_NUM) ? true : false; if (failed) { printk("MPU STACK GUARD Test\n"); printk("Canary Initial Value = 0x%x threads %p\n", buf[i].canary, &buf[i].thread); } /* create stack_guard_thread */ k_thread_create(&buf[i].thread, buf[i].stack, K_THREAD_STACK_SIZEOF(buf[i].stack), stack_guard_thread, (void *)i, (void *)failed, NULL, PRIORITY, 0, K_NO_WAIT); } }