The purpose of Hungarian Notation is to encode information into the identifier that cannot otherwise be encoded in the type system. My own opinion is that if this information is important enough to be encoded, then it's important enough to be encoded in the type system, where it can be properly checked. And if the information is not important, then why the heck do you want to clutter up your source code with it?
Or, to put it more succintly: type information belongs in the type system. (Note: it doesn't have to be a static type system. As long as it catches the type errors, I don't care when it catches them.)
A couple of other answers mentioned Units of Measure as acceptable uses of Hungarian Notation. (I'm kind of surprised that noone mentioned the NASA Mars Climate Orbiter yet, since that seems to come up all the time in discussions about Hungarian Notation).
Here's a simple example in F#:
[<Measure>] type m
[<Measure>] type ft
let someLength = 48.15<m>
let someOtherLength = 16.2342<ft>
someLength + someOtherLength
// someLength + someOtherLength
// -------------^^^^^^^^^^^^^^^
// error FS0001: The unit of measure 'ft' does not match the unit of measure 'm'.
Look, Ma, no Hungarians!
If I were to use Hungarian Notation instead of types here, that wouldn't help me one bit:
let mSomeLength = 48.15
let ftSomeOtherLength = 16.2342
mSomeLength + ftSomeOtherLength
// > val it : float = 64.3842
The compiler let it straight through. I am now relying on a human to spot what is essentially a type error. Isn't that what a type checker is for?
Even better, using the Frink programming language:
someLength = 48.15m
someOtherLength = 16.2342ft
someLength + someOtherLength
// 53.09818416 m (length)
// Wanna know the answer in a good old fashioned American unit?
someLength + someOtherLength -> yd
// 58.06888031496062992
// Are you an astrophysicist?
someLength + someOtherLength -> parsec
// 1.7207949554318336148e-15
// ... or a fundmentalist Christian who refuses to use units invented
// less than 2000 years ago?
someLength + someOtherLength -> biblicalcubits
// 95.893563822870765006
So, in summary: I don't like Hungarian Notation. You should never use it.
That being said, I think using Hungarian Notation is a good idea. Wait, what?
Yes! In this particular case, you mentioned:
Furthermore, most of our code has to run on some weirdo DSPs, where a concept like bool or float doesn't exist anyway
But that is precisely the only sensible use case for Hungarian Notation!
PS: I wholeheartedly recommend looking at Frink. Its manual contains some of the most awesome fart jokes ever. It's also a pretty cool language :-)