Fixing timer isr iwram macro

This commit is contained in:
Rodrigo Alfonso 2025-02-04 21:23:49 -03:00
parent c1e1a167c4
commit 8e17f9a1a2
2 changed files with 92 additions and 69 deletions

View File

@ -114,21 +114,6 @@
// #define LINK_WIRELESS_ENABLE_NESTED_IRQ
#endif
// --- LINK_WIRELESS_PUT_ISR_IN_IWRAM knobs ---
#ifndef LINK_WIRELESS_PUT_ISR_IN_IWRAM_SERIAL
#define LINK_WIRELESS_PUT_ISR_IN_IWRAM_SERIAL 1
#endif
#ifndef LINK_WIRELESS_PUT_ISR_IN_IWRAM_TIMER
#define LINK_WIRELESS_PUT_ISR_IN_IWRAM_TIMER 0
#endif
#ifndef LINK_WIRELESS_PUT_ISR_IN_IWRAM_SERIAL_LEVEL
#define LINK_WIRELESS_PUT_ISR_IN_IWRAM_SERIAL_LEVEL "-Ofast"
#endif
#ifndef LINK_WIRELESS_PUT_ISR_IN_IWRAM_TIMER_LEVEL
#define LINK_WIRELESS_PUT_ISR_IN_IWRAM_TIMER_LEVEL "-Ofast"
#endif
// ---
LINK_VERSION_TAG LINK_WIRELESS_VERSION = "vLinkWireless/v8.0.0";
#define LINK_WIRELESS_MAX_PLAYERS LINK_RAW_WIRELESS_MAX_PLAYERS
@ -148,6 +133,36 @@ LINK_VERSION_TAG LINK_WIRELESS_VERSION = "vLinkWireless/v8.0.0";
if (!reset()) \
return false;
// --- LINK_WIRELESS_PUT_ISR_IN_IWRAM knobs ---
#ifndef LINK_WIRELESS_PUT_ISR_IN_IWRAM_SERIAL
#define LINK_WIRELESS_PUT_ISR_IN_IWRAM_SERIAL 1
#endif
#ifndef LINK_WIRELESS_PUT_ISR_IN_IWRAM_TIMER
#define LINK_WIRELESS_PUT_ISR_IN_IWRAM_TIMER 0
#endif
#ifndef LINK_WIRELESS_PUT_ISR_IN_IWRAM_SERIAL_LEVEL
#define LINK_WIRELESS_PUT_ISR_IN_IWRAM_SERIAL_LEVEL "-Ofast"
#endif
#ifndef LINK_WIRELESS_PUT_ISR_IN_IWRAM_TIMER_LEVEL
#define LINK_WIRELESS_PUT_ISR_IN_IWRAM_TIMER_LEVEL "-Ofast"
#endif
#ifdef LINK_WIRELESS_PUT_ISR_IN_IWRAM
#if LINK_WIRELESS_PUT_ISR_IN_IWRAM_SERIAL == 1
#define LINK_WIRELESS_SERIAL_ISR LINK_INLINE
#else
#define LINK_WIRELESS_SERIAL_ISR
#endif
#if LINK_WIRELESS_PUT_ISR_IN_IWRAM_TIMER == 1
#define LINK_WIRELESS_TIMER_ISR LINK_INLINE
#else
#define LINK_WIRELESS_TIMER_ISR
#endif
#else
#define LINK_WIRELESS_SERIAL_ISR
#define LINK_WIRELESS_TIMER_ISR
#endif
// ---
/**
* @brief A high level driver for the GBA Wireless Adapter.
*/
@ -1149,7 +1164,7 @@ class LinkWireless {
}
}
void checkConnectionsOrTransferData() { // (irq only)
LINK_WIRELESS_TIMER_ISR void checkConnectionsOrTransferData() { // (irq only)
if (linkRawWireless.getState() == State::SERVING &&
!sessionState.signalLevelCalled) {
// SignalLevel (start)
@ -1170,7 +1185,7 @@ class LinkWireless {
}
}
void sendPendingData() { // (irq only)
LINK_WIRELESS_TIMER_ISR void sendPendingData() { // (irq only)
copyOutgoingState();
setDataFromOutgoingMessages();
@ -1178,9 +1193,9 @@ class LinkWireless {
clearInflightMessagesIfNeeded();
}
void setDataFromOutgoingMessages() { // (irq only)
addAsyncData(0, true); // SendData header (filled later)
addAsyncData(0); // Transfer header (filled later)
LINK_WIRELESS_TIMER_ISR void setDataFromOutgoingMessages() { // (irq only)
addAsyncData(0, true); // SendData header (filled later)
addAsyncData(0); // Transfer header (filled later)
bool isServer = linkRawWireless.getState() == State::SERVING;
u32 maxPacketIds = isServer ? MAX_PACKET_IDS_SERVER : MAX_PACKET_IDS_CLIENT;
@ -1270,11 +1285,12 @@ class LinkWireless {
nextAsyncCommandData[0] = linkRawWireless.getSendDataHeaderFor(bytes);
}
u32 buildTransferHeader(bool isServer,
u32 firstPacketId,
u32 firstMsg,
u32 msgCount,
bool highPart) {
LINK_WIRELESS_TIMER_ISR u32
buildTransferHeader(bool isServer,
u32 firstPacketId,
u32 firstMsg,
u32 msgCount,
bool highPart) { // (irq only)
TransferHeader transferHeader = {};
// player count / client heartbeat
@ -1319,7 +1335,7 @@ class LinkWireless {
return packer.asInt;
}
void clearInflightMessagesIfNeeded() { // (irq only)
LINK_WIRELESS_TIMER_ISR void clearInflightMessagesIfNeeded() { // (irq only)
if (config.retransmission)
return;
@ -1336,7 +1352,7 @@ class LinkWireless {
sessionState.inflightCount = 0;
}
LINK_INLINE void addIncomingMessagesFromData(
LINK_WIRELESS_SERIAL_ISR void addIncomingMessagesFromData(
const CommandResult* result) { // (irq only)
// parse ReceiveData header
u32 sentBytes[LINK_WIRELESS_MAX_PLAYERS] = {0, 0, 0, 0, 0};
@ -1459,11 +1475,12 @@ class LinkWireless {
copyIncomingState();
}
LINK_INLINE void processMessage(u32 playerId,
u32 data,
u32& currentPacketId,
u32& playerBitMap,
int& playerBitMapCount) { // (irq only)
LINK_WIRELESS_SERIAL_ISR void processMessage(
u32 playerId,
u32 data,
u32& currentPacketId,
u32& playerBitMap,
int& playerBitMapCount) { // (irq only)
// store the packet ID and increment (msgs are consecutive inside transfers)
u32 packetId = currentPacketId;
currentPacketId =
@ -1524,7 +1541,8 @@ class LinkWireless {
forwardMessage(message);
}
LINK_INLINE void forwardMessage(Message& message) { // (irq only)
LINK_WIRELESS_SERIAL_ISR void forwardMessage(
Message& message) { // (irq only)
Message forwardedMessage;
forwardedMessage.data = message.data;
forwardedMessage.playerId = message.playerId;
@ -1535,12 +1553,14 @@ class LinkWireless {
sessionState.outgoingMessages.overflow = true;
}
LINK_INLINE void removeConfirmedMessagesFromServer() { // (irq only)
LINK_WIRELESS_SERIAL_ISR void
removeConfirmedMessagesFromServer() { // (irq only)
removeConfirmedMessages(sessionState.lastACKFromServer,
MAX_PACKET_IDS_CLIENT, MAX_INFLIGHT_PACKETS_CLIENT);
}
LINK_INLINE void removeConfirmedMessagesFromClients() { // (irq only)
LINK_WIRELESS_SERIAL_ISR void
removeConfirmedMessagesFromClients() { // (irq only)
u32 ringMinAck = 0xFFFFFFFF;
for (u32 i = 1; i < linkRawWireless.sessionState.playerCount; i++) {
u32 ack = sessionState.lastACKFromClients[i];
@ -1571,7 +1591,7 @@ class LinkWireless {
MAX_INFLIGHT_PACKETS_SERVER);
}
LINK_INLINE void removeConfirmedMessages(
LINK_WIRELESS_SERIAL_ISR void removeConfirmedMessages(
u32 ack,
const u32 maxPacketIds,
const u32 maxInflightPackets) { // (irq only)
@ -1596,6 +1616,34 @@ class LinkWireless {
}
}
LINK_WIRELESS_TIMER_ISR u32 getDeviceTransferLength() { // (irq only)
return linkRawWireless.getState() == State::SERVING
? LINK_WIRELESS_MAX_SERVER_TRANSFER_LENGTH
: LINK_WIRELESS_MAX_CLIENT_TRANSFER_LENGTH;
}
LINK_WIRELESS_TIMER_ISR void copyOutgoingState() { // (irq only)
if (sessionState.newOutgoingMessages.isWriting())
return;
while (!sessionState.newOutgoingMessages.isEmpty() &&
!sessionState.outgoingMessages.isFull()) {
auto message = sessionState.newOutgoingMessages.pop();
sessionState.outgoingMessages.push(message);
}
}
LINK_WIRELESS_SERIAL_ISR void copyIncomingState() { // (irq only)
if (sessionState.incomingMessages.isReading())
return;
while (!sessionState.newIncomingMessages.isEmpty() &&
!sessionState.incomingMessages.isFull()) {
auto message = sessionState.newIncomingMessages.pop();
sessionState.incomingMessages.push(message);
}
}
bool checkRemoteTimeouts() { // (irq only)
bool isServer = linkRawWireless.getState() == State::SERVING;
u32 startPlayerId = isServer ? 1 : 0;
@ -1613,55 +1661,30 @@ class LinkWireless {
return true;
}
u32 getDeviceTransferLength() { // (irq only)
return linkRawWireless.getState() == State::SERVING
? LINK_WIRELESS_MAX_SERVER_TRANSFER_LENGTH
: LINK_WIRELESS_MAX_CLIENT_TRANSFER_LENGTH;
}
void copyOutgoingState() { // (irq only)
if (sessionState.newOutgoingMessages.isWriting())
return;
while (!sessionState.newOutgoingMessages.isEmpty() &&
!sessionState.outgoingMessages.isFull()) {
auto message = sessionState.newOutgoingMessages.pop();
sessionState.outgoingMessages.push(message);
}
}
LINK_INLINE void copyIncomingState() { // (irq only)
if (sessionState.incomingMessages.isReading())
return;
while (!sessionState.newIncomingMessages.isEmpty() &&
!sessionState.incomingMessages.isFull()) {
auto message = sessionState.newIncomingMessages.pop();
sessionState.incomingMessages.push(message);
}
}
u32 newPacketId(u32 maxPacketIds) { // irq only
LINK_INLINE u32 newPacketId(u32 maxPacketIds) { // (irq only)
return (sessionState.lastPacketId =
(sessionState.lastPacketId + 1) % maxPacketIds);
}
void addToLastAsyncDataHalfword(u16 value) { // (irq only)
LINK_INLINE void addToLastAsyncDataHalfword(u16 value) { // (irq only)
addToAsyncDataShifted(nextAsyncCommandDataSize - 1, value, 16);
}
void addToAsyncDataShifted(u32 index, u16 value, u32 shift) { // (irq only)
LINK_INLINE void addToAsyncDataShifted(u32 index,
u16 value,
u32 shift) { // (irq only)
nextAsyncCommandData[index] |= value << shift;
}
void addAsyncData(u32 value, bool start = false) { // (irq only)
LINK_INLINE void addAsyncData(u32 value, bool start = false) { // (irq only)
if (start)
nextAsyncCommandDataSize = 0;
nextAsyncCommandData[nextAsyncCommandDataSize] = value;
nextAsyncCommandDataSize++;
}
bool sendCommandAsync(u8 type, bool withData = false) { // (irq only)
bool sendCommandAsync(u8 type,
bool withData = false) { // (irq only)
if (isSendingSyncCommand)
return false;