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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' C5 R5 U6 ]4 ~

3 F. x3 c1 l% ]' ]% GOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- k; r- H% g$ L7 z#include <unistd.h>
% C% V' W4 }6 V+ D4 r# ]5 o#include <sys/mman.h>  P' e9 \; K* [( X
#include <sys/types.h>- O* K7 y1 ]1 O# i- Q$ ?+ f
#include <fcntl.h>/ U0 g7 e- F) \- s! s: H5 N
. ]( |; l. e, {/ n& z; t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 _2 ?- Z' B( A
- ?! H) Y4 m5 @/ Q  htypedef struct
3 J- y' a( e4 d' Y7 n6 J{7 P( m. |* Z0 c5 z3 l
        unsigned int a;
5 F9 L) b/ v$ z- u. q4 f        unsigned int b;
# M  J5 @1 c/ f1 G$ _        unsigned int packet_cout;
, K' W+ v1 r+ T) A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: g- p7 k& u' O! {2 g  Y; A, u( J( j) Y$ P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- B4 R, ]! E2 \7 c- P4 m3 Q
unsigned int count_copy = 0;
5 c3 c6 ?, C5 z" P& O7 e
3 n  M% u' D; s! h0 S$ C
* W; P& B/ L' X8 [$ }7 }int main()
) d9 X+ E- w+ e2 e+ o* q{
' @& Q; z& V. _5 T3 B        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 t/ r# ^% z' [9 b1 a& d" |        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 L' I# ~& I% T( T

3 o# C# c5 O" K% g. W* Y        while(1)
) M* e3 p1 _" K        {
1 w" u( L$ a1 E6 B1 Y                read_MSG_buffer(pshreRAM);9 ?9 T1 L( L4 j# P7 Q7 ?5 s
        }                * u: p$ S5 V, J7 o$ F
}
( k- l, Z8 w" \0 k8 D  {% R
- S) ?- P' j. L' {# i  nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. P! m' J. I7 p" |{
/ ], B) U) X6 E9 `+ A* {        RX_MSG_PROTOCOL buf;) J& Y: t- d. S$ _4 B
        - L' ~5 w% Z) d7 [
        buf.a = pshreRAM->a;" e% W1 Q3 N0 _8 V! m
        buf.b = pshreRAM->b;. P( t5 k+ J2 J+ \. W( [8 ^' h( M
        buf.packet_cout = pshreRAM->packet_cout;6 A, P4 d: c3 s' ]
        
2 G7 X+ d" ]% H* j6 D* B        if(buf.packet_cout != count_copy)
& I6 d( ?# W! D3 D' }- T        {2 ~! h! ^  P1 z, }  ]2 o7 C" a
                printf("a is %d\n", buf.a);9 i: y6 j  D7 `4 `- Y+ v& {# d
                printf("b is %d\n", buf.b);/ [2 ]0 ^, a& i6 i$ F2 x+ k) n
                printf("count is %d\n", buf.packet_cout);
2 a9 e5 }9 t  I0 Y6 O) W: {0 k                count_copy = buf.packet_cout;
* C6 l+ x5 l* M! N% H5 X6 W        }
7 R0 c+ D) y& c5 \        else
- ?6 s6 m' ?2 n/ a( P9 f0 ~        {$ b8 E8 z; _4 e
                printf("No effective message!");
& G4 m2 g3 Y" x3 W3 k, [        }
" I2 d$ y( Q" P, \- a}/ ?4 B( h5 |" P6 o7 F
7 F: \( a7 [' r. y
% C- p+ T, t, C0 p; Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 d2 Z7 Z9 g( `7 N' n  g使用下面代码,对内存使用了mmap函数后:
6 K! j5 `8 }7 m( U) H#include <stdio.h>7 R; |# U% ]% s  E* q* Q0 n6 X
#include <unistd.h>
. N3 U- E+ B: U4 q  l$ O3 S+ _* n! @#include <sys/mman.h>
7 Z% P- _; [# |1 @: I  P#include <sys/types.h>' b: S7 T7 V, }( v: k7 b9 m
#include <fcntl.h>
- w3 ]8 Q  W7 s9 W7 w( b5 Q9 c; }% y" c
#define SHAER_RAM_BASE_ADDR    (0x80000000)7 V& K' E: e7 s! {) I$ M" H
#define SHAER_RAM_SIZE         (0x20000)   
2 ?: |9 x# G5 z7 K% l
8 ^, o8 l8 `5 t  z: R5 ~5 `+ m& itypedef struct
9 Y5 m: v& c; D9 m5 O/ R{. _9 i8 E  L: s+ y( w6 q# B: p, D
        unsigned int a;, Q4 q7 j+ \; `0 ]( c. P- q
        unsigned int b;6 H+ _- T. [5 M! ]
        unsigned int packet_cout;0 @4 t2 T* G$ Y/ ]  A7 B1 w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ x! n, r% j& \  A0 b2 \
