I am using Atmel Studio for the atmega8 microcontroller. Here I have two options for accessing it's io ports.
I can use DDRB, PORTB, and PINB Macro
MCU std ports macros#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr)) #define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET) /* Port B */ #define PINB _SFR_IO8(0x16) #define DDRB _SFR_IO8(0x17) #define PORTB _SFR_IO8(0x18)
this is my simple test code
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
int main(void)
{
DDRB = 0x01;
while (1)
{
PORTB = 0x01;
_delay_ms(1000);
PORTB = 0x00;
_delay_ms(1000);
}
}
after successful compilation
Program Memory Usage : 108 bytes 1.3 % Full
Data Memory Usage : 0 bytes 0.0 % Full
- Or I can use my own version
gpio.h\
#ifndef GPIO_H_
#define GPIO_H_
#include <avr/io.h>
typedef union {
struct
{
uint8_t pin0:1;
uint8_t pin1:1;
uint8_t pin2:1;
uint8_t pin3:1;
uint8_t pin4:1;
uint8_t pin5:1;
uint8_t pin6:1;
uint8_t pin7:1;
};
struct {
uint8_t lsb4:4;
uint8_t msb4:4;
};
uint8_t pins;
}port_reg_t;
typedef struct
{
port_reg_t r;
port_reg_t d;
port_reg_t p;
}port_t;
#define bio (*(volatile port_t *) (0x16 + __SFR_OFFSET))
#endif /* GPIO_H_ */
this is sample code
/*
led.cpp
Created: 12-05-2022 14:59:53
Author : HP */
#include <avr/io.h> #define F_CPU 1000000UL #include <util/delay.h> #include "gpio.h" int main(void) { //DDRB = 0x01; // // //while (1) //{ //PORTB = 0x01; //_delay_ms(1000); //PORTB = 0x00; //_delay_ms(1000); //} bio.d.pin0 = 1; while (1) { bio.p.pin0 = 1; _delay_ms(1000); bio.p.pin0 = 0; _delay_ms(1000); } }
after successful compilation
Program Memory Usage : 116 bytes 1.4 % Full
Data Memory Usage : 0 bytes 0.0 % Full
my question is, why it's taking 8 bytes extra in program memory?