]> wirehaze git hosting - stm32f411ceu6.git/commitdiff

wirehaze git hosting

faultmask, kentry ()
authorphfr24 <phfr24@inf.ufpr.br>
Sun, 12 Jul 2026 04:18:30 +0000 (01:18 -0300)
committerphfr24 <phfr24@inf.ufpr.br>
Sun, 12 Jul 2026 04:18:30 +0000 (01:18 -0300)
Makefile
kentry.c [new file with mode: 0644]
kernel.c

index b864e5a312d25e8788f64c8aa0b8eee9658e84c2..f0ec81fe237821b2eb3c8a6c2b4d8edea4f0e4dd 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -46,7 +46,7 @@ OCFLAGS := --output-target=binary
 
 #  ---------------------------------------------------------------------------  #
 
-objs := kernel.o
+objs := kernel.o kentry.o
 lds := kernel.ld
 LDFLAGS += -T $(lds)
 
diff --git a/kentry.c b/kentry.c
new file mode 100644 (file)
index 0000000..33b8295
--- /dev/null
+++ b/kentry.c
@@ -0,0 +1,46 @@
+#include "stm32f411.h"
+
+static const char *text[] = {
+  "hello, friend.\r\n",
+  "hello, friend?\r\n",
+  "that's lame.\r\n",
+  "maybe i should give you a name.\r\n",
+  "but that's a slippery slope.\r\n",
+  "you're only in my head.\r\n",
+  "we have to remember that.\r\n",
+  "shit.\r\n",
+  "it's actually happening, i'm talking to an imaginary person.\r\n\n"
+};
+
+void
+kentry (void)
+{
+  unsigned int line, off;
+
+  /*  Test UART and LED  ----------------------------------------------------  */
+
+  while (1)
+    {
+      for (line = 0; line < sizeof text / sizeof *text; ++line)
+        {
+          /* Print current line  */
+          off = 0;
+          while (text[line][off])
+            {
+              /* TXE: Transmit data register empty  */
+              while (!(*USART1_SR & (1u << 7))); /* 0: Data is not transferred
+                                                    to the shift register  */
+
+              /* DR[8:0]: Data value  */
+              *USART1_DR = text[line][off++];
+            }
+
+          /* TC: Transmission complete  */
+          while (!(*USART1_SR & (1u << 6))); /* 0: Transmission is not
+                                                complete  */
+
+          /* Blink LED  */
+          *GPIOC_ODR ^= (1u << 13);
+        }
+    }
+}
index dc4c1349e9e7105e1d363e493ecf4507f5a5144d..1545c6e857f48b2c0bd12d70eca5919c200a490c 100644 (file)
--- a/kernel.c
+++ b/kernel.c
@@ -1,37 +1,42 @@
 #include "link.h"
 #include "stm32f411.h"
 
-static const char *text[] = {
-  "hello, friend.\r\n",
-  "hello, friend?\r\n",
-  "that's lame.\r\n",
-  "maybe i should give you a name.\r\n",
-  "but that's a slippery slope.\r\n",
-  "you're only in my head.\r\n",
-  "we have to remember that.\r\n",
-  "shit.\r\n",
-  "it's actually happening, i'm talking to an imaginary person.\r\n\n"
-};
+__attribute__ ((noreturn)) extern void kentry (void);
 
 static void
 reset_handler (void)
 {
   unsigned int *src, *dst;
-  unsigned int line, off;
 
-  /* Relocate .data section to SRAM  */
+  /* Set FAULTMASK  */
+  asm ("cpsid f");
+
+  /*  Initialize .data and .bss in SRAM  ------------------------------------  */
+
+  /* Relocate .data section  */
   src = &_data_lma_start;
   dst = &_data_vma_start;
 
   while (dst < &_data_vma_end)
     *(dst++) = *(src++);
 
-  /* Initialize .bss section  */
+  /* Initialize .bss  */
   dst = &_bss_vma_start;
 
   while (dst < &_bss_vma_end)
     *(dst++) = 0;
 
+  /*  LED setup  ------------------------------------------------------------  */
+
+  /* GPIOCEN: IO port C clock enable  */
+  *RCC_AHB1ENR |= (1u << 2); /* 1: IO port C clock enabled  */
+  /* MODERy[1:0]: Port x configuration bits (y = 0..15)  */
+  *GPIOC_MODER &= ~(0b11u << 26); /* Clear PC13 bits  */
+  *GPIOC_MODER |= (1u << 26); /* 01: General purpose output mode  */
+
+  /* PC13: 0 = LED on
+   *       1 = LED off  */
+
   /*  SYSCLK setup  ---------------------------------------------------------  */
 
   /* HSEBYP: HSE clock bypass  */
@@ -80,43 +85,12 @@ reset_handler (void)
   /* TE: Transmitter enable  */
   *USART1_CR1 |= (1u << 3); /* 1: Transmitter is enabled  */
 
-  /*  LED setup  ------------------------------------------------------------  */
+  /*  Jump to kernel entry code  --------------------------------------------  */
 
-  /* GPIOCEN: IO port C clock enable  */
-  *RCC_AHB1ENR |= (1u << 2); /* 1: IO port C clock enabled  */
-  /* MODERy[1:0]: Port x configuration bits (y = 0..15)  */
-  *GPIOC_MODER &= ~(0b11u << 26); /* Clear PC13 bits  */
-  *GPIOC_MODER |= (1u << 26); /* 01: General purpose output mode  */
-
-  /* PC13: 0 = LED on
-   *       1 = LED off  */
+  /* Clear FAULTMASK  */
+  asm ("cpsie f");
 
-  /*  Test UART and LED  ----------------------------------------------------  */
-
-  while (1)
-    {
-      for (line = 0; line < sizeof text / sizeof *text; ++line)
-        {
-          /* Print current line  */
-          off = 0;
-          while (text[line][off])
-            {
-              /* TXE: Transmit data register empty  */
-              while (!(*USART1_SR & (1u << 7))); /* 0: Data is not transferred
-                                                    to the shift register  */
-
-              /* DR[8:0]: Data value  */
-              *USART1_DR = text[line][off++];
-            }
-
-          /* TC: Transmission complete  */
-          while (!(*USART1_SR & (1u << 6))); /* 0: Transmission is not
-                                                complete  */
-
-          /* Blink LED  */
-          *GPIOC_ODR ^= (1u << 13);
-        }
-    }
+  kentry ();
 }
 
 __attribute__ ((section (".vector_table"), used))