def add_task(self, tile_address, coroutine):
        """Add a task into the event loop.

        This is the main entry point for registering background tasks that are
        associated with a tile. The tasks are added to the EmulationLoop and
        the tile they are a part of is recorded.  When the tile is reset, all
        of its background tasks are canceled as part of the reset process.

        If you have a task that should not be associated with any tile, you
        may pass `None` for tile_address and the task will not be cancelled
        when any tile is reset.

        Args:
            tile_address (int): The address of the tile running
                the task.
            coroutine (coroutine): A coroutine that will be added
                to the event loop.
        """

        self._loop.call_soon_threadsafe(self._add_task, tile_address, coroutine)
Add a task into the event loop.

        This is the main entry point for registering background tasks that are
        associated with a tile. The tasks are added to the EmulationLoop and
        the tile they are a part of is recorded.  When the tile is reset, all
        of its background tasks are canceled as part of the reset process.

        If you have a task that should not be associated with any tile, you
        may pass `None` for tile_address and the task will not be cancelled
        when any tile is reset.

        Args:
            tile_address (int): The address of the tile running
                the task.
            coroutine (coroutine): A coroutine that will be added
                to the event loop.