0 c0 Q# R  T  R/ ~, F  ]2 M; m% fvoid read_MSG_buffer(int *baseaddr);
; N" n/ _& C3 E7 W8 T5 w! Cunsigned int count_copy = 0;
+ g! D6 t/ x$ n
0 q+ P) c9 s+ @) }" Uint main()
0 F/ n! G1 X8 k# k9 B# W{
3 |2 n6 o  T. S4 i# D, k9 Z9 q        int fd;
" |3 m2 w) h/ M; w/ M0 M        int *mem = NULL;
) a5 b4 |8 ?- A: E; [- m% O! s3 S, l) Z2 ?) I/ q0 y* L
        if((fd = open("/dev/mem", O_RDWR)) <0)
) ^. v2 [+ V0 S$ J9 I/ G' U        {
7 g% F" e3 ?9 P                perror("open error");
! \: e& y7 P  q6 N3 i* V                return -1;, n( o# S6 q) ]3 q: ?/ w! Y% G) c
        }
* i1 f! W2 w: @3 m4 w- t7 \        % H* A6 J+ x" e8 G
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, S* P/ v/ u) f0 P2 z5 d7 R3 O3 u( `

' U. ?5 T4 C( o0 W1 S# \        while(1)
# U* I( r, Y' E5 ?3 E        {
% s8 Z# k! c; @0 k6 }' {                read_MSG_buffer(mem);
" n7 ~; S/ {6 I! d        }               
+ X8 l+ C  K3 X2 a! L}, o( R6 ?. v% f7 X8 R) D

( @4 a) V- ~& {9 M5 d' Qvoid read_MSG_buffer(int *baseaddr)
+ v( g% v  t; A5 A1 q, F8 _{
/ {1 d* t, u! N        pRX_MSG_PROTOCOL pshreRAM = NULL;
- G: A& w' F. @7 j* V. _5 E/ g* u5 p$ t/ d, o, `( l; l
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# L  p( q8 @+ w, b% V7 L3 o8 _8 n- _# {+ Y6 U/ g
        if(pshreRAM->packet_cout != count_copy)
! c( F; T+ q* r, a        {2 S) `5 K8 U2 j+ E- ~4 w, h, u
                printf("a is %d\n", pshreRAM->a);. T" u1 s1 C2 k# y1 F. O9 L
                printf("b is %d\n", pshreRAM->b);4 [4 ~+ p. P  t* D" ?" a
                printf("count is %d\n", pshreRAM->packet_cout);8 g0 E2 `. D- K+ ?2 r. w1 Y3 e
                count_copy = pshreRAM->packet_cout;9 [. F1 I. u* w- E. p8 n2 X1 b% L
        }
8 D9 w8 G; s6 Z! e) W" v0 P1 s        else3 P8 l0 D9 ]8 X& D
        {
2 b4 x6 E& I0 u  y                printf("No effective message!\n");& P9 C- Q" H5 J# j
        }
% Q% M5 |+ w! a) }) p}
$ f# P+ Z4 W3 [2 Y- A! Q' }' H: G/ Q' y# Z! u2 [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 d, K: r( U9 x& D
) a" v% Y* ]  q) Z. Y
' w$ ?4 S/ b. @& I" A) L, V4 i5 |5 Y1 x: h0 p: p- ^0 @. F
* H4 i2 p( }5 c* Z; A( z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-28 03:12 , Processed in 0.039869 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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