CM3: define specific architecture attributes.
authorarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 31 Mar 2010 14:41:52 +0000 (14:41 +0000)
committerarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 31 Mar 2010 14:41:52 +0000 (14:41 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3353 38d2e660-2303-0410-9eaa-f027e97ec537

bertos/cpu/attr.h
bertos/cpu/frame.h

index 5e24fa3c9d3ee7b57ae6d19ad36212f2798789a5..8fdcb1c8fd2508554809df29b38fbf2158c7fc79 100644 (file)
 #elif CPU_CM3
 
        #define CPU_REG_BITS           32
-       #define CPU_REGS_CNT           fixme
+       #define CPU_REGS_CNT           16
        #define CPU_HARVARD            0
 
        /// Valid pointers should be >= than this value (used for debug)
        #elif defined(__ARMEL__)
                #define CPU_BYTE_ORDER CPU_LITTLE_ENDIAN
        #else
-               #error Unable to detect Cortex-M3 endianness!
+               #error Unable to detect Cortex-M3 endianess!
        #endif
 
-       #define NOP         fixme
+       #define NOP         asm volatile ("nop")
        #define BREAKPOINT  /* asm("bkpt 0") DOES NOT WORK */
 
+       /*
+        * Builtin GCC memset() can be buggy! We need to redefine it here for
+        * this architecture. :(
+        */
+       #include <cfg/compiler.h>
+       #define memset  __cm3_memset
+       INLINE void *__cm3_memset(void *s, int c, size_t n)
+       {
+               uint8_t *p = (uint8_t *)s;
+
+               while (n--)
+                       *p++ = c;
+               return s;
+       }
+
 #elif CPU_PPC
 
        #define CPU_REG_BITS           (CPU_PPC32 ? 32 : 64)
index 9fd55b0b4b006eb94f3cc503c10017fe7a7ff991..e8d0f898973458fe214c4ad1e5272b86ccda1ad1 100644 (file)
@@ -69,7 +69,7 @@
 
 #elif CPU_CM3
 
-       #define CPU_SAVED_REGS_CNT     fixme
+       #define CPU_SAVED_REGS_CNT     8
        #define CPU_STACK_GROWS_UPWARD 0
        #define CPU_SP_ON_EMPTY_SLOT   0
 
                        CPU_PUSH_WORD((sp), 0x100); \
                } while (0);
 
+#elif CPU_CM3
+
+
+       #define CPU_PUSH_CALL_FRAME(sp, func) \
+               do { \
+                       CPU_PUSH_WORD((sp), 0x01000000);          /* xPSR  */   \
+                       CPU_PUSH_WORD((sp), (cpu_stack_t)(func)); /* lr  */     \
+               } while (0);
+
 #elif CPU_AVR
        /*
         * On AVR, addresses are pushed into the stack as little-endian, while