Skip to content

Memory leaking in the Delay_ms module #138

Closed
@nesergen

Description

@nesergen

Good day!
Board: stm32f411
OS: Micropython v1.23.0
I have found that when I use the Delay_ms module the board memory always became smaller and smaller even If I collect the garbage regularly. This code shows such behavior:

async def todo_3():
	print('todo_3' )

async def todo_2():
	print('start todo_2')
	d = Delay_ms(todo_3, duration=1000)
	d.trigger()
	print('end todo_2')

async def main():
	for _ in range(10):
		print("\nStart main")
		print("mem_free = ", gc.mem_free())

		await todo_2()

		await uasyncio.sleep_ms(2000)
		gc.collect()

		print("END main")


uasyncio.run(main())

In result memory starts leaking after three cycles :

Start main
00:06:31.108 -> mem_free =  72144
00:06:31.108 -> start todo_2
00:06:31.141 -> end todo_2
00:06:32.133 -> todo_3
00:06:33.125 -> collected_free =  72144
00:06:33.125 -> END main
00:06:33.125 -> 
00:06:33.125 -> Start main
00:06:33.125 -> mem_free =  73808
00:06:33.125 -> start todo_2
00:06:33.125 -> end todo_2
00:06:34.150 -> todo_3
00:06:35.143 -> collected_free =  73808
00:06:35.143 -> END main
00:06:35.143 -> 
00:06:35.143 -> Start main
00:06:35.143 -> mem_free =  73088
00:06:35.143 -> start todo_2
00:06:35.143 -> end todo_2
00:06:36.135 -> todo_3
00:06:37.127 -> collected_free =  73088
00:06:37.127 -> END main
00:06:37.127 -> 
00:06:37.127 -> Start main
00:06:37.160 -> mem_free =  72336
00:06:37.160 -> start todo_2
00:06:37.160 -> end todo_2
00:06:38.153 -> todo_3
00:06:39.145 -> collected_free =  72336
00:06:39.145 -> END main
00:06:39.145 -> 
00:06:39.145 -> Start main
00:06:39.145 -> mem_free =  71616
00:06:39.145 -> start todo_2
00:06:39.145 -> end todo_2
00:06:40.137 -> todo_3
00:06:41.162 -> collected_free =  71616
00:06:41.162 -> END main
00:06:41.162 -> 
00:06:41.162 -> Start main
00:06:41.162 -> mem_free =  70864
00:06:41.162 -> start todo_2
00:06:41.162 -> end todo_2
00:06:42.154 -> todo_3
00:06:43.147 -> collected_free =  70864
00:06:43.147 -> END main
00:06:43.147 -> 
00:06:43.147 -> Start main
00:06:43.147 -> mem_free =  70144
00:06:43.147 -> start todo_2
00:06:43.147 -> end todo_2
00:06:44.172 -> todo_3
00:06:45.164 -> collected_free =  70144
00:06:45.164 -> END main
00:06:45.164 -> 
00:06:45.164 -> Start main
00:06:45.164 -> mem_free =  69392
00:06:45.164 -> start todo_2
00:06:45.164 -> end todo_2
00:06:46.156 -> todo_3
00:06:47.181 -> collected_free =  69392
00:06:47.181 -> END main
00:06:47.181 -> 
00:06:47.181 -> Start main
00:06:47.181 -> mem_free =  68672
00:06:47.181 -> start todo_2
00:06:47.181 -> end todo_2
00:06:48.173 -> todo_3
00:06:49.166 -> collected_free =  68672
00:06:49.166 -> END main
00:06:49.166 -> 
00:06:49.166 -> Start main
00:06:49.166 -> mem_free =  67920
00:06:49.166 -> start todo_2
00:06:49.166 -> end todo_2
00:06:50.191 -> todo_3
00:06:51.183 -> collected_free =  67920
00:06:51.183 -> END main

In my real program I need to create an async task sometime that have to callback some function with time delay.

Then I tried the different approach and it works well:

def todo_2():
	print("todo_2 ")


async def schedule(callback, timer, *args, **kwargs):
	print("start schedul")
	await uasyncio.sleep(timer)
	callback(*args, **kwargs)


async def main():

	for _ in range(10):
		print("Start main")
		print("Free_mem = ",gc.mem_free())

		await uasyncio.create_task(schedule(todo_2, 1))
		await uasyncio.sleep(3)

		gc.collect()
		print("END main")

uasyncio.run(main())

Now I think, am I doing everything right with Delay_ms?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions