Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
// https://jaycarlson.net/2019/09/06/whats-up-with-these-3-cent-microcontrollers/
// The C code I used for those original MCU tests looked something like this:
volatile int16_t in[25];
volatile int16_t out[25];
const int16_t a0 = 16384;
const int16_t a1 = -32768;
const int16_t a2 = 16384;
const int16_t b1 = -25576;
const int16_t b2 = 10508;
int16_t z1, z2;
int16_t outTemp;
int16_t inTemp;
void main()
{
while(1) {
_pa = 2;
for(i=0;i<25;i++)
{
inTemp = in[i];
outTemp = inTemp * a0 + z1;
z1 = inTemp * a1 + z2 - b1 * outTemp;
z2 = inTemp * a2 - b2 * outTemp;
out[i] = outTemp;
}
_pa = 0;
}
}
// The Padauk code looks like this:
WORD in[11];
WORD out[11];
WORD z1, z2;
WORD pOut, pIn; // these are pointers, but aren't typed as such
int i;
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/2 // SYSCLK=IHRC/2
PAC.6 = 1; // make PA6 an output
while(1) {
PA.6 = 1;
pOut = out;
pIn = in;
i = 0;
do {
*pOut = (*pIn << 14) + z1;
z1 = -(*pIn << 15) + z2
+ (*pOut << 14)
+ (*pOut << 13)
+ (*pOut << 9)
+ (*pOut << 8)
+ (*pOut << 7)
+ (*pOut << 6)
+ (*pOut << 5)
+ (*pOut << 3);
z2 = (*pIn << 14)
- (*pOut << 13)
- (*pOut << 11)
- (*pOut << 8)
- (*pOut << 3)
- (*pOut << 2);
i++;
pOut++;
pIn++;
} while(i < 11);
PA.6 = 0;
}
}
> As for the filter function itself, you’ll see that all the multiplies have been replaced with shift-adds. The Padauk part does not recognize the * operator for multiplication; trying to use it to multiply two variables together results in a syntax error. No, I’m not joking.
I discovered this while working on my SPI-to-WS2812 converter. When I first need a for() loop, I wrote:
int i = 7;
while(i >= 0) {
...
i--;
}
This works, but it’s not nearly as cycle-efficient as using one of Padauk’s handy macros:
.FOR i, <7,6,5,4,3,2,1,0>
...
.ENDM
When the compiler encounters these macros, it does a source-level replacement of “i” in the content of the block with each value — copying-and-pasting the entire block.
You’ll get a compilation error if you try to write a line of code like this:
int b = *(ptr + i);
Why? Because your MCU does not have the ability to do indirect addressing with offsets (constant or otherwise). The compiler wants you to tell it precisely what you want to do. Maybe you want to do this:
ptr += i; // wipes out the old value of ptr, but it's fast
int b = *ptr;
Or maybe this:
int newPtr = ptr + i; // uses a new memory allocation and is slower
int b = *newPtr;
Тебе это может быть важно на очень дохлых микроконтроллерах, где мало памяти и нет косвенной адресации. Это нахер не надо на более человеческих процессорах/контроллерах, где не надо каждый байтик и такт процессора дрочить и есть косвенная адресация
Ты серьезно сейчас? Как это относится к ЯВУ вообще? Задача копулятора для какой-то там платформы состоит в том, чтобы высрать трехадресный кот с прямой адресацией или что там поддерживается на этой платформе, а не отвергать валидное выражение. Поехавшие эмбеддеры превращают Цє в какойто сраный приколоченный гвоздями к платформе трубо пассаль...
Если так беспокоит предварительная оптимизация, то можно хинт высрать по этому поводу.
> Поехавшие эмбеддеры превращают Цє в какойто сраный приколоченный гвоздями к платформе трубо пассаль...
Та херня, которая описывается в той статье https://jaycarlson.net/2019/09/06/whats-up-with-these-3-cent-microcontrollers/ это вообще не Си, а какая-то ебанутай поебень, похожая чем-то на Си. Там например даже цикла for нет
Читаешь-нечитаешь, игнорируй-неигнорируй, хрен ли ты вообще указываешь мне? Захочу - буду хоть со стертором пиздеть. Я совершенно не слежу за тем, кто тут уебок, а кто нет
Я думаю что стертору глубоко насрать на то, пиздит или не пиздит с ним кто-либо. Даже если отсюда сьебут вообще все кроме него, стертор будет пиздеть сам с собой с разных аккаунтов
Мне лень тратить время на выяснение того, достоин ли кто-то того, чтоб я ему что-то отвечал. Да и написал он по теме, а не какой-то бред типа "рашка говняшка русичи пидорашки".
У пидорашек кругом враги. В СССР власть считала, что антисоветчиком может быть либо шпион либо безумец. Поскольку не может же нормальный советский человек быть против советской власти и не понимать, что учение Маркса всесильно, потому что оно верно.
В путинской России нет никакой идеологии как внятного образа будущего, но есть идея, что "Россия – это Путин, а Путин – это Россия". Поэтому в 20-му году своего существования путинизм пришел к старой советской формуле: кто против Путина, тот либо на госдеп работает, либо с ума сошел.
Там говно начинается с самого начала, когда они прислали на халяву, но объебали со стоимостью доставки, как китайцы на стероидах.
> I noticed that Padauk’s “Mini C” compiler didn’t support function arguments, return values, for() loops, and many other common C expressions, I became really nervous
Хах, причем еще и проприетарное.
Циклы и switch можно вообще все убрать, оставив только метки, goto и if. При желании все эти циклы и switch реализовать через какое-нибудь макроговно можно
This works, but it’s not nearly as cycle-efficient as using one of Padauk’s handy macros:
When the compiler encounters these macros, it does a source-level replacement of “i” in the content of the block with each value — copying-and-pasting the entire block.
Царский анролл
Why? Because your MCU does not have the ability to do indirect addressing with offsets (constant or otherwise). The compiler wants you to tell it precisely what you want to do. Maybe you want to do this:
Or maybe this:
Both of these have trade-offs.
Именно поэтому я за ассемблер
Если так беспокоит предварительная оптимизация, то можно хинт высрать по этому поводу.
Та херня, которая описывается в той статье https://jaycarlson.net/2019/09/06/whats-up-with-these-3-cent-microcontrollers/ это вообще не Си, а какая-то ебанутай поебень, похожая чем-то на Си. Там например даже цикла for нет
Серьезно, не корми, пожалуйста
Ахах!
ПОРА УЕЖАТ
https://otzovik.com/reviews/modem_zxv10_h108l/
В СССР власть считала, что антисоветчиком может быть либо шпион либо безумец. Поскольку не может же нормальный советский человек быть против советской власти и не понимать, что учение Маркса всесильно, потому что оно верно.
В путинской России нет никакой идеологии как внятного образа будущего, но есть идея, что "Россия – это Путин, а Путин – это Россия". Поэтому в 20-му году своего существования путинизм пришел к старой советской формуле: кто против Путина, тот либо на госдеп работает, либо с ума сошел.
Кстати, есть слух, что пригожин сдох
https://censoru.net/uploads/posts/2019-10/1570996995_44bed50be1a79a12e5a98570a56ad c14.jpg
не отвечай ему
> I noticed that Padauk’s “Mini C” compiler didn’t support function arguments, return values, for() loops, and many other common C expressions, I became really nervous
Хах, причем еще и проприетарное.
В общем, finicky to implement
Открытие дороги после ремонта в Уд-Муртии. Хуйло, сало, 2019.
Кстати, в масме вроде были и ифы и циклы и все это через макросы