МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

ТЕМА: Минималистичное софт-ядро для Марсохода.

Минималистичное софт-ядро для Марсохода. 3 года 8 мес. назад #4906

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Большая проблема, это стандартная библиотека Си. Минимально необходимая часть ее, применительно к софт-процессорам с маленькой памятью. Ее только самостоятельно писать на ассемблере, или можно взять/адаптировать Си-исходники? Хотелось бы, чтобы все было на Си.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Минималистичное софт-ядро для Марсохода. 3 года 8 мес. назад #4907

Судя по качеству кода, который генерирует LCC, я бы предпочёл вручную оптимизированную версию.

Условно libc можно разделить на две части - системо-зависимую и системо-независимую. Например, реализация vsprintf универсальна, поскольку не обращается к ОС, а printf можно реализовать так, чтобы писала в порт, а вот fprintf уже обязательно требует наличия ОС.

В простейшем случае malloc можно сделать чтобы выбирал свободные блоки из статического пула, но нормальная реализация malloc использует системную функцию sbrk, которая увеличивает размер BSS.

----

Ой, в моём ответе и нет ответа. Вероятно сначала нужно определиться какие именно функции нужны для минимального процессора, а потом искать реализацию каждой функции отдельно. Предварительно построив нечто вроде дерева зависимостей, чтобы видеть зависимость между этими функциями.

Затем можно было бы скомпилировать их с помощью lcc, а полученный ассемблерный код оптимизировать вручную.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от alman.

Минималистичное софт-ядро для Марсохода. 3 года 8 мес. назад #4908

Затем можно было бы скомпилировать их с помощью lcc, а полученный ассемблерный код оптимизировать вручную.

Я с некоторыми функциями так и делал, если были исходники на С.
Но их было всего парочка или чуть больше.
Остальные писал на ассемблере по мере использования в программах.
И вставлял в библиотеку на asm. И asm файл библиотеки подставлял вместе с основными
к ассемблеру.

Николай.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичное софт-ядро для Марсохода. 3 года 8 мес. назад #4913

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Решил сразу написать оптимизирующий транслятор symbolic --> asm, с удалением лишних пересылок. Код сокращается вдвое для N-ферзей. Ожидаю время выполнения ~2 секунды для N=13 (транслятор в машинные коды еще не готов). Кто-нибудь смотрел время счета N-ферзей для своих/других архитектур?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичное софт-ядро для Марсохода. 3 года 8 мес. назад #4914

Не уверен, что у меня исходники без ошибок.
Из main() вылетает быстро при любых N.
Ваш исходник выложите.

Николай.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Ynicky.

Минималистичное софт-ядро для Марсохода. 3 года 8 мес. назад #4915

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
extern port;
int queens(int N){	
	int 
	arow[16], 
	aleft[16], 
	aright[16], 
	aposs[16],
	poss, 
	place, 
	val,
	pos,
	cnt;
	
	pos=1;
	val = (1<<N)-1; 
	arow[1]=aleft[1]=aright[1]=0;
	poss=aposs[1]=val>>(N>>1);
	cnt = 0;	
	while(pos){
		if(poss){
			place = poss & -poss; 
			poss &= ~place;
			if(pos==1 && !poss && (N & 1)	)cnt<<=1;
			if(pos!=N){
				aposs[pos]=poss;
				poss=arow[pos+1]=arow[pos]|place;
				poss|=aleft[pos+1]=(aleft[pos]|place)<<1;
				poss|=aright[pos+1]=(aright[pos]|place)>>1;
				aposs[++pos]=poss=~(poss) & val;
			} else{
				++cnt;
			}
		}else{
			poss=aposs[--pos];
		}
	}
	if(!(N&1))cnt<<=1;
	return cnt;
}
void main(){
	int i;
	for(i=0;i<14;i++){
		port=queens(i);		
		//printf("%d  %d\n",i,queens(i)&0xFFFF);		
	}	
}
При N>12 будет переполнение cnt на 16-разрядных АЛУ, поэтому правильность результата на ПК проверяется с маской 0xFFFF. При N<15 вылетать не должно.
У меня оценка по asm, еще не моделировал, тк не готов транслятор в машинные коды.
При N=13 цикл while(pos) выполняется ~2.5млн раз, так что быстро вылетать не должно.
При N=14 цикл выполняется ~13.5млн раз. Можно проверить вставкой счетчиков в исходники.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Минималистичное софт-ядро для Марсохода. 3 года 8 мес. назад #4916

При моделировании st16 с вашей программой на частоте 50 МГц
имею следующие результаты:

N=7 - 250 мкс;
N=9 - 2965 мкс;
N=11 - 49268 мкс;

Больше пока не ставил - слишком долго идет моделирование.
Может запущу на ночь.

Николай.
Спасибо сказали: Leka

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичное софт-ядро для Марсохода. 3 года 8 мес. назад #4917

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Этих результатов моделирования достаточно, экстраполяция дает оценку ~1.3 сек для N=13.
Мое старое 32х-разрядное ядро считало ~2сек.
N=13..14, это для проверки в железе. Потом можно будет согласовать обмен железки с ПК, скорее всего uart.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Минималистичное софт-ядро для Марсохода. 3 года 8 мес. назад #4918

Ту же программу запустил на моделирование со своим 32-х разрядным процессором up732l на частоте 50 МГц.

Результаты такие:

N=7 - 158 мкс;
N=9 - 1848 мкс;
N=11 - 30580 мкс;

Николай.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Минималистичное софт-ядро для Марсохода. 3 года 8 мес. назад #4919

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Надо бы проверить... Можно на ПК добавить 2 счетчика, и посмотреть:
...
while(pos){
  if(poss){
    cnt1++;
    ...
  }else{
    cnt2++;
    ...
  }
}
...
N=11 ---> cnt1~~cnt2~~90000
Это означает, что для грубой оценки времени выполнения весь код внутри while можно считать линейным (ветвь ++cnt выполняется редко), состоящим из K числа команд, и выполняющимся ~90000 раз для N=11.
Если команды считать однотактными, то время выполнения будет: T~~90000*K/F,
или можно оценить число эквивалентных команд: K~~T*F/90000.
30600мксек*50МГц/90000=17 эквивалентных команд... Что-то очень мало, по asm их д/б больше.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.
Время создания страницы: 0.218 секунд

ВКонтакте  facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Forum Наш форум Проекты пользователей Минималистичное софт-ядро для Марсохода.