답변:
AVRFreaks 에는 Dean Camera (일명 abcminuser )가 모듈화 C 코드 : 대규모 프로젝트 관리 라는 훌륭한 자습서가 있습니다 . James Wagner의 마이크로 프로세서 용 스테이트 머신 (State Machines for Microprocessors) 에 관심이있을 수도 있습니다 .
내가 가장 좋아하는 AVR-from-scratch-in-C 튜토리얼은 https://www.mainframe.cx/~ckuethe/avr-c-tutorial/
모든 사람은 소형 임베디드 시스템을위한 고유 한 스타일을 가지고 있습니다. 내 꺼야 :
함수의 접두사를 구성하는 각각의 이름과 함께 많은 C 파일을 사용하고 싶습니다. 예를 들어 led_init()
및 led_tick()
모두에 led.c
있습니다. 이것은 모듈 식을 유지하고 이식성을 도와줍니다.
common.h
헤더 파일을 사용하여 유형을 정의하지만 각 모듈마다 개별적으로 포함됩니다.
나는 하나의 프리 런닝 시스템 타이머를 사용하는 경향이 있으며 (a systime.c
) 모듈 systime_get()
이 시스템 틱 또는 밀리 초 단위로 현재 시간을 가져 오는 함수를 호출합니다 . 그런 다음 각 모듈은 X_tick()
기능을 사용하여 소프트웨어 타이머를 통해 이벤트를 예약 할 수 있습니다 .
common.h :
#ifndef COMMON_H
#define COMMON_H
#include <stdio.h> // general purpose headers
#include <stdint.h>
#include <stdbool.h>
...
#endif
uart.h :
#ifndef UART_H
#define UART_H
#include <avr/usart.h> // microcontroller specific headers for uart
...
void uart_init(void);
void uart_putc(uint8_t ch);
...
#endif
uart.c :
#include "common.h"
#include "uart.h"
void uart_isr(void) __interrupt VECTOR
{
// handle incoming data
}
void uart_init(void)
{
// setup hardware
}
void uart_putc(uint8_t ch)
{
UART_TX_FIFO_REGISTER = ch;
while(!TX_COMPLETE_REGISTER);
}
led.h :
#ifndef LED_H
#define LED_H
#include <avr/ioports.h> // microcontroller specific headers for port io
...
#define LED_DDR PORTAD
#define LED_PIN 5
#define LED_MASK (1 << LED_PIN)
#define LED_PORT PORTA
void led_init(void);
void led_set(void);
void led_tick(void);
...
#endif
led.c :
#include "common.h"
#include "led.h"
void led_init(void)
{
LED_DDR |= LED_MASK;
}
void led_set(void)
{
LED_PORT |= LED_MASK;
}
void led_tick(void)
{
// animate LEDs in an amusing fashion
}
main.c :
#include "common.h"
#include "led.h"
#include "uart.h"
int main(void)
{
led_init();
uart_init();
...
led_set();
while(1)
{
led_tick();
uart_tick();
}
return 0;
}