Size: a a a

2017 December 15

AS

Andrew Strokov in embedded.rs
пустой цикл
источник

AS

Andrew Strokov in embedded.rs
на 1 или 2 он умножает, на другие числа — нет
источник

AS

Andrew Strokov in embedded.rs
О_О
источник

AS

Alexey Shmalko in embedded.rs
Посмотри асм. Он мог оптимизировать в другую операцию или вообще убрать
источник

MC

Mikhail Cheshkov in embedded.rs
ты дебаг компилишь?
источник

AS

Andrew Strokov in embedded.rs
ну и вопросы
источник

MC

Mikhail Cheshkov in embedded.rs
ну ёпт
источник

AS

Andrew Strokov in embedded.rs
щас позырю
источник

MC

Mikhail Cheshkov in embedded.rs
ты --release пишешь?
источник

AS

Andrew Strokov in embedded.rs
нет
источник

MC

Mikhail Cheshkov in embedded.rs
значит дебажная сборка
источник

AS

Andrew Strokov in embedded.rs
в cargo.tomp debug=true
источник

MC

Mikhail Cheshkov in embedded.rs
он запаникует при переполнении
источник

MC

Mikhail Cheshkov in embedded.rs
Взял такой код
fn f() {

   let mut adc_data: [u32;3] = [0;3];
   //unsafe{HAL_ADC_Start_DMA(adc, &mut adc_data[0], adc_data.len() as u32)};

   let Vref: i32 = 2800;
   let v_level_mV: i32 = (adc_data[0] as i32);
   let v_level_mV: i32 = v_level_mV * Vref;
   let v_level_mV: i32 = v_level_mV / 4096;
   let mut i_level_mA: i32 = ((adc_data[1] as i32) * Vref / 4096) / 1000;

}

fn main() {
   f();
}
источник

MC

Mikhail Cheshkov in embedded.rs
сунул в плейграунд
источник

MC

Mikhail Cheshkov in embedded.rs
выбрал Debug, Nightly, смотрю LLVM IR
источник

MC

Mikhail Cheshkov in embedded.rs
Вижу define internal void @_ZN10playground1f17hc844916d4c8e161fE() unnamed_addr #0 !dbg !5 {
В ней вижу
bb1:                                              ; preds = %start
 %2 = getelementptr inbounds [3 x i32], [3 x i32]* %adc_data, i64 0, i64 0, !dbg !24
 %3 = load i32, i32* %2, !dbg !24
 %4 = icmp ule i32 %3, -1, !dbg !24
 call void @llvm.assume(i1 %4), !dbg !24
 store i32 %3, i32* %v_level_mV, !dbg !24
 %5 = load i32, i32* %v_level_mV, !dbg !27
 %6 = load i32, i32* %Vref, !dbg !27
 %7 = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %5, i32 %6), !dbg !27
 %8 = extractvalue { i32, i1 } %7, 0, !dbg !27
 %9 = extractvalue { i32, i1 } %7, 1, !dbg !27
 %10 = call i1 @llvm.expect.i1(i1 %9, i1 false), !dbg !27
 br i1 %10, label %panic, label %bb2, !dbg !27
источник

AS

Andrew Strokov in embedded.rs
да он не переполняется
источник

MC

Mikhail Cheshkov in embedded.rs
%7 это умножение с переполнением v_level_mV на Vref
источник

MC

Mikhail Cheshkov in embedded.rs
ну блин, там нет больше бранчей от умножения
источник