Цитата(boroda1983 @ Jul 10 2008, 09:45)

Успехов Вам в этом нелегком деле. Красоту кода, созданного индускими программистами я ощутал сполна, при работе с библиотеками Bluelab. С учетом того, что чипы CSR занимают 50% рынка, становится страшновато. Пример кода из библиотеки для работы с батарейкой.
Здравствуйте boroda1983. Почему может не срабатывать сообщение типа MESSAGE_MORE_DATA при передачи текста в порт UART микроконтроллера BC417?Подозреваю, что нужно сконфигурировать источник.
Пример кода который демонстрирует управляемую передачу в потоке, так сказать UART эхо.
Код
#include <panic.h>
#include <stdio.h>
#include <stream.h>
#include <pio.h>
#include <source.h>
#include <string.h>
#include <sink.h>
#include <csrtypes.h>
#include <connection.h>
#include <message.h>
#define VM_UART_(RATE) (uint16)((RATE*0.004096)+0.5)
#define VM_UART_RATE_1K2 0x0005
#define VM_UART_RATE_1K2 0x0005
#define VM_UART_RATE_2K4 0x000a
#define VM_UART_RATE_4K8 0x0014
#define VM_UART_RATE_76K8 0x013b
#define VM_UART_RATE_1843K2 0x1d7e
#define VM_UART_RATE_2764K8 0x2c3d
#define LED1 0x01 /* bit 1 */
#define DELAY1 200 /* ms */
#define LED2 0x02 /* bit 2 */
#define DELAY2 100 /* ms */
static void led_controller1( Task t, MessageId id, Message payload )
{
PioSet( LED1, (PioGet() ^ LED1) );
MessageSendLater( t, 0, 0, DELAY1 );
}
static void led_controller2( Task t, MessageId id, Message payload )
{
Source source= StreamUartSource();
uint16 length = SourceSize (source);
if(MESSAGE_MORE_DATA==id )
{
char *string;
uint16 offset;
uint8 *dest;
Sink sink=StreamUartSink();
PanicNull(sink);
string=(char *)SourceMap(source);
/* Claim space in the sink, getting the offset to it */
offset = SinkClaim(sink, length);
if(offset == 0xFFFF) Panic(); /* Space not available */
/* Map the sink into memory space */
dest = SinkMap(sink);
(void) PanicNull(dest);
/* Copy the string into the claimed space */
memcpy(dest+offset,SourceMap (source), length);
/* Flush the data out to the uart */
PanicZero(SinkFlush(sink, length));
SourceDrop (source, length);
}
PioSet( LED2, (PioGet() ^ LED2) );
MessageSendLater( t, 0, 0, DELAY2 );
MessageHostCommsTask(t);
MessagePioTask(t);
MessageSystemTask(t);
}
static TaskData taskSPP1 ={led_controller1};
static TaskData taskSPP2 = {led_controller2};
int main(void)
{
PioSetDir(0xFF, 0xFF); /* Set all PIO to be output */
PioSet(0xFF, 0); /* Set all PIO off (0) */
MessageHostCommsTask(&taskSPP2);
MessagePioTask(&taskSPP2);
MessageSystemTask(&taskSPP2);
MessageSend( &taskSPP1, 0 , 0 );
MessageSend( &taskSPP2, 0 , 0 );
MessageLoop();
return 0;
}