ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
851817
sladkoejka (29.06.2018 11:55 - 02.07.2018 18:42, просмотров: 94426)
IAR 8051 10.10.1 глючный компилятор (int и long типы, printf) для Cypress CY7C68013A Не могу понять в чём дело. Помогите. Пытаюсь скомпилировать тестовый пример для Cypress CY7C68013A. Поставил IAR 8051 10.10.1 (брал с официального сайта), создал пустой проект на си. Выбрал таржет CY7C68013A (впрочем без этого тоже самое). Code model: Near Data model: Small Все другие варианты Code model/Data model приводят к ошибкам отсутствия файла в либах либо вообще портят проект какими-то окнами про отустутствующие параметры командной строки для симулятора. В чём собственно проблемы: 1) попытка вывести какое-то число в printf приводит к кракозяблам, например printf("sizeof(int) = %i\r\n", sizeof(int)) выводит:
s$	eof(int) = 
Если убрать аргумент и выводить только текст, то печатает нормально. 2)Какие-то странные баги с типами long и int. Например вот код мигания светодиодами (PA0 и PA1): #include <stdbool.h> #include <stdio.h> #include <ioCY7C68013A.h> typedef unsigned int uint16_t; typedef signed int int16_t; void delay(uint16_t n) { for (uint16_t i=0; i < n; i++) asm("nop"); } void main() { SOEA = 0x03; //Enable Port A Pins: 0, 1 while (true) { IOA = 0x01; delay(10000); IOA = 0x02; delay(10000); IOA = 0x00; delay(10000); } } достаточно заменить в функции delay uint16_t на int16_t и один светодиод перестаёт мигать... Какой-то бред... как такое может быть? Дополнено, для тех кто тоже столкнётся с этим: 1) %i не работает, но printf поддерживает %d - это полный аналог %i 2) глюки и зависания по всей видимости связаны с autovector фичей. Компилятор помещает код в таблицу векторов и он там глючит (даже при отсутствии прерываний). По всей видимости ljmp в этой области обрабатывается как autovector и перход происходит на новую таблицу, которой нет. Вот тут я сделал костыли для обхода этой проблемы: http://caxapa.ru/852440.html