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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# f4 q; j; S  _" t: O$ ]0 Q* |0 }0 |' E2 D- `( Y9 s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ b' f' ^1 x, t
#include <unistd.h>* |' u) G7 ~1 a6 Y% {% T; I
#include <sys/mman.h>
4 m( O, u5 t0 _2 N" L#include <sys/types.h>  ]& Y% x# x( ?6 z$ a0 Q' f0 g( x
#include <fcntl.h>- ^1 W6 Z- E% n2 g

' A( \# z% j, Y9 ]#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% h) p1 H% X9 J( z% D
  q% j/ g; d' s' Ptypedef struct6 O$ P+ J% R2 e6 P* X. r
{3 }3 N0 R6 O* x1 n  e, M
        unsigned int a;
  c9 l+ k) `/ Y+ v. k        unsigned int b;  d* b) @  s& n6 x( k8 s% I
        unsigned int packet_cout;, D9 A) l6 B/ `* m3 w# X1 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 N& P$ C% Z+ X6 T% m; P; l

& r3 Z3 F, V; a: c& X4 U- C5 ^6 `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ |9 W$ T' I- F, u7 t% o. a
unsigned int count_copy = 0;
" ^7 A% [* e4 H$ a6 M* i9 E. w8 Z5 e6 ~; {* D

5 X& T* g6 w- _. S) jint main()" e  o8 o3 z/ R9 L, ]4 b: ^
{( S7 R2 J: M) `' f
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ Y( ]  a3 H& V  M
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  J3 f: Q- J. p( `" W
" `! o7 H. c7 y8 a  g0 I4 f$ Q        while(1)
7 m" u; l7 U0 R) ^8 t; h        {$ J6 k7 B- H' d( g: B
                read_MSG_buffer(pshreRAM);
' v" Y  y/ G# v: N  C+ y' S        }               
: M& j& W7 t9 n% `}% {" U; {# K+ [6 ]6 H
$ Z! q. r$ |& k4 p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" C. z2 d% M* @( N{
" x4 ^# e8 t4 I8 [; r% s7 W# m        RX_MSG_PROTOCOL buf;
+ l2 x* j5 A# ?3 C" N+ W        
5 w7 F' T, i6 f% t8 R) \5 p        buf.a = pshreRAM->a;! L3 l1 H! E: `$ M/ w9 |- _
        buf.b = pshreRAM->b;- c2 f* k/ F% C6 Q' O; f7 N6 T
        buf.packet_cout = pshreRAM->packet_cout;5 x& k0 s7 \5 j+ e/ C+ {9 _
        , ~& \( n  N5 d5 P6 j8 ?" y
        if(buf.packet_cout != count_copy)
. j- o- v! v: n  b' {+ L        {
# ~, Q, W! h* r1 Q1 \# ~; x                printf("a is %d\n", buf.a);! z5 O, I# v2 P8 `) @
                printf("b is %d\n", buf.b);
! E2 O$ w5 k1 }' y                printf("count is %d\n", buf.packet_cout);
8 P. h( `: o9 a$ Z3 R4 c: U4 R                count_copy = buf.packet_cout;
. U- G* ~% R/ G- W. V: X        }
+ u: g! {! |! I, c        else
8 V3 g# i$ q4 e( X; o        {
! u- c& H! J" [6 G                printf("No effective message!");
6 j5 \: q" ^2 a7 E. M        }
/ G- ]6 n9 Z2 [7 W2 [4 \, u& e1 s}
4 e% x+ _3 m& a; x
: v9 q! e) J' m: P; S. a9 q; _; L4 O4 t
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* L5 j/ Q. p$ n3 l- _) ]使用下面代码,对内存使用了mmap函数后:
" H7 j3 w2 W7 k6 }2 v# m8 r#include <stdio.h>
2 _, o0 o7 ^, C, [5 w#include <unistd.h>
6 w/ U! p2 a' S6 z# v6 \+ }#include <sys/mman.h>
9 x" B" q$ Z( s/ I. k/ k) L% ^# E0 _#include <sys/types.h>
9 o& @5 m4 `1 y& c#include <fcntl.h>. w" g* U9 ?4 ^
4 M4 U' Y; K5 M6 l- @
#define SHAER_RAM_BASE_ADDR    (0x80000000)2 P% b! o* y# H' U. E
#define SHAER_RAM_SIZE         (0x20000)   . y. n, v, }& A8 y
! {; _# C( r4 G, }# `6 v3 k  T! R7 Q
typedef struct
7 E* n# h3 [3 i: k" u{
6 ^7 H  V' P6 f2 _        unsigned int a;
! y7 u* \+ I, l  c        unsigned int b;
& O8 i, A, A) t  p+ g0 r& {        unsigned int packet_cout;0 o/ B( y5 ], B/ E! |4 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 d- \1 r. v0 O- [! c: ^* x$ a
4 k) t. n* y2 `- K5 N! Y/ m, Kvoid read_MSG_buffer(int *baseaddr);; b/ P5 q# B0 l/ f: p, q. @. P
unsigned int count_copy = 0;8 ^! H9 ]' k& X, R3 J- i; a% ^8 K

. X/ C' C; ~: V( S1 i( tint main()
% T7 |" q; `$ I7 ^+ w{
' b8 z" n7 w8 R- D' R1 K/ {        int fd;4 a+ C/ ^1 y6 Q* r8 [! u+ p  I
        int *mem = NULL;8 L: d) c8 M- E* o4 B* }" S7 b

, ]/ X* y7 q& H- T7 f- x        if((fd = open("/dev/mem", O_RDWR)) <0)/ F  v$ ^' h8 Y
        {3 [# U; n3 R: O4 ?9 D5 v" W
                perror("open error");
2 x/ B: D& {' p6 Z+ {                return -1;
0 h1 q' ^9 ~* |        }
, e. u: n( H) B+ [$ M- [        ( k/ t1 i. @! ]. M
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  Y0 R  Q8 S8 X! _: s
' p+ y4 ~; R, b' k$ |- r5 A. q        while(1)- M, X4 O0 W. n9 }& k' S
        {% F. a- M8 ^0 V6 W0 {
                read_MSG_buffer(mem);( a! G* C  {" o2 R/ O) b. k
        }               
0 c* n1 L% }% D- H}7 Y( r" P8 j# z
0 X; t4 W4 d4 p9 F
void read_MSG_buffer(int *baseaddr)
% R. Z5 O- O7 i/ c& _+ w{
6 t4 Y7 m" S- @6 L4 `        pRX_MSG_PROTOCOL pshreRAM = NULL;1 N4 ^7 B' c; Y. J9 X

4 f  S/ ^3 [' g        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 P% i, F, T8 a" |: n! ~- g4 _

) K& u+ X* ~% c; C. y1 P        if(pshreRAM->packet_cout != count_copy)
+ ~. k  r" C- h6 o" x6 p& }        {1 m$ U+ ~7 C5 b, s2 a/ j4 a* ?
                printf("a is %d\n", pshreRAM->a);
# O* G4 J$ x: {( k                printf("b is %d\n", pshreRAM->b);
/ e# P* e) E+ ^" `0 A                printf("count is %d\n", pshreRAM->packet_cout);
0 Z. I6 W! x) d; e$ O' a  R( F/ I                count_copy = pshreRAM->packet_cout;4 B" L) p1 H- H" u0 }* M9 M3 \
        }0 t2 ^0 Z% M2 Z7 E
        else
& j& c! ^5 ~6 H- t$ P        {
3 [3 {2 ^2 I  g' e/ y( n9 x& R                printf("No effective message!\n");5 r% ?* p/ v0 N& Z" ?0 @
        }5 E, u8 o7 x- x* B
}
- S) e5 B. f/ Y$ W
" \( j" W2 m# V* y2 G7 \没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 E% Z; i: U; q& K& O
: X# r6 o: r* v1 C( [' B. f1 {0 o
9 I9 D$ E* P+ c% S. A! ^& i
1 h$ ]# v/ @& b

! m+ B' e/ d! ~8 ]! s- Z8 }/ ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-7 09:28 , Processed in 0.037509 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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