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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % H( J( D7 V$ |0 \# x) m

) A3 }) d" E# s2 N# M$ j; gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" [% I0 {: T; x% S" V8 k, T
#include <unistd.h>1 L( t5 g) B1 T. P7 _" S3 }, k3 y
#include <sys/mman.h>
  C; O- O2 N9 u5 b$ c  O#include <sys/types.h>+ G* {/ H* r5 w8 k/ c* u0 j
#include <fcntl.h>
! V7 u8 L! B- ~) ?& k
) Y- c: [  l, O/ J4 V#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) M; t2 P. T/ D! X* c4 y) C7 n% O& [1 M: p2 T
typedef struct
+ D+ m4 ~6 R* f% R% p0 B' a6 w{4 ^8 c  @" r2 R! n% R9 E
        unsigned int a;
  P& ?0 |$ z2 [        unsigned int b;
  ~" U7 N+ N4 L$ y5 a) u        unsigned int packet_cout;
+ j' u6 D7 F/ x  ?$ Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" b. B  R* x, z& q: a
7 L* o5 {) R8 x/ \  gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ `& v+ G0 v8 _5 l% t6 Q) N& `unsigned int count_copy = 0;
+ D# G# a/ i# Y( x) r( g+ Q. l' L/ x- u+ L

/ l$ x, T/ i+ gint main()
. M8 ~/ K2 S; z4 A- Z+ j; s2 I, G# w{
; R9 q) x! N( t$ E5 W9 }8 E        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 U, R/ i7 R% p7 R8 `! Q1 a( T        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 m  T3 G" |8 I
  ^! }" t# C/ d4 Q! C& z, d        while(1)
7 q, {" F2 |, i6 x; M4 E0 j        {5 P9 `  i0 L+ o4 Y. A) Z$ c
                read_MSG_buffer(pshreRAM);
( P$ m; f/ [6 \- p' \1 J1 b        }                  U0 m  F; f; m$ k' b
}
1 r# g# p  X- n, f. k( k: O9 E
' f: s  g7 \4 p2 t  D0 v) Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* b- _- a, }, P; \$ r; r
{' ^' k1 D9 p7 e/ r% F0 v2 H
        RX_MSG_PROTOCOL buf;' P& u- k% v( \% \
        
& w, [2 q: w" m4 y- N& h: ]& i        buf.a = pshreRAM->a;
$ |4 G4 C4 k$ f( h* Z        buf.b = pshreRAM->b;
( o! Y0 ?* @8 A3 }. f* r6 u        buf.packet_cout = pshreRAM->packet_cout;# M& b" f- _& ?
        
# ]$ p6 {" \! L4 J8 K  O        if(buf.packet_cout != count_copy)
( K: I7 u9 m, ]        {3 h9 @; [$ i. V4 p) w
                printf("a is %d\n", buf.a);& _: B; }% s  G; ]* S
                printf("b is %d\n", buf.b);: T: F& }* A! o5 E
                printf("count is %d\n", buf.packet_cout);
3 _" H" N6 Y5 z, E4 h2 i. [                count_copy = buf.packet_cout;, D8 Y8 E/ _+ t) K% L/ F/ v
        }6 _' o  P# n: C$ q" F
        else, l% h* k7 U6 m1 d8 k/ q
        {
) ^# N) q/ R1 J2 X" L( i                printf("No effective message!");4 m+ H& {  E3 e5 k  l  O+ J1 r
        }
