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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 m8 {+ _+ F/ ?* e+ z) E  |9 W

9 \# ~; I! t2 b9 S( a$ X% VOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: A5 U1 X$ s* t3 L0 E0 T, b5 Z#include <unistd.h>
3 }/ G$ x6 ]: L2 e! T' p#include <sys/mman.h>
* \/ s2 t0 ]$ E9 m& g! q) o#include <sys/types.h>
' F* I/ b! Z. S) k1 k; U#include <fcntl.h>2 W' Z, Y# ~( I" X1 G

8 W! |4 M1 _, Y9 W9 |  h0 E#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 y' v; g% {3 r
( j2 ~( z+ _% P3 o' \3 Ytypedef struct
0 g( }. b, U' ]) o. g, I{$ M3 M  X  r7 o7 B- F
        unsigned int a;" z. F4 Q( R  s$ ~# s" D+ L7 ?: ~1 ?
        unsigned int b;
# S4 T3 ^: L5 o& k' R' W6 X        unsigned int packet_cout;
' |# [. o( F+ q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  m1 v, C  w$ f" I
; a! d, d  W& N  K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" i' M6 ?  J! Y/ R
unsigned int count_copy = 0;+ m1 v- q7 g! P) n
! X; |3 r  \$ w/ d

6 S* Z: J! r( Dint main()
1 k% c, M- m0 }" o{
- e  r. E) F9 ?7 Z% b9 R        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 f3 D1 W* O3 ^/ r6 ~4 L* ~( {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 d! d: a0 ]- Q6 c0 ?, |% k. D# P/ \

. J; [: Q) i* u5 l        while(1)
% Y8 w. ]- A* p% [; z# ^        {
# j- \6 D9 {2 E9 @8 q- z                read_MSG_buffer(pshreRAM);
' B$ q9 f6 H# W" w6 K. }        }                * d  X2 u% M4 J8 R
}. M! c; v+ |, G* [6 D$ U- |! Q
0 I- G& ?+ J6 q8 I# I- f% e7 U6 Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ [7 L! f- q+ @- e6 B2 u& g+ d8 n{
0 [0 |* j! L* \- ]; M+ }& L* H        RX_MSG_PROTOCOL buf;: ^: Q+ M; U4 H1 o+ U$ z7 z1 D  W
        
; h2 q) W: D3 K& H, i        buf.a = pshreRAM->a;
' T; B7 E' R8 Q' D7 S7 H* k6 P/ z        buf.b = pshreRAM->b;
$ b( Q- v) O  l0 p& |  O' p        buf.packet_cout = pshreRAM->packet_cout;
8 k2 E! ?6 m( V8 h& C( u        
9 U7 T  j  S3 @- n, k. P        if(buf.packet_cout != count_copy)
5 e0 h, |! N) N' ~1 V        {, E3 _( @/ P1 v0 O) h! k) ~
                printf("a is %d\n", buf.a);
9 q2 `) `; m6 A* O8 S                printf("b is %d\n", buf.b);9 q& p; V+ P: @6 X$ a
                printf("count is %d\n", buf.packet_cout);
. }$ T" C# d' Q/ F- H                count_copy = buf.packet_cout;
* ^; ]6 i+ k7 C/ F3 Y" A        }% ]3 u8 c: ?% b
        else
8 s3 ^" u2 B) A& `) ~' {        {' d' c. x8 |* x: a$ a) x/ U
                printf("No effective message!");
$ z6 q4 Y6 J( f* a/ Q6 N8 R" \0 J! y        }
0 x3 s2 M" H% l$ @}6 f$ |- g4 X) v# l" E6 u! e
8 f. y' f0 i: y$ y
  L- y, F, A3 }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* b( [) r4 _1 J& g8 ], Z
