В качестве RTOS.В качестве U-boot?
В качестве RTOS.В качестве U-boot?
Это по тому что в MIPS 24Kec нет MMU?В качестве RTOS.
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
static int create_process(void) {
pid_t pid;
int status;
pid = vfork();
if (-1 == pid) {
return errno;
}
if (pid == 0) {
/* child */
exit(EXIT_SUCCESS);
}
waitpid(pid, &status, 0);
return EXIT_SUCCESS;
}
int main(void) {
int i;
for (i = 0; i < 100000; i ++) {
create_process();
}
return EXIT_SUCCESS;
}
760 микросекунд на создание процесса на не самом производительном CPU - кошмар ?Это кошмар
Не я создаю, а система создает процессы. Берите любой bash...760 микросекунд на создание процесса на не самом производительном CPU - кошмар ?
Вы посмотрите сколько времени уходит на 1 системный вызов или на переключение контекста во взрослом CPU.
Если вы создает процессы за микросекунды - вы явно что -то делаете не так.
Потому что с eCos я работал и мне не нужен полноценный Linux.Это по тому что в MIPS 24Kec нет MMU?
При оптимизации ядра и прочей шелухи разницы нет, кроме старости eCOS и массе дырок.Потому что с eCos я работал и мне не нужен полноценный Linux.
А так нельзя делать. Делают умнее, но для этого надо думать.И на счет сколько раз форкаются какие-либо CGI и прочее в web-сервере сами додумаетесь Подсказка - на каждый чуть ли не байт
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
#include <time.h>
struct timespec create_time;
struct timespec delete_time;
struct timespec timespec_normalise(struct timespec ts)
{
while(ts.tv_nsec >= 1000000000)
{
++(ts.tv_sec);
ts.tv_nsec -= 1000000000;
}
while(ts.tv_nsec <= -1000000000)
{
--(ts.tv_sec);
ts.tv_nsec += 1000000000;
}
if(ts.tv_nsec < 0 && ts.tv_sec > 0)
{
/* Negative nanoseconds while seconds is positive.
* Decrement tv_sec and roll tv_nsec over.
*/
--(ts.tv_sec);
ts.tv_nsec = 1000000000 - (-1 * ts.tv_nsec);
}
else if(ts.tv_nsec > 0 && ts.tv_sec < 0)
{
/* Positive nanoseconds while seconds is negative.
* Increment tv_sec and roll tv_nsec over.
*/
++(ts.tv_sec);
ts.tv_nsec = -1000000000 - (-1 * ts.tv_nsec);
}
return ts;
}
struct timespec timespec_sub(struct timespec ts1, struct timespec ts2)
{
/* Normalise inputs to prevent tv_nsec rollover if whole-second values
* are packed in it.
*/
ts1 = timespec_normalise(ts1);
ts2 = timespec_normalise(ts2);
ts1.tv_sec -= ts2.tv_sec;
ts1.tv_nsec -= ts2.tv_nsec;
return timespec_normalise(ts1);
}
struct timespec timespec_add(struct timespec ts1, struct timespec ts2)
{
/* Normalise inputs to prevent tv_nsec rollover if whole-second values
* are packed in it.
*/
ts1 = timespec_normalise(ts1);
ts2 = timespec_normalise(ts2);
ts1.tv_sec += ts2.tv_sec;
ts1.tv_nsec += ts2.tv_nsec;
return timespec_normalise(ts1);
}
double timespec_to_double(struct timespec ts)
{
return ((double)(ts.tv_sec) + ((double)(ts.tv_nsec) / 1000000000));
}
static int create_process(void) {
pid_t pid;
int status;
struct timespec t1, t2, td;
clock_gettime(CLOCK_MONOTONIC, &t1);
pid = fork();
if (-1 == pid) {
return errno;
}
if (pid == 0) {
/* child */
exit(EXIT_SUCCESS);
}
clock_gettime(CLOCK_MONOTONIC, &t2);
td = timespec_sub(t2, t1);
create_time = timespec_add(create_time, td);
/* clock_gettime(CLOCK_MONOTONIC, &t1);
waitpid(pid, &status, 0);
clock_gettime(CLOCK_MONOTONIC, &t2);
td = timespec_sub(t2, t1);
delete_time = timespec_add(delete_time, td);
*/
return EXIT_SUCCESS;
}
int main(void) {
int i;
for (i = 0; i < 100000; i ++) {
create_process();
}
wait(NULL);
printf("Creation time = %e\n", timespec_to_double(create_time) / 100000.0);
/* printf("Termination time = %e\n", timespec_to_double(delete_time) / 100000.0); */
return EXIT_SUCCESS;
}
В том то и дело, что необходимо переписывать всё.А так нельзя делать. Делают умнее, но для этого надо думать.
Если смотреть загрузку системы по top видно что при работе вашего теста процессор не нагружен ( у меня 38%)
В вашем примере тормозит waitpid(pid, &status, 0) видать сигнал родительскому процессу медленно передается.
Какая ещё на ESP многозадачность? Там ловить нечего – при постоянном переключении кода задач кеш у неё не справляется и производительность упирается в скорость SPI Flash, где и находится исполняемый код. Это аналогично процу с тактовой в 10 MHz как макс.просто так..
Экспериментировал на nonos ESP по реализации многозадачности с управлением по внешним прерываниям и максимальным временем ожидания для задачи.
нечто подобие многозадачной системы
для хранения параметров задачи и переход к запуску новой затрачивается не более 128 байт и не более 5 мкс.
можно время реакции снизить до 2 мкс.
Там где не требуется код завершения, там родитель и не ждет закрытия дочернего процесса, а восприятие событий закрытия дочек обычно стоит в общем цикле с select().Я его немного модифицировал убрав ожидание
просто так поясняю.Какая ещё на ESP многозадачность? Там ловить нечего – при постоянном переключении кода задач кеш у неё не справляется и производительность упирается в скорость SPI Flash, где и находится исполняемый код. Это аналогично процу с тактовой в 10 MHz как макс.
Да и какие там виртуальные устройства, если памяти нету, а вся система – это огрызок в виде CPU с малым кеш, без RAM вообще. Для включения одной лампочки многозадачности не требуется, на чем и специализируется ESP.
Это неправильно спроектированная и разработанная система. Есть аппаратные драйвера 1-wire. К примеру с управлением по I2C. А у нормальных MCU работа I2C происходит по DMA и прерываниям.При реализации различных протоколов работы с внешними устройствами особенно такого протокола каr 1-wire далее I2c и т д
возникает проблема необходимости ожидания процессором сигнала на шине интерфейса или формирования определенной длительности импульса.