Memory access optimization through combined code scheduling, memory allocation, and array binding in embedded system design