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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . O$ Z5 I2 Q% k8 c  [

3 ?' X- F& t4 E+ f# c! YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  N. E" S* x' c1 g
#include <unistd.h>
0 U4 x: b' `  K! Y1 s. L" {& B#include <sys/mman.h># }- N" q  K# S
#include <sys/types.h>
1 y" Q3 U1 P8 e$ d#include <fcntl.h>
5 n! i' X7 \1 |5 {* d( o  ^" M: M7 z, k8 ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  k) X. H* V; u: M
0 Q% z* L' D$ c- J* d5 ]typedef struct" N) s% d1 M3 _6 m8 z8 _
{$ a" W8 N1 K: c) Y7 T. ~, Y  \
        unsigned int a;& A1 z8 I, z6 [" r7 S( `: d7 K$ T1 G
        unsigned int b;
8 c% y: y' L0 Z6 T+ n3 ^" o        unsigned int packet_cout;
( P0 J2 I0 G  w; O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 y0 |# x; s1 r, R& i
; X) |7 @- D, r! S! {( V2 P# I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' [- T1 r6 W& i/ ?) ]8 O
unsigned int count_copy = 0;% A, }% }7 E! X2 t! Z4 Y+ v0 c
+ }: p0 p, L) U$ s

, S8 n* e8 v: ?% U, e: X* fint main()$ L, _6 e* ~/ V' [% X$ R& A- ~! g
{
( P3 c% T; g" E. N7 a0 E        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 u( X1 V/ K9 W2 m& p! ~0 `        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ y. x4 D: Y" U- l8 z! i( J- f0 x& P' X2 j7 T- v
        while(1)
$ k  G+ V' p1 W: ?5 o; O  |        {" M) D  K. B( L; F# I% G
                read_MSG_buffer(pshreRAM);
7 l; `  x' j) r7 D; G% h( j        }                , g3 W1 Y* h  m" q
}
* @+ f1 J# [( E5 {; [9 L) V( K0 l
/ n1 z5 _6 z' C0 ^: R+ d5 Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% s, \4 _- d7 Q$ u1 n  S* k{
: }% Z" T/ i2 m        RX_MSG_PROTOCOL buf;/ y0 [& B( Z3 C  c" L
        . k" l  L/ z) j" H
        buf.a = pshreRAM->a;: \1 R% E5 \0 `+ \( D7 i( m
        buf.b = pshreRAM->b;
  T0 m1 i5 Y- I7 @        buf.packet_cout = pshreRAM->packet_cout;* a7 I- D. a& X, G. ~7 [
        
6 c5 h2 J; {: b1 f        if(buf.packet_cout != count_copy)8 W0 ]: C* O( j# n* u" |+ {, s
        {
1 `0 S) S' ]1 @" D' |                printf("a is %d\n", buf.a);& Z6 F* r8 v. E& I" P
                printf("b is %d\n", buf.b);5 O2 P) S& W. B( x
                printf("count is %d\n", buf.packet_cout);, Z% W1 R' B2 [( P6 i& Z! G
                count_copy = buf.packet_cout;! n& p, Q0 j; G2 w
        }1 b; X3 E4 I. R: k
        else$ D5 R6 L! `7 Y( \
        {
$ P/ D4 J1 I5 ?' y: p                printf("No effective message!");
- F( e7 |" b1 ~# ?" K2 u, m        }
. q8 c4 E- ?, W8 f* n}
# s5 S1 s3 U7 v# f" m3 q
6 I0 Z' N0 H* k1 d2 v0 ~* n+ h, Z9 A
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* m' A# y! X, y: w7 V, r; B* Y3 S& G0 W4 r使用下面代码,对内存使用了mmap函数后:
. m" A' |# U$ ^- @9 d- R/ j#include <stdio.h>
3 ?0 j, I( N; M  y# B#include <unistd.h>" \  H7 K# J% R9 j4 Z
#include <sys/mman.h>
" C* R# A# L. A- j/ ]1 R#include <sys/types.h>
. ]1 S& N* v% S#include <fcntl.h>' S/ K1 V- N6 E% |. ], t8 F, T
4 l/ [$ C3 ?/ {4 u' Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 M' v' B& K7 d( j4 O* P#define SHAER_RAM_SIZE         (0x20000)   
- C, C- D0 a5 N* {" G
1 k/ n2 O: x# |/ u7 stypedef struct
0 E$ ^2 E3 H: L- p: [- Y. A{+ p' V( f+ `1 F5 c- o7 C9 E
        unsigned int a;
8 H2 C$ e; g6 t! k  S6 G1 t8 `4 {        unsigned int b;
# {+ U" I/ f5 n8 X$ W        unsigned int packet_cout;
1 N( {$ l+ Y. U! d6 ~  q/ C$ {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ F; p. c) Q) w# }9 T
4 P7 V# V2 B5 g" U: f
void read_MSG_buffer(int *baseaddr);, T. t9 a4 ^6 a! I: [0 B& ]
unsigned int count_copy = 0;
/ A/ p9 U% P. x6 y- e6 N+ t  e) n
' \$ W# }4 {( g. Jint main()5 t  x+ J' V7 A4 l
{% Y* j0 O7 ]% N9 X* A
        int fd;
) z& \0 |1 i9 K" m  Y        int *mem = NULL;
8 r8 H! z3 R% C2 q" H" f
7 p  L) h+ W& y, d        if((fd = open("/dev/mem", O_RDWR)) <0)7 M# k' a. p" r- o. J$ A5 M
        {# i! N6 ]+ F; C. N
                perror("open error");) n* G  S' }4 e7 P
                return -1;
5 E9 b+ L; E, S# w* q6 h        }
4 P4 E6 i8 P2 Y5 J1 u7 y        ) ^0 K8 K% V6 f/ a! R
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ Y# j; J: U: C5 Q$ k
% t' A' N+ G+ s( ~7 Z# y. K        while(1)7 C' d$ g; x5 [8 ^
        {
- p! M2 x* v: d0 |( o! s/ Y# S                read_MSG_buffer(mem);6 V( `5 l$ P) G1 c0 ?' n4 j' y% c
        }                ( K$ u: [1 @3 v, S+ t' E8 G
}  ~0 I  o7 S; [

( b( ?6 V- w& i+ S; G) {void read_MSG_buffer(int *baseaddr)7 _. ^; W; r* Y" e; {, b+ y
{% E$ P/ p  R7 H: O% }3 |7 t
        pRX_MSG_PROTOCOL pshreRAM = NULL;& c! H3 ?! O3 |+ h7 z/ q  c
- f: T! @& f  F- ]7 |! }
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 E. f1 c/ R2 ?8 u* f
2 w- {: x4 L7 o( \" E( T        if(pshreRAM->packet_cout != count_copy)+ P6 }# p( X  G% w+ q
        {
- Q5 W3 g4 S3 x6 R- A; K9 z                printf("a is %d\n", pshreRAM->a);
9 ^7 I6 D5 b6 F                printf("b is %d\n", pshreRAM->b);
% J$ w; _* `- q' P  s                printf("count is %d\n", pshreRAM->packet_cout);
+ W. l% C( L$ E. K1 M1 b# g                count_copy = pshreRAM->packet_cout;5 U: F* m' w) X1 j5 j
        }! y  F, j5 g$ O2 w7 p5 P
        else
* \0 T9 ?3 |1 |  p% |. l        {, E$ \; {' X. Z8 Z& H5 G; G1 I  q
                printf("No effective message!\n");% r! q  J/ z$ O& G8 B% c
        }/ b  [7 E( i/ X, A( i
}
+ V/ ~% b1 x, ~3 F# m4 U7 r- L
! V/ [) F: b# V6 E; X( A) J# U+ ]没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 K) P8 s" r+ C" w; O+ n3 h" b  a. ?" a$ x: h; J

, _5 ]3 h4 Y2 G% Q" `  Y
. o0 R9 x2 _0 R2 z! ~3 c" x  q
/ s: A7 H7 L% q  @8 @, t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 11:21 , Processed in 0.040586 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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