OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5274|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & k! N" G$ }/ Z
2 i' a- n3 U7 Z8 z' Y. D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 H% r$ v8 z- @, P. a
#include <unistd.h>
) }# C+ p* |$ E4 f#include <sys/mman.h>
) x$ D# }2 J2 R/ z1 m#include <sys/types.h>9 i) \! o+ M1 I! R% Y5 V
#include <fcntl.h>  r) d6 X! v" e$ \9 Y8 N
: ^0 X- s! R: Z9 n% G2 w- {
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ J& _) h' J  M/ Z6 c) o
( w" a. b( J3 L3 I6 Z: Etypedef struct
- s  e' R  c& ^, h" r8 f% R{
) k8 j2 L, [' L4 f8 K8 b. e0 `        unsigned int a;
: g0 D' ~" p' \" A        unsigned int b;
7 I1 N  Q* _6 v% ]2 ^        unsigned int packet_cout;
2 h' l3 l5 c1 w, M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% A; y  |% e7 ?) v, s! y; e# v. y" ~. o& f1 J3 i) w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: p/ l9 {  X* f, b
unsigned int count_copy = 0;
# L3 y" ?- B; T9 S8 K3 v
  B9 v* s( h1 W2 H( l, l7 ?
$ y3 b# F/ s8 qint main()  T$ s6 ?2 h& ~+ }( s' W% a
{7 p% l5 U# T: O2 Q; v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ k. U) m+ c4 D' m0 Y3 |* c        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ O4 p) A& P& k+ J% l' I+ R. Y2 R, Q$ m: h
        while(1)
9 M  Q* r! g9 D+ x& [1 y5 e        {9 h. P1 H* O5 Q2 e- g
                read_MSG_buffer(pshreRAM);
3 J% m; M' ]3 ?  D; ^        }               
- s) `  S( }0 d' ?0 w7 L3 I}& m! e. I* ^# q

5 ?! L, a. L$ l8 S- h/ rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 ]# ]# k; N: T$ T4 g' x5 d{8 L$ b& Y1 F+ Q6 L8 g
        RX_MSG_PROTOCOL buf;9 q5 Y: t) R  r, @2 {* u
        
5 J" P% j  h2 o* f% ^/ e        buf.a = pshreRAM->a;
- d( S! D# |* {& J$ X& x/ N        buf.b = pshreRAM->b;
0 [/ ~" s4 Y' p8 k1 ]/ @        buf.packet_cout = pshreRAM->packet_cout;
2 b. I+ h7 I: [2 l        ) W3 p) x% @! e& m/ D) Y
        if(buf.packet_cout != count_copy)
9 x' P) d9 R5 D% q! _        {
7 H* Y8 z! [' x; H7 I. E                printf("a is %d\n", buf.a);3 p' c1 P+ I# o4 \
                printf("b is %d\n", buf.b);# Z- {& W' A& [5 \: d
                printf("count is %d\n", buf.packet_cout);
+ \5 I7 @9 r7 T% ^% o                count_copy = buf.packet_cout;' _( Q# S6 h+ `( f
        }
8 z" Z) n' w7 R        else8 o& L  N; u% n8 Z2 E- S
        {; }: \3 B* h/ i. `" Y/ c- N8 h
                printf("No effective message!");( k2 d9 v. F2 t2 M
        }3 c  a* \' }6 M; C, R
}, D9 Q  ^( {0 m' `. q% [
: w9 o6 |7 e% O3 u
& x: h* d# |# Q2 F9 T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' ], B" K6 ^3 J% J
使用下面代码,对内存使用了mmap函数后:5 p- o3 e) j: w8 q3 I9 t
#include <stdio.h>  h5 o6 E7 E( Z! N2 D& j) _
#include <unistd.h>1 C# H! I' B; a) B0 W# Q& `9 D
#include <sys/mman.h>
; b9 j  J) i6 _  _, z#include <sys/types.h>' D- J: q2 l- a1 g5 K
#include <fcntl.h>6 d6 i9 y, E1 `; w2 |: E
! E! u* C; H# M, c) p
#define SHAER_RAM_BASE_ADDR    (0x80000000)( j1 l+ w) u/ f$ n2 ~# z9 u
#define SHAER_RAM_SIZE         (0x20000)   / Z1 ?8 C! w1 F1 i: ?- I

! k6 I8 `# z; v; t7 B' {+ X/ h/ Ftypedef struct
5 }! j9 D# ]2 b) f1 {  s7 Q4 r; p7 [1 O{$ d* I8 q! P0 _* e
        unsigned int a;0 m- n4 g4 T  V, I, d- X# X( I
        unsigned int b;
: u/ S( ]0 N# i  M+ ?. H) E        unsigned int packet_cout;3 u5 o9 j$ N+ m4 J7 f; `; S9 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 P, G8 q$ u" v* s2 u% g* ^% g* r, B  |8 \/ }$ M# f) e
void read_MSG_buffer(int *baseaddr);
% Y" j; N6 w( l/ m2 {3 U) {unsigned int count_copy = 0;
' J# }1 M1 }9 r6 h
' @" @% `' J( [; @int main()
2 Q; z" N! b  M2 Q% l) t% s{
) s9 {% b" X" `3 c        int fd;. n* G6 j" Q& L' C
        int *mem = NULL;
" N" [8 k% ~* w- _) X% R
: e" |: m! A, ?. m% T/ o, _        if((fd = open("/dev/mem", O_RDWR)) <0)( G  i0 S7 i8 j0 s3 M
        {
; C. t+ G- N7 \+ N$ o5 c                perror("open error");) s0 m) E9 Z; f3 y/ t
                return -1;* F5 n0 v9 g) s6 t6 N+ i0 M) ~6 j
        }
6 i. c  R! C# q        
" n; X, e" h2 @; ~9 P) }        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# S7 \! _2 E4 \. X6 N: |; }3 z! N, h5 g' u! A4 }5 b6 v
        while(1)
0 }3 W) W% g' Q9 Y: r* H        {
- J7 R. j8 ]7 V7 t2 b. A                read_MSG_buffer(mem);) L8 U- K; {5 U0 o- K
        }                $ K9 q1 e$ q$ G$ ?9 ]4 l5 j2 p
}
) N% U* Q/ f5 B: G6 j& @# U7 W
; Z# P5 _) Z+ Y) Z/ ^2 jvoid read_MSG_buffer(int *baseaddr)
/ {9 \5 u( ^' J6 E{
+ g0 w$ ]7 O- ]- U$ {! ?        pRX_MSG_PROTOCOL pshreRAM = NULL;( t; V; d( `1 j* R% \) l
8 k3 B) }: w8 u# s4 J! p. l8 v5 u
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% [  B, U/ x- A3 c. t* w" H% r5 \
* O; v4 d0 W2 ~
        if(pshreRAM->packet_cout != count_copy)4 u7 R) a. A6 T* d. B
        {; |( ~# S- s1 B- n/ m1 ^4 m; B: n  q
                printf("a is %d\n", pshreRAM->a);
" `: C9 v5 I2 m                printf("b is %d\n", pshreRAM->b);
! ?4 I6 A( b- V- ~+ T" {8 w; {                printf("count is %d\n", pshreRAM->packet_cout);$ i7 n0 }- f4 w4 @5 y; G
                count_copy = pshreRAM->packet_cout;
7 C$ @, V- O2 M' n! f; z        }
+ u/ F, Y1 z4 `. m. y( ^  l        else  |0 H5 U- c8 \# c9 ]
        {9 ]/ ~! G8 k: J! T
                printf("No effective message!\n");- N# z: I  [( v2 j( \
        }0 f0 M2 I- C: b
}
% k6 y0 ^* p/ {3 h/ Q
2 {% ^( C4 z* q2 d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ J% z) i% o* O6 q; E
* j1 t" ~- M, a; s6 x( b

+ o& p5 \2 C# L" h- T/ X2 o  N, L2 O3 R; c5 g
) o. d; c; f) m* C- B$ C9 `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-8 21:18 , Processed in 0.043214 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表