7 S9 N! e, |6 u$ M: a  u, `' f0 ~& s+ K}7 b% v8 `* ~% Y3 m
3 Z% \- j) N; X  w( U/ V) a
5 o7 Z* S4 @4 a% A5 O( F" k  g. `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ I- f$ y3 m# g. s使用下面代码,对内存使用了mmap函数后:
5 Y3 Y. Z) z+ ^% b1 e0 k) t1 \, n#include <stdio.h>2 G9 D; _8 B: c8 _7 t) D7 R, g
#include <unistd.h>" c+ H1 z0 A% Z9 Z& n
#include <sys/mman.h>
% B9 X& a2 G, i% N, U- J! f1 ^#include <sys/types.h>% ?0 p5 g6 M1 Y0 P
#include <fcntl.h>- h$ q: w1 b( m# J
9 J; a) b5 S3 V) r" P8 x3 S& z4 {: H# k
#define SHAER_RAM_BASE_ADDR    (0x80000000)
, O9 ~: ~  I6 B#define SHAER_RAM_SIZE         (0x20000)   . _. |5 q5 C2 R- d! Z
1 p+ n& A8 X& {
typedef struct, w( {% C2 c1 Y# X7 j$ J1 z% \# H
{
) |) v1 U+ t# y( j7 E+ C- M6 O+ v        unsigned int a;
9 p4 ^" m! ~+ ^" M/ i* [        unsigned int b;% \, z( W4 W) B. y: ^
        unsigned int packet_cout;$ u; d1 \! N$ v7 I; x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 M" |. E. `4 c1 v$ X- n
- H( _1 K4 j! \( @3 e3 _void read_MSG_buffer(int *baseaddr);
5 \* e$ Q" D6 ^, \8 T* M% Junsigned int count_copy = 0;: F* O4 V0 O$ ?: n" q

$ Y7 k8 e1 T" F- q. c1 k8 xint main()
- B5 g4 Y# [  ^: ]8 N7 {1 E  ^+ l{
6 ]3 i8 t6 U' C& ~        int fd;
9 Q7 ~; V8 m2 }3 }/ U# k        int *mem = NULL;! Y0 |% V) Q) w/ u

) v& S0 R! X! f# p7 m        if((fd = open("/dev/mem", O_RDWR)) <0). L2 X& }3 G6 w
        {
7 U. H! g# H2 Q8 u1 y- H/ h1 x% f                perror("open error");
  m, n( O# C4 `% h                return -1;
! g4 ~4 ?6 U- r$ I' |& V& H        }
# X2 x% r+ i* ^, ?: \  I        0 x4 E3 H+ e& F* u& U
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 {9 c5 K8 f. q2 }+ c

9 K4 a$ `: |& K! Y3 X3 c        while(1)
8 }' l2 k3 i+ F* M1 O( e        {+ {3 I! v' f6 O) G. N( s* {4 @
                read_MSG_buffer(mem);
4 \8 s6 N" F  B        }                6 Z/ {5 u1 m+ j
}+ g/ i$ R; K. l1 n9 @$ U/ P; D
2 B3 ^5 Z$ v% L5 c2 z
void read_MSG_buffer(int *baseaddr)
8 L# z8 B, w- K( w  s{
. \+ M* T( o; x3 X  w        pRX_MSG_PROTOCOL pshreRAM = NULL;* ^. C/ ]5 c: e  T/ r

; Z( _7 w7 q  I        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& G- q; h7 i' w

$ e+ V/ ]7 m& g3 `1 z/ ^* a        if(pshreRAM->packet_cout != count_copy)
/ \; v) y5 X: O) p% |0 R+ C        {% K1 p/ h. Y; Y0 B- I
                printf("a is %d\n", pshreRAM->a);, Q: b$ j: ~" H0 A" |9 \. f
                printf("b is %d\n", pshreRAM->b);
0 `2 Y6 E8 }0 u7 Z8 N                printf("count is %d\n", pshreRAM->packet_cout);
, i, o( q! W$ `' I) Y8 @! f4 [. e                count_copy = pshreRAM->packet_cout;
; _% U" Y4 ~9 B7 f  q        }& ?6 ?9 J9 V$ @- m
        else+ |, y2 O- \7 I
        {
5 l. L8 ^3 x' b                printf("No effective message!\n");
5 s6 S4 k7 o& e4 }1 d! Z        }) O+ G5 m3 R9 h7 F+ q8 N
}
6 X$ g# K- \6 |+ m
) G  A  ]: @$ R7 P* u" [/ s没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% B2 Y: [) M! u; S: a% q) f

7 H) w9 u2 V6 g
9 b$ r  T1 u3 d. b* [
$ E4 V* U. \! [% k9 i+ O
7 b" S* x' x* n( I$ P$ P5 J& g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 12:11 , Processed in 0.040700 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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