hello all! *.h void Baudrate(unsigned int *ptr,unsigned char Uart_num) large; *.c void main(void) { ... *ptr = 1152; Baudrate(ptr,1); ... } In the routine ,the var Baud( Baud = *ptr; )is not 1152 but 0x00.When changing the defintion : void Baudrate(unsigned int pp,unsigned char Uart_num) large;,and be called : Baudrate(1152,1);,the routine run well. What is the wrong?
Please distill this down to a complete, self-contained, compilable example case. Nobody can diagnose what's going wrong from a loose collection of snippets ripped from their context like the one you've decided to show, so far. For starters, your 'ptr' currently points nowhere. That's bad. Furthermore the observed behaviour could easily happen if the source file containing your 'main' didn't actually #include the header containing the prototype for Baudrate(), or if the prototype were #ifdef'ed out of sight, or if the actual definition of Baudrate (in some other .c file?) didn't agree with the prototype declaration.
As Hans says, ptr in main() is uninitialized. It could point anywhere, including an address where there is no RAM to store a value. Odds are, a garbage pointer happens to point to zero. Perhaps the ellipsis hides the initialization. There's no real reason to pass by reference in this case. Stylistically, I'd write U16 GetBaudRate (U8 uartNumber); This will also lead to smaller and faster code, particularly compared to using the 3-byte generic pointer to pass a 2-byte int. The "large" qualifier on the function makes me wonder. If this keyword changes the default pointer type for the parameter, and the caller is using a different memory model, the parameter might be confused without an explicit cast. But I'm feeling too lazy to test this hypothesis right now.