使用下面代码,对内存使用了mmap函数后:
9 r& u. a! T1 _8 X* X5 B#include <stdio.h>0 b; ^/ n, Q% Q9 ^
#include <unistd.h>  Z3 e, r% [2 F: E) X
#include <sys/mman.h>
. M1 E1 q7 [4 ~$ h#include <sys/types.h>+ h% `, T. `3 r! W" ^+ J
#include <fcntl.h>( C/ e% g& k7 u8 V
5 I5 b9 e; i  r: X
#define SHAER_RAM_BASE_ADDR    (0x80000000)
: B- B2 A9 N9 t' C; a! ]- e#define SHAER_RAM_SIZE         (0x20000)   9 G" }: A5 f; z; ~1 q

" S5 m8 O7 t8 O7 K! ftypedef struct0 V- h& j/ o! O3 D/ H  P' ~
{
- h8 f8 v# V( f7 J" _        unsigned int a;
4 w3 c9 r3 e6 N! Q        unsigned int b;
% m' C/ P1 U: S- W+ Q        unsigned int packet_cout;0 T, V. `) ~3 f, s, Q: r: F  N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 _$ m% S8 U, t! ^2 e' b  Y

5 V; U4 r) f, N* f2 G, S7 t  t! Mvoid read_MSG_buffer(int *baseaddr);- H  \! x1 w" c. C
unsigned int count_copy = 0;8 R3 g! J1 q1 U- Z0 `0 J
# l( m( V  F. E# K- s
int main()
( `- u5 f+ S) v  }) ?3 V9 `' V1 O* B{
* y! y* R' b0 i6 e2 f, t9 E# H        int fd;
7 K, q1 \! D1 v; Z0 z/ B$ Y        int *mem = NULL;  M! s3 K/ d  X, S" U: J
' ?8 h6 s/ k2 G6 L6 {! Y
        if((fd = open("/dev/mem", O_RDWR)) <0), c; {; P7 l+ F2 n: T4 }
        {
1 ^' X) W& Q0 A* ^" [; N4 z                perror("open error");# O# z& _0 [0 f0 _8 ^% F7 N! Q- B
                return -1;5 D8 Y# j8 J+ G8 f: E0 t6 w8 t
        }
# Y0 B. c! F3 ~! G4 j& {/ T" r5 [        
, W, S- D: u! u0 M2 j. [5 e2 g$ X5 b        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 D- t: ^/ d  U' X* t6 I

6 o6 i1 \; e) L1 c0 S  r. T! R, b1 J! A        while(1)9 N/ j" E; h4 C: y( {
        {8 @- L7 p. D6 j' g* f! p
                read_MSG_buffer(mem);
; \, n4 a$ V# Q& t& S8 s  G        }                  E/ u( T9 `! x& ~/ a; i" f% b
}: u/ w/ @# W, T- b: Q! |

; q. V2 p: e: b( Y4 nvoid read_MSG_buffer(int *baseaddr)
5 W/ ^" B5 e9 @4 o+ l{1 N. b4 b' O! {/ k
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 h9 g3 v* s7 e' s

  _+ W* \7 e, j  q8 R        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: I" w8 c% a9 S" P8 v6 `$ E
' h. W3 A8 ?$ M% m9 ^9 D7 Q& s" q0 ^
        if(pshreRAM->packet_cout != count_copy)
, r& R* f: P1 k: i; M+ c2 {5 r9 Z        {9 R; E/ a* \4 z* v0 Q) h
                printf("a is %d\n", pshreRAM->a);* h# S0 Y! q2 A' E8 l/ c6 j
                printf("b is %d\n", pshreRAM->b);( u' g0 C: H& L- _( z; h1 F, V
                printf("count is %d\n", pshreRAM->packet_cout);
7 f+ Q' @  W7 B- X* j% w; x, R1 w                count_copy = pshreRAM->packet_cout;, W5 W" O# k/ y# @# Q! b
        }
0 g0 }  n+ E2 h+ V5 v+ B9 u* L' h( ^        else
. h8 [2 d: a3 G5 s4 B6 ]$ Z        {
4 V$ Z5 y4 j6 D' S& Y& `; y  f                printf("No effective message!\n");9 B" V7 O- o1 H7 h* ^8 H
        }
: b7 _. K3 C% z4 [& }) N}! a5 X" Q8 p+ H5 y7 N9 ~2 x

+ d7 P: R2 [( _- H1 E* z' e. o  u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! `) P* p# @5 e1 r% Y. o

) r. A' C1 @) B' E5 P5 ^* I; _& k

  X! J# Z7 R7 n$ f
7 `4 t9 S8 d, G% c7 E8 j8 T8 N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-12 20:40 , Processed in 0.039582 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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