void task2_task(void *p_arg) { u8 task2_num=0; const unsigned char *point; u16 i=0; delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃÖжÏÓÅÏȼ¶·Ö×éΪ×é2£º2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ // uart_init(115200); //´®¿Ú³õʼ»¯Îª115200 LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú // KEY_Init(); //°´¼ü³õʼ»¯ AT24CXX_Init(); //IIC³õʼ»¯ OLED_init(); point= &picture_tab[0]; while(1) { OLED_ShowString(0,15,"2023/5/18",16); OLED_ShowChinese(0,0,0,16,1); OLED_ShowChinese(16,0,1,16,1); OLED_ShowChinese(32,0,2,16,1); delay_ms(1000); OLED_Refresh_Gram(); //¸üÐÂÏÔʾµ½OLED if(++i > 3) { LED1=!LED1;//ÌáʾϵͳÕýÔÚÔËÐÐ i=0; } }..\OBJ\uCOSIII-EP01.axf: error: L6047U: The size of this image (39012 bytes) exceeds the maximum allowed for this version of the linker这个错误具体怎么修改
时间: 2024-04-06 07:29:47 浏览: 115
这个错误是由于链接器限制了可执行文件的最大大小,而你的程序已经超出了这个限制。要解决这个问题,可以尝试以下几种方法:
1. 减小程序的代码和数据大小,去掉一些不必要的代码或数据。
2. 修改链接器的设置,增大可执行文件的最大大小。具体方法要根据你使用的开发工具和编译器来确定,可以参考相关文档或者搜索相关资料。
3. 如果你的程序确实很大,可以考虑使用动态链接库或者分离编译的方式,将程序分成多个模块,分别编译链接。这样可以减小单个可执行文件的大小,也方便程序的管理和维护。
具体的修改方法需要根据具体情况来确定,如果你需要更详细的帮助,请提供更多的信息和上下文。
相关问题
static void send_error(const ip_addr_t *addr, u16_t port, enum tftp_error code, const char *str) static void send_ack(u16_t blknum) static void resend_data(void) static void send_data(void) static void recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) static void tftp_tmr(void* arg) err_t tftp_init(const struct tftp_context *ctx) 我的tftp_server.c 只有这些函数,怎么根据这些加上freertos实现并发处理的tftp服务器
首先,您需要使用FreeRTOS中的任务来实现并发处理。您可以创建一个任务来处理TFTP请求,然后在任务中使用您的现有函数来实现TFTP服务器。
例如,您可以创建一个名为tftp_task的任务,该任务将在启动时创建一个UDP套接字,并在循环中等待接收来自客户端的TFTP请求。在接收到请求后,该任务将启动一个新的任务来处理该请求,并等待下一个请求。
以下是一个示例代码框架:
```
// TFTP task
void tftp_task(void *pvParameters)
{
struct udp_pcb *pcb;
// create UDP socket
pcb = udp_new();
// bind socket to port 69
udp_bind(pcb, IP_ADDR_ANY, 69);
while(1)
{
struct pbuf *p;
ip_addr_t addr;
u16_t port;
// wait for incoming packet
p = udp_recv(pcb, recv, NULL);
// get client address and port
addr = *(ip_addr_t *)p->payload;
port = *((u16_t *)p->payload + 2);
// create new task to handle request
xTaskCreate(tftp_request_task, "tftp_request_task", configMINIMAL_STACK_SIZE, (void *)&addr, tskIDLE_PRIORITY + 1, NULL);
// free packet buffer
pbuf_free(p);
}
}
// TFTP request task
void tftp_request_task(void *pvParameters)
{
ip_addr_t *addr = (ip_addr_t *)pvParameters;
// handle TFTP request using existing functions
// e.g. send_error(), send_ack(), send_data(), etc.
// use mutex/semaphore to synchronize access to shared resources
// e.g. file system, memory, etc.
}
// TFTP timer task
void tftp_tmr_task(void *pvParameters)
{
while(1)
{
// handle TFTP timer events using existing tftp_tmr() function
tftp_tmr(NULL);
// delay for 100ms
vTaskDelay(pdMS_TO_TICKS(100));
}
}
// TFTP server initialization
err_t tftp_init(const struct tftp_context *ctx)
{
// create TFTP task
xTaskCreate(tftp_task, "tftp_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
// create TFTP timer task
xTaskCreate(tftp_tmr_task, "tftp_tmr_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 2, NULL);
return ERR_OK;
}
```
请注意,上述代码框架仅供参考,您需要根据自己的实际情况进行调整和修改。
在处理TFTP请求时,请确保使用互斥锁或信号量来同步访问共享资源,例如文件系统或内存。这可以防止多个任务同时访问同一资源而导致数据损坏或不一致。
同时,请注意在处理TFTP请求时要处理错误情况,例如超时、丢失的数据包、非法请求等。这可以通过调用send_error()函数来实现。
void task2_task(void *p_arg) { int val=0; u8 task2_num=0; OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; while(1) { task2_num++; //ÈÎÎñ2Ö´ÐдÎÊý¼Ó1 ×¢Òâtask1_num2¼Óµ½255µÄʱºò»áÇåÁ㣡£¡ LED2=~LED2; for(val=0;val<=100;val++) { TIM_SetCompare2(TIM2,val); delay_ms(10); } for(val=0;val<=100;val++) { TIM_SetCompare2(TIM2,100-val); delay_ms(10); } printf("ÈÎÎñ2ÒѾִÐУº%d´Î\r\n",task2_num); OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //ÑÓʱ1s } }这段代码有个错误请修改
在这段代码中,delay_ms()函数的具体实现未知,可能会导致任务阻塞。建议使用OS延时函数OSTimeDlyHMSM()代替delay_ms()函数来进行延时。
修改后的代码如下:
```c
void task2_task(void *p_arg) {
int val = 0;
u8 task2_num = 0;
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
while(1) {
task2_num++;
LED2 = ~LED2;
for(val = 0; val <= 100; val++) {
TIM_SetCompare2(TIM2, val);
OSTimeDlyHMSM(0, 0, 0, 10, OS_OPT_TIME_HMSM_STRICT, &err); // 使用 OS 延时函数代替 delay_ms 函数
}
for(val = 0; val <= 100; val++) {
TIM_SetCompare2(TIM2, 100 - val);
OSTimeDlyHMSM(0, 0, 0, 10, OS_OPT_TIME_HMSM_STRICT, &err); // 使用 OS 延时函数代替 delay_ms 函数
}
printf("ÈÎÎñ2ÒѾִÐУº%d´Î\r\n", task2_num);
OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_HMSM_STRICT, &err);
}
}
```
阅读全文