OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , ]& Z: Q3 z0 [/ O. j
$ l% A) A2 s" q7 ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># O+ x$ s& O9 k2 p
#include <unistd.h>
& B. F3 s" Q6 Y% O! T5 }' }: b9 D#include <sys/mman.h>
( s* ~/ k% B0 N3 l#include <sys/types.h>
) j2 D/ ?) d) |6 n# `: w#include <fcntl.h>; w3 {, A5 q& q
% _' \1 M% |& g3 j4 f4 v& y" R: n
#define SHAER_RAM_BASE_ADDR    (0x80000000)   3 e. g$ z8 P# z# Z

, M7 V* @; F; N4 T/ M, Wtypedef struct
+ `  n, L+ Y+ O4 w- v+ O. ]{
0 Z7 Y* k& v6 K) B$ [, H6 A+ q) U        unsigned int a;
2 [8 Z+ G# n1 A9 n* t" o5 f. i$ U        unsigned int b;
9 Z+ b' P$ f, G6 a2 D  K  Q7 S        unsigned int packet_cout;$ E; n2 Z, {/ N+ A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( M6 f' L8 _1 a

, A; i) S" l! v& kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% _% q$ C- A7 E9 Iunsigned int count_copy = 0;8 Y) ^7 K* h/ v6 {4 l
- [: [5 n; x9 X

6 h' K0 ]) `* M4 _/ z$ Bint main()& Q% r, p, ]6 v% ^+ H! ~
{8 K+ B: {  X$ t' [7 c8 C' Z3 f8 g, u
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 W) p# i) ^# m' a5 N( ~+ S
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- B1 o5 \( a, N

, s4 G8 ^& n# o1 U( i        while(1)
3 T* o; V8 e1 x5 H9 O2 r* ]. q! M        {
% b, f5 x+ [# _! f3 C. M7 _" u- T                read_MSG_buffer(pshreRAM);
5 l- i% d* L7 b3 v" J4 }        }                ; W. I) T6 u4 r
}  }8 e2 q1 e: T/ q" _8 N6 ~2 e+ o

2 d/ `5 @) e" h' |! w' Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) o( i, f) V4 V5 L- W{3 w3 [! q4 q" i3 L6 N: O3 I1 R6 s+ J
        RX_MSG_PROTOCOL buf;
/ ?2 d0 L* w% [) m* l" d8 V        / m7 m/ i/ q9 o
        buf.a = pshreRAM->a;, {# f1 C. W  U2 }1 w0 [
        buf.b = pshreRAM->b;5 }$ O6 H% g1 M0 |4 t8 i" D
        buf.packet_cout = pshreRAM->packet_cout;/ [6 ?3 M- U# z. g' e' @7 n* ~
        
+ g; m$ p: G9 b9 F' G. c' e# t( d        if(buf.packet_cout != count_copy)
0 I% z. D1 \' w5 d5 h        {+ t. _! y( v' R+ U+ r( M" s
                printf("a is %d\n", buf.a);7 j: P) b/ x* z0 j/ }  A7 |+ @+ Z8 a
                printf("b is %d\n", buf.b);) ?% e! V2 ~  V* @" j$ q/ [  a
                printf("count is %d\n", buf.packet_cout);2 I$ z0 k# B! L0 ?' \+ F9 P
                count_copy = buf.packet_cout;
. w0 O5 j+ Z# G8 R6 U+ I        }
  `! f& T9 N, T# D' X" Y2 ]& |        else& V' I( ~5 J8 c
        {# Y% V' s4 R- C2 a
                printf("No effective message!");
' i& t! r( w9 L7 a$ r  i        }
+ ]6 P4 X) R9 y% T}2 @+ ^) K/ n- \9 r4 }
" T8 x6 G; \/ k! U& I, S$ ^. l2 F9 I1 n

/ u2 q& Y. J* v2 p) g但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  Z- b3 I# s: `8 K3 \
使用下面代码,对内存使用了mmap函数后:. ?, P  m& o* H! F% l
#include <stdio.h>5 c( T8 X! f$ t; ]; s
#include <unistd.h>7 P1 f) ~$ s% h% n" q* U7 a
#include <sys/mman.h>% u% @& `6 W& G; @; }( b
#include <sys/types.h>
; X& `1 R  f4 O: }$ k#include <fcntl.h>, V/ V& G- ]5 ^8 _
* _* z0 z0 ~  b5 w& u" A
#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 ]6 ^' q( l* |0 F% M% {! M4 y#define SHAER_RAM_SIZE         (0x20000)   
) L7 x/ y$ R* V) L0 Z
, U. G: ^9 N5 v, T& {8 k1 i$ l4 [5 itypedef struct: Q  p$ ~5 B; x5 S8 ]+ \6 `
{
; ^  U; _# l. l: ?* P        unsigned int a;" Z( T. w) C+ h; l
        unsigned int b;: w6 l+ O. i  d2 m3 H. _
        unsigned int packet_cout;3 v" u2 V  l) `" I8 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- B, U% Y8 k8 o! B# c0 ~; Y$ o" I% E/ b# i
void read_MSG_buffer(int *baseaddr);
- m0 C7 n' t/ Z2 _unsigned int count_copy = 0;
8 q) }0 u1 G" ]2 x% B. [; N) S
/ i+ J2 m: ?+ L6 ^2 Rint main()  l8 k3 h2 \2 D- l
{
# z( g( Q$ U) Y) ]+ O        int fd;
3 P) Q1 Y" _4 t        int *mem = NULL;" u/ l6 p3 x" R! n; o" h0 {

+ q: s/ @) F% l: Y% r        if((fd = open("/dev/mem", O_RDWR)) <0)
& e* n6 z9 s: X  n- f/ [9 g        {
2 m- e, m3 j* O" o- _$ i0 M. [                perror("open error");1 I  @! W# B' g  ]2 f$ |* L% t/ Y4 d
                return -1;
) V- }) v& J. w( f" K* m8 j        }8 C/ _$ I' n" I! p
        - e$ W1 y3 `( Z/ S5 o* ]  U) }
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' C8 a+ ?- D4 v# T) J
# n: [8 h6 U' _- w. V4 t) @# y        while(1)
) }9 @5 m8 Y; j- _% t        {
" e: e% u4 l8 x8 i# O                read_MSG_buffer(mem);
4 @8 C& C- D. w  C% X        }                + Z9 P8 ^8 g6 n" U
}
7 g$ V# l. x' U' `6 M; n
( V/ H1 H  i1 Q* F: e4 vvoid read_MSG_buffer(int *baseaddr)
$ w8 y: p- I: F) Z7 Y{
1 u% Y) Y9 }) F8 d% \- y        pRX_MSG_PROTOCOL pshreRAM = NULL;
; y& [, Q7 P5 l& F2 ]% d
4 O6 C2 z! g- E$ n/ A        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# m4 N$ j& {' V" L9 j" V, p
% E, J8 O' j# f2 o& }! d8 d        if(pshreRAM->packet_cout != count_copy)4 Z- m' \$ j5 Q3 F# G$ I# G* r
        {
# [. V( v) o" l8 d                printf("a is %d\n", pshreRAM->a);
# w9 _9 @+ a) s' m& \4 u                printf("b is %d\n", pshreRAM->b);
* Z& r2 a! h" o                printf("count is %d\n", pshreRAM->packet_cout);6 g6 F" L, l) w2 o) G' w* }& e/ @
                count_copy = pshreRAM->packet_cout;% k0 K( I7 L$ {7 H) Z7 d: W
        }
5 x; |! l+ A" y+ T& ~0 E8 v        else7 B4 H) N- l' |; O6 V+ l9 w0 i& r
        {% b: a( q4 q! w: e" z5 `
                printf("No effective message!\n");/ C/ F) c) I( L" E6 j6 r+ a0 b
        }
  c, [' M; H. S1 ?/ Y+ r}5 j1 E2 r. M1 n% S
4 G; J2 y% |1 W1 Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: m! ?9 _5 K& V& t) K  G0 @% \$ V; p) a8 K0 Y. W4 t
7 X8 q% _. Y/ c" c0 e( ~/ t' H% p

) ^1 n9 \0 }) k8 p- _: [3 b8 C& R/ X3 j: T$ E" W" p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-14 12:53 , Processed in 0.041614 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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