I can't answer all your questions, but here is how I would go about figuring out the answers:
* Try doing a printf() call in the handler function, but without referencing any variable. If that works but it fails with the uint_8 type, you know your issue is with the variable.
* Cast index_rx as an int when you call printf:
Code:
printf("%d", (int)index_rx);(
*The difference between statically declared variables and locally declared variables is that static variables are basically stored 'permanently' in memory, i.e. they persist even after your function has returned to its caller. Non-static variables are called local variables, and exist only on the stack while that particular instance of the function is running. When the function returns, that local variable is thrown away. So if you declare static int x and let x=5, and then return, next time your function is called, x will still be 5. Local variables don't do that.
It would seem weird to me that the compiler isn't letting you declare a local variable. There can be issues with stacks overwriting data, etc., but you should still be able to create local variables and use them, even in an interrupt handler. Can you confirm that the code will compile and run with the variable declared as static, but not without the static keyword?