Взаимодействие программных компонент

Процесс инициализации встраиваемого вычислительного комплекса (ВК)

Процесс init — процесс, исполняемый в пользовательском режиме (в отличие от привилегированного режима, для программ, выполняемых в пользовательском режиме, недоступен ряд команд). Init загружает необходимые модули ядра, инициализирует сетевой интерфейс, выполняет запуск фоновых сервисов, и передает управление приложению или ФПО.

Пример прикладной программы, реализующей бесконечный цикл ФПО.

ФПО — Функциональное программное обеспечение, — боевая программа.

#include <linux/watchdog.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <signal.h>

/* Error codes */
#define E_OK    0
#define E_WD    (-1)

/* Watchgog global variables: */
static char *wd_dev_name = "/dev/watchdog";
static int wd_fd = 0;
static int timeout = 10;

/* kill fpo signal handler */
void signal_callback_handler(int signum) {
    if (signum == SIGTERM) {
        printf("FPO killed by SIGTERM, watchdog is not stopped
        - to be rebooted in %d seconds\n", timeout);
        sleep(timeout);
    }
} /* signal_callback_handler */

/* function setupWatchdog, returns 0 on success */
int setupWatchdog(void) {
    /* Open watchdog device file */
    wd_fd = open(wd_dev_name, O_WRONLY);
    if (wd_fd < 0){
        printf("\nCan not open watchdog device file %s\n", wd_dev_name);
        return E_WD;
    }
    /* Set timeout */
    if (ioctl(wd_fd, WDIOC_SETTIMEOUT, &timeout) < 0){
        printf("\nioctl WDIOC_SETTIMEOUT failed\n");
        return E_WD;
    }
      
    /* Register signal and handler */
    signal(SIGTERM, signal_callback_handler);
    return E_OK;
}
  
/* Entry point to FPO */
int main(void) {
    int status;
    printf("Setting up watchdog\n");
    status = setupWatchdog();
    if (status != E_OK) {
        printf("Error on setup watchdog, status= %d", status);
        return E_WD;
    }
      
    printf("Enter the main loop of FPO\n");
    while(1)
    {
        if (ioctl(wd_fd, WDIOC_KEEPALIVE, 0) < 0) {
        printf("\nioctl WDIOC_KEEPALIVE failed\n");
    }
        /* do the job here */
        sleep(timeout / 2);
    }
    /* Never here */
    return E_OK;
}

 

Скачать “Взаимодействие программных компонент.pdf”