Why does not this bare metal raspberry pi 2 model b v1.1 c code program work?

Thread Starter

Hentaifan69420

Joined Jun 5, 2019
11
Hi all!

I am a noob so i apologize for the infuriation when looking at my code

I am trying to make a piece of code that runs without an os on my raspberry pi 2 model b v1.1. It is supposed to make gpio pin 13 go high.
Here is the code:

/* The base address of the GPIO peripheral (ARM Physical Address) */

#define BASE_ADDR 0x3F200000UL

#define FSEL10 0x04
#define GPSET0 0x1C

volatile unsigned int* gpio;

int main(void)
{
/* Assign the address of the GPIO peripheral (Using ARM Physical Address) */
gpio = (unsigned int*)BASE_ADDR;

/* Set the pin as an output */
gpio[FSEL0] |= (1 << 9);

/* Make the pin high. */
gpio[GPSET0] |= (1 << 12);

/* Never exit as there is no OS to exit to! */
while(1)
{

}
}

In the code i set the pin 13 as an output (i set the first pi of the it's function select register (bits 0,1 and 2 of the fsel10 are for gpio pin 10, bits 3,4 and 5 are for gpio pin 11 and so on, so i left shift 1 nine times to get the 10th bit of fsel10 which is the first bit of gpio pin 13, so it should set it high)). I am trying to follow this tutorial btw https://github.com/BrianSidebotham/arm-tutorial-rpi/tree/master/part-1

When the correct function is set (output) then i get the 13th bit of the gpset0 by left shifting 1 by 12 times (i think that 1 by itself is already gpio pin 1).
The while loop is just there to prevent the main function from returning, because there is nothing to return to.
I compile the code with this command: arm-none-eabi-gcc -O2 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7-a -mtune=cortex-a7 -nostartfiles main.c -o main.elf
(main.c is the code)
My arm-none-eabi-gcc version is 8.3.1 20190703 (release) [gcc-8-branch revision 273027].
Then i used this command to get the raw machine code: arm-none-eabi-objcopy main.elf -O binary kernel.img
My arm-none-eabi-objcopy version is GNU objcopy (GNU Tools for Arm Embedded Processors 8-2019-q3-update) 2.32.0.20190703 (yse i did copy the output of arm-none-eabi-objcopy --version directly and same with gcc).
I then put the kernel.img on my micro sd card with start.elf and bootcode.bin and i put it in to my raspberry pi 2 model b v1.1.
Why isn't the gpio 13 pin high? I have checked all the wiring connections.

Thanks in advance!!

(And btw you people are awesome! I have checked out some of the projects you are making/have made)
 

nsaspook

Joined Aug 27, 2009
6,265
I don't do bare metal on the RPi but it looks like you have the corrrect physical GPIO address from the base address.

This is what I do in a Linux driver for the physical address.
C:
//#define PERI_BASE   0x20000000
#define PERI_BASE   0x3F000000
#define BCM2708_PERI_BASE        PERI_BASE

#define ST_BASE                  (BCM2708_PERI_BASE + 0x3000)
#define GPIO_BASE                (BCM2708_PERI_BASE + 0x200000) /* GPIO */
For the Linux kernel you need to ioremap the physical address into kernel space but that's not needed on bare-metal.
C:
    dev->iobase = GPIO_BASE; /* bcm iobase */
    /*
    * dev->mmio is a void pointer with 8bit pointer indexing,
    * we need 32bit indexing so mmio is casted to a (__iomem uint32_t*)
    * pointer for GPIO R/W operations
    */
    dev->mmio = ioremap(dev->iobase, SZ_16K);
    if (!dev->mmio) {
        dev_err(dev->class_dev, "invalid gpio io base address!\n");
        return -EINVAL;
    }
A simple set of routines that uses a lookup table to remap pin numbers into gpio offsets.
C:
/*
* digitalWrite:
*      Set an output bit
*****************************************************************
*/

static void digitalWriteWPi(struct comedi_device *dev,
    int32_t pin,
    int32_t value)
{
    struct daqgert_private *devpriv = dev->private;
    int32_t *pinToGpio = devpriv->pinToGpio;

    pin = pinToGpio [pin & 63];
    if (value == LOW)
        iowrite32(1 << (pin & 31), (__iomem uint32_t*) dev->mmio
        + gpioToGPCLR [pin]);
    else
        iowrite32(1 << (pin & 31), (__iomem uint32_t*) dev->mmio
        + gpioToGPSET [pin]);
}

static void digitalWriteGpio(struct comedi_device *dev,
    int32_t pin,
    int32_t value)
{

    pin &= 63;
    if (value == LOW)
        iowrite32(1 << (pin & 31), (__iomem uint32_t*) dev->mmio
        + gpioToGPCLR [pin]);
    else
        iowrite32(1 << (pin & 31), (__iomem uint32_t*) dev->mmio
        + gpioToGPSET [pin]);
}
https://github.com/nsaspook/daq_gert/blob/master/daq_gert.c
 

Thread Starter

Hentaifan69420

Joined Jun 5, 2019
11
I don't do bare metal on the RPi but it looks like you have the corrrect physical GPIO address from the base address.

This is what I do in a Linux driver for the physical address.
C:
//#define PERI_BASE   0x20000000
#define PERI_BASE   0x3F000000
#define BCM2708_PERI_BASE        PERI_BASE

#define ST_BASE                  (BCM2708_PERI_BASE + 0x3000)
#define GPIO_BASE                (BCM2708_PERI_BASE + 0x200000) /* GPIO */
For the Linux kernel you need to ioremap the physical address into kernel space but that's not needed on bare-metal.
C:
    dev->iobase = GPIO_BASE; /* bcm iobase */
    /*
    * dev->mmio is a void pointer with 8bit pointer indexing,
    * we need 32bit indexing so mmio is casted to a (__iomem uint32_t*)
    * pointer for GPIO R/W operations
    */
    dev->mmio = ioremap(dev->iobase, SZ_16K);
    if (!dev->mmio) {
        dev_err(dev->class_dev, "invalid gpio io base address!\n");
        return -EINVAL;
    }
A simple set of routines that uses a lookup table to remap pin numbers into gpio offsets.
C:
/*
* digitalWrite:
*      Set an output bit
*****************************************************************
*/

static void digitalWriteWPi(struct comedi_device *dev,
    int32_t pin,
    int32_t value)
{
    struct daqgert_private *devpriv = dev->private;
    int32_t *pinToGpio = devpriv->pinToGpio;

    pin = pinToGpio [pin & 63];
    if (value == LOW)
        iowrite32(1 << (pin & 31), (__iomem uint32_t*) dev->mmio
        + gpioToGPCLR [pin]);
    else
        iowrite32(1 << (pin & 31), (__iomem uint32_t*) dev->mmio
        + gpioToGPSET [pin]);
}

static void digitalWriteGpio(struct comedi_device *dev,
    int32_t pin,
    int32_t value)
{

    pin &= 63;
    if (value == LOW)
        iowrite32(1 << (pin & 31), (__iomem uint32_t*) dev->mmio
        + gpioToGPCLR [pin]);
    else
        iowrite32(1 << (pin & 31), (__iomem uint32_t*) dev->mmio
        + gpioToGPSET [pin]);
}
https://github.com/nsaspook/daq_gert/blob/master/daq_gert.c
Hi

Thanks for your time. There is unfortunately a big problem. I do not know how to implement your code with my code. I only know the very basics of c code. (I know that i should have learned more c code before doing bare metal things.) Can you help?

Thanks again in advance!

Sincerely, Hentaifan69420
 

nsaspook

Joined Aug 27, 2009
6,265
Your tutorial link looks good so start from there by using a working 'on/blink led' program.
http://www.valvers.com/open-software/raspberry-pi/step01-bare-metal-programming-in-cpt1/

Visual Output and Running Code
Finally, let’s get on and see some of our code running on the Raspberry-Pi. We’ll continue with
using the first example of the Cambridge tutorials by lighting the OK LED on the Raspberry-Pi
board. This’ll be our equivalent of the ubiquitous Hello World example. Normally an embedded
Hello World is a blinking LED, so that we know the processor is continuously running. We’ll move
on to that in a bit.

The GPIO peripheral has a base address in the BCM2835 manual at 0x7E200000. We know from getting
to know our processor that this translates to an ARM Physical Address of 0x20200000 (0x3F200000
for RPI2). This is the first register in the GPIO peripheral register set, the ‘GPIO Function
Select 0’ register.
 

Thread Starter

Hentaifan69420

Joined Jun 5, 2019
11
Your tutorial link looks good so start from there by using a working 'on/blink led' program.
http://www.valvers.com/open-software/raspberry-pi/step01-bare-metal-programming-in-cpt1/

Visual Output and Running Code
Finally, let’s get on and see some of our code running on the Raspberry-Pi. We’ll continue with
using the first example of the Cambridge tutorials by lighting the OK LED on the Raspberry-Pi
board. This’ll be our equivalent of the ubiquitous Hello World example. Normally an embedded
Hello World is a blinking LED, so that we know the processor is continuously running. We’ll move
on to that in a bit.

The GPIO peripheral has a base address in the BCM2835 manual at 0x7E200000. We know from getting
to know our processor that this translates to an ARM Physical Address of 0x20200000 (0x3F200000
for RPI2). This is the first register in the GPIO peripheral register set, the ‘GPIO Function
Select 0’ register.
Hi

I managed the make the ACT led (ok led in other raspberries i think) blink with this code:

Code:
#define GPIO_BASE  0x3F200000UL

#define LED_GPFSEL  GPIO_GPFSEL4
#define LED_GPFBIT  21
#define LED_GPSET  GPIO_GPSET1
#define LED_GPCLR  GPIO_GPCLR1
#define LED_GPIO_BIT  15

#define GPIO_GPFSEL0  0
#define GPIO_GPFSEL1  1
#define GPIO_GPFSEL2  2
#define GPIO_GPFSEL3  3
#define GPIO_GPFSEL4  4
#define GPIO_GPFSEL5  5

#define GPIO_GPSET0  7
#define GPIO_GPSET1  8

#define GPIO_GPCLR0  10
#define GPIO_GPCLR1  11

#define GPIO_GPLEV0  13
#define GPIO_GPLEV1  14

#define GPIO_GPEDS0  16
#define GPIO_GPEDS1  17

#define GPIO_GPREN0  19
#define GPIO_GPREN1  20

#define GPIO_GPFEN0  22
#define GPIO_GPFEN1  23

#define GPIO_GPHEN0  25
#define GPIO_GPHEN1  26

#define GPIO_GPLEN0  28
#define GPIO_GPLEN1  29

#define GPIO_GPAREN0  31
#define GPIO_GPAREN1  32

#define GPIO_GPAFEN0  34
#define GPIO_GPAFEN1  35

#define GPIO_GPPUD  37
#define GPIO_GPPUDCLK0  38
#define GPIO_GPPUDCLK1  39

/** GPIO Register set */
volatile unsigned int* gpio;

/** Simple loop variable */
volatile unsigned int tim;

/** Main function - we'll never return from here */
int main(void)
{
  /* Assign the address of the GPIO peripheral (Using ARM Physical Address) */
  gpio = (unsigned int*)GPIO_BASE;

  /* Write 1 to the GPIO16 init nibble in the Function Select 1 GPIO
  peripheral register to enable GPIO16 as an output */
  gpio[LED_GPFSEL] |= (1 << LED_GPFBIT);

  /* Never exit as there is no OS to exit to! */
  while(1)
  {
  for(tim = 0; tim < 500000; tim++)
  ;

  /* Set the LED GPIO pin low ( Turn OK LED on for original Pi, and off
  for plus models )*/
  gpio[LED_GPCLR] = (1 << LED_GPIO_BIT);

  for(tim = 0; tim < 500000; tim++)
  ;

  /* Set the LED GPIO pin high ( Turn OK LED off for original Pi, and on
  for plus models )*/
  gpio[LED_GPSET] = (1 << LED_GPIO_BIT);
  }
}
But when i tried the blink the gpio 13 pin with this code (which i think should turn the pin high):

Code:
#define GPIO_BASE  0x3F200000UL

#define LED_GPFSEL  GPIO_GPFSEL1
#define LED_GPFBIT  12
#define LED_GPSET  GPIO_GPSET1
#define LED_GPCLR  GPIO_GPCLR1
#define LED_GPIO_BIT  12

#define GPIO_GPFSEL0  0
#define GPIO_GPFSEL1  1
#define GPIO_GPFSEL2  2
#define GPIO_GPFSEL3  3
#define GPIO_GPFSEL4  4
#define GPIO_GPFSEL5  5

#define GPIO_GPSET0  7
#define GPIO_GPSET1  8

#define GPIO_GPCLR0  10
#define GPIO_GPCLR1  11

#define GPIO_GPLEV0  13
#define GPIO_GPLEV1  14

#define GPIO_GPEDS0  16
#define GPIO_GPEDS1  17

#define GPIO_GPREN0  19
#define GPIO_GPREN1  20

#define GPIO_GPFEN0  22
#define GPIO_GPFEN1  23

#define GPIO_GPHEN0  25
#define GPIO_GPHEN1  26

#define GPIO_GPLEN0  28
#define GPIO_GPLEN1  29

#define GPIO_GPAREN0  31
#define GPIO_GPAREN1  32

#define GPIO_GPAFEN0  34
#define GPIO_GPAFEN1  35

#define GPIO_GPPUD  37
#define GPIO_GPPUDCLK0  38
#define GPIO_GPPUDCLK1  39

/** GPIO Register set */
volatile unsigned int* gpio;

/** Simple loop variable */
volatile unsigned int tim;

/** Main function - we'll never return from here */
int main(void)
{
  /* Assign the address of the GPIO peripheral (Using ARM Physical Address) */
  gpio = (unsigned int*)GPIO_BASE;

  /* Write 1 to the GPIO16 init nibble in the Function Select 1 GPIO
  peripheral register to enable GPIO16 as an output */
  gpio[LED_GPFSEL] |= (1 << LED_GPFBIT);

  /* Never exit as there is no OS to exit to! */
  while(1)
  {
  for(tim = 0; tim < 500000; tim++)
  ;

  /* Set the LED GPIO pin low ( Turn OK LED on for original Pi, and off
  for plus models )*/
  gpio[LED_GPCLR] = (1 << LED_GPIO_BIT);

  for(tim = 0; tim < 500000; tim++)
  ;

  /* Set the LED GPIO pin high ( Turn OK LED off for original Pi, and on
  for plus models )*/
  gpio[LED_GPSET] = (1 << LED_GPIO_BIT);
  }
}
The gpio 13 pin remains low.

Thanks in advance for the help!

Sincerely Hentaifan69420
 

Thread Starter

Hentaifan69420

Joined Jun 5, 2019
11
Hi and sorry for the long gap between responses.

I am unsure what you mean by what pin are you checking for GPIO 13. And for the user access shouldn't that matter because i am writing a program that runs without an os, so it should run with kernel priviledges?

Please correct me if i am wrong.

Sincerely Hentaifan69420
 

Thread Starter

Hentaifan69420

Joined Jun 5, 2019
11
Hi

I think i have the 40 pin header on my raspberry pi. The pin arrangement is the same on my pi as in the picture.

Sincerely Hentaifan69420
 

nsaspook

Joined Aug 27, 2009
6,265
Hi

I think i have the 40 pin header on my raspberry pi. The pin arrangement is the same on my pi as in the picture.

Sincerely Hentaifan69420
https://elinux.org/RPi_BCM2835_GPIOs
https://www.raspberrypi.org/app/uploads/2012/02/BCM2835-ARM-Peripherals.pdf

This is one of the reasons I don't like a bare metal programming style with OS capable SoC systems. The complexity and gotchas of the devices detract for doing actual useful work on the machine unless you need that level of detail when writing unique kernel drivers.
 
Last edited:

Thread Starter

Hentaifan69420

Joined Jun 5, 2019
11
Hi

Yes i agree that it is quite hard without an os or libraries, but i figured i would learn a lot about low level stuff so i decided "Why not?". I just want to get the gpio pin 13 to go high. And yeah, this is very hard. I have managed to make the pin go high in arm assembly language, but not in c.

Sincerely Hentaifan69420
 

nsaspook

Joined Aug 27, 2009
6,265
Hi

Yes i agree that it is quite hard without an os or libraries, but i figured i would learn a lot about low level stuff so i decided "Why not?". I just want to get the gpio pin 13 to go high. And yeah, this is very hard. I have managed to make the pin go high in arm assembly language, but not in c.

Sincerely Hentaifan69420
Can we see the working ASM example?
 

Thread Starter

Hentaifan69420

Joined Jun 5, 2019
11
Hi and sorry

I actually lied. This code turns gpio pin 21 high and low repeatedly (this file is called led_blinky.s):

Code:
.section .init
.global _start
@------------------
@SETUP VALUES
@------------------
.equ BASE,  0x3f200000 @Base address
.equ GPFSEL2, 0x08       @FSEL2 register offset
.equ GPSET0,  0x1c       @GPSET0 register offset
.equ GPCLR0,0x28       @GPCLR0 register offset
.equ SET_BIT3,  0x08     @sets bit three b1000 (remember that counting strats from zero)
.equ SET_BIT21,  0x200000    @sets bit 21
.equ COUNTER,0x50000

ldr r2,=COUNTER
@------------------
@Start label
@------------------
_start:
@------------------
@load register with BASE
@------------------
ldr r0,=BASE
@------------------
@Set bit 3 in GPFSEL2
@------------------
ldr r1,=SET_BIT3
str r1,[r0,#GPFSEL2]
@------------------
@Set bit 21 in GPSET0
@------------------
ldr r1,=SET_BIT21
str r1,[r0,#GPSET0]

infinite_loop:
str r1,[r0,#GPSET0]
mov r10,#0

delay:
add r10,r10,#1
cmp r10,r2
bne delay
str r1,[r0,#GPCLR0]
mov r10, #0

delay2:
add r10,r10,#1
cmp r10,r2
bne delay2
str r1,[r0,#GPSET0]
b infinite_loop
There is also a link file (kernel.ld):

Code:
SECTIONS {
  .text 0x8000 : {
  *(.text)
  }

  .data : {
  *(.data)
  }
}
I assembled the code with these commands:

1. arm-none-eabi-as -g -o kernel.o led_blinky.s

2. arm-none-eabi-ld kernel.o kernel.ld -o kernel.elf

3. arm-none-eabi-objcopy kernel.elf -O binary kernel.img

Then i put the kernel.img with bootcode.bin and start.elf and when i plug the power, it blinks the led on pin 21.

Sincerely Hentaifan69420
 

Thread Starter

Hentaifan69420

Joined Jun 5, 2019
11
Hi

Quick update. This code also does not work. There are obvious inconsistencies with the addresses, but here is the code with the same addresses (the gpiofsel0 was different). I was just blindly following the tutorial, but now i noticed the inconsistencies. (I actually tried to make pin 20 go high in this code, because that would eliminate a the change of a specific thing being a problem) (I also tried this with GPFBIT at 4 and 3 (original gpio pin 21) and i for each of those options i also tried setting the LED_GPIO_BIT to 21 and to 20, but it still didn't work)

Code:
#define GPIO_BASE  0x3F200000UL

#define LED_GPFSEL  GPIO_GPFSEL2
#define LED_GPFBIT  0
#define LED_GPSET  GPIO_GPSET0
#define LED_GPCLR  GPIO_GPCLR0
#define LED_GPIO_BIT  20

#define GPIO_GPFSEL0  0x08
#define GPIO_GPFSEL1  1
#define GPIO_GPFSEL2  0x08
#define GPIO_GPFSEL3  3
#define GPIO_GPFSEL4  4
#define GPIO_GPFSEL5  5

#define GPIO_GPSET0  0x1C
#define GPIO_GPSET1  0x1C

#define GPIO_GPCLR0  0x28
#define GPIO_GPCLR1  0x28

#define GPIO_GPLEV0  13
#define GPIO_GPLEV1  14

#define GPIO_GPEDS0  16
#define GPIO_GPEDS1  17

#define GPIO_GPREN0  19
#define GPIO_GPREN1  20

#define GPIO_GPFEN0  22
#define GPIO_GPFEN1  23

#define GPIO_GPHEN0  25
#define GPIO_GPHEN1  26

#define GPIO_GPLEN0  28
#define GPIO_GPLEN1  29

#define GPIO_GPAREN0  31
#define GPIO_GPAREN1  32

#define GPIO_GPAFEN0  34
#define GPIO_GPAFEN1  35

#define GPIO_GPPUD  37
#define GPIO_GPPUDCLK0  38
#define GPIO_GPPUDCLK1  39

/** GPIO Register set */
volatile unsigned int* gpio;

/** Simple loop variable */
volatile unsigned int tim;

/** Main function - we'll never return from here */
int main(void)
{
  /* Assign the address of the GPIO peripheral (Using ARM Physical Address) */
  gpio = (unsigned int*)GPIO_BASE;

  /* Write 1 to the GPIO16 init nibble in the Function Select 1 GPIO
  peripheral register to enable GPIO16 as an output */
  gpio[LED_GPFSEL] |= (1 << LED_GPFBIT);

  /* Never exit as there is no OS to exit to! */
  while(1)
  {
  for(tim = 0; tim < 500000; tim++)
  ;

  /* Set the LED GPIO pin low ( Turn OK LED on for original Pi, and off
  for plus models )*/
  gpio[LED_GPCLR] = (1 << LED_GPIO_BIT);

  for(tim = 0; tim < 500000; tim++)
  ;

  /* Set the LED GPIO pin high ( Turn OK LED off for original Pi, and on
  for plus models )*/
  gpio[LED_GPSET] = (1 << LED_GPIO_BIT);
  }
}
I compiled and assembled it with the same commands as before. It still does not seem to work.

Sincerely Hentaifan69420
 

Thread Starter

Hentaifan69420

Joined Jun 5, 2019
11
Hi

Well a while later i noticed that it actually didn't work as intended. Over here where i am from it is now quite late, so i am going to sleep now. I will explain everything once i wake up.

Sincerely Hentaifan 69420
 

Thread Starter

Hentaifan69420

Joined Jun 5, 2019
11
Hi

Okay. Here is the code:

Code:
#define GPIO_BASE  0x3F200000UL
#define LED_GPFSEL  GPIO_GPFSEL2
#define LED_GPFBIT  4
#define LED_GPSET  GPIO_GPSET1
#define LED_GPCLR  GPIO_GPCLR1
#define LED_GPIO_BIT  21

#define GPIO_GPFSEL0  0
#define GPIO_GPFSEL1  1
#define GPIO_GPFSEL2  2
#define GPIO_GPFSEL3  3
#define GPIO_GPFSEL4  4
#define GPIO_GPFSEL5  5

#define GPIO_GPSET0  7
#define GPIO_GPSET1  8

#define GPIO_GPCLR0  10
#define GPIO_GPCLR1  11

#define GPIO_GPLEV0  13
#define GPIO_GPLEV1  14

#define GPIO_GPEDS0  16
#define GPIO_GPEDS1  17

#define GPIO_GPREN0  19
#define GPIO_GPREN1  20

#define GPIO_GPFEN0  22
#define GPIO_GPFEN1  23

#define GPIO_GPHEN0  25
#define GPIO_GPHEN1  26

#define GPIO_GPLEN0  28
#define GPIO_GPLEN1  29

#define GPIO_GPAREN0  31
#define GPIO_GPAREN1  32

#define GPIO_GPAFEN0  34
#define GPIO_GPAFEN1  35

#define GPIO_GPPUD  37
#define GPIO_GPPUDCLK0  38
#define GPIO_GPPUDCLK1  39

/** GPIO Register set */
volatile unsigned int* gpio;

/** Simple loop variable */
volatile unsigned int tim;

/** Main function - we'll never return from here */
int main(void)
{
  /* Assign the address of the GPIO peripheral (Using ARM Physical Address) */
  gpio = (unsigned int*)GPIO_BASE;

  /* Write 1 to the GPIO16 init nibble in the Function Select 1 GPIO
  peripheral register to enable GPIO16 as an output */
  gpio[LED_GPFSEL] |= (1 << LED_GPFBIT);

  /* Never exit as there is no OS to exit to! */
  while(1)
  {
  for(tim = 0; tim < 5000000; tim++)
  ;

  /* Set the LED GPIO pin low ( Turn OK LED on for original Pi, and off
  for plus models )*/
  gpio[LED_GPCLR] = (1 << LED_GPIO_BIT);

  for(tim = 0; tim < 5000000; tim++)
  ;

  /* Set the LED GPIO pin high ( Turn OK LED off for original Pi, and on
  for plus models )*/
  gpio[LED_GPSET] = (1 << LED_GPIO_BIT);
  }
}
The problem is that the led does not blink. It just stays on. (And yes i multiplied the wait time by 10, because i tought that the wait was too short for my human brain to register. And also there is no risk of the wait time being too long being the problem, because i waited few minutes and the led didn't turn off.) I compiled the code with the same commands as before.

Sincerely Hentaifan69420
 
Top