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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 t5 S0 Q% f, K: l+ Y" H

) H; u7 I# P& x0 QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 x% y, v; F* {. W
#include <unistd.h>/ M0 A3 m6 K* N, }2 Y
#include <sys/mman.h>7 e- z$ P6 Z9 K% j6 y
#include <sys/types.h>7 b  L( q( _# I. c* Q  u) V
#include <fcntl.h># i8 y, f* [2 m9 u$ @& \

' W/ y0 i) L+ t: A#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 ]% ~5 F% t( e  O# R0 s& e
5 l+ ]0 C4 P4 N# t5 b( Ttypedef struct
( ~. }* E9 g' Y1 T  W{
- O' K* E( m$ d; X4 n. p        unsigned int a;+ J6 k  K: ]! ~: d8 i+ [
        unsigned int b;
4 ?  P( [+ G) H8 Q4 W1 N5 C* A        unsigned int packet_cout;& V: E) K# E4 L% z+ ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 j3 j' \# z2 }$ D! h7 U7 K1 W/ @9 ?, T* \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, x7 p' x$ I5 R- S. B5 }0 |unsigned int count_copy = 0;
9 v0 j9 f0 X/ V. f5 J  [% y  C* a3 J. S* q

# O: I# E! ]; ~int main()
: I/ D( {6 J: r. N, `{8 U6 k9 W5 \2 h/ ]9 _
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* o- w/ h! c: G1 J. R  a        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. C/ _3 Y) M$ S0 I. h
) C2 }, e) B; {+ r/ ^$ G) [
        while(1)
! f5 y2 F. F! L5 Y        {
. p" ]- X3 l5 o/ X" S8 K                read_MSG_buffer(pshreRAM);
# z; ?  b* g( I9 g7 x        }               
( B9 N9 l! l, N; N2 D1 i}
# L+ s- @; Y- F9 ]7 ]. c; U( w- d
+ F; v/ p. A0 B+ qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 t! N! U1 T' A' b# O! X
{
0 s/ x  s2 F8 P$ Y1 ]' }- k2 P  Q5 w1 n        RX_MSG_PROTOCOL buf;
4 u6 ~6 j% u. U  V, D0 Z5 }3 Q        
# ?0 b# ^0 P4 D( M4 ?& P        buf.a = pshreRAM->a;
0 w7 t. ~! M/ S3 e' B, N0 q        buf.b = pshreRAM->b;
" u6 @  r9 k8 i8 _3 W' l0 Q  A( @2 K        buf.packet_cout = pshreRAM->packet_cout;, |, K4 U; t9 C
        0 n7 J: o/ d% G( R9 w; T1 i
        if(buf.packet_cout != count_copy)% w8 `" K1 G8 l; @/ o
        {: K, W" p6 q, T' n4 n8 }1 L9 i
                printf("a is %d\n", buf.a);
' s( m% h; W3 z; X# H# F                printf("b is %d\n", buf.b);- [& X0 ]' g3 D; d) J5 U/ t+ l
                printf("count is %d\n", buf.packet_cout);# ?8 A, ~( Y+ Y" R# U" ~+ A
                count_copy = buf.packet_cout;3 m3 X+ |' ]6 g/ Q) f- F* s
        }- m" {$ R. A( z, R8 X+ s
        else
/ G, z8 |/ E( j0 Y3 ?" G( v8 u7 B        {
9 d& M* l, C( R+ u                printf("No effective message!");
: X/ p% e! _2 d        }& }( O/ [! h" w  _8 S+ r
}
3 l5 S: ~, g& a$ Y8 O
9 B2 P$ X- H! F1 d3 i. [1 Z; |, q) L- |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 B, T8 r7 r. y! ^3 n7 ^( X5 H$ X& w7 C
使用下面代码,对内存使用了mmap函数后:: W, P2 q/ G' C* s
#include <stdio.h>+ |- E3 X: h& j7 u: l. z: ^' d
#include <unistd.h>  v* C8 ?9 Q# U8 P8 v
#include <sys/mman.h>
9 ^* m: `0 _) U" q. O6 [#include <sys/types.h>
7 z* ?% ?5 p( L/ l; B8 |#include <fcntl.h>
5 |$ B+ q9 J4 _; a( k! e* ~* v2 K) H7 w9 {
#define SHAER_RAM_BASE_ADDR    (0x80000000)8 t( [/ y: W3 A! ~$ G8 L; w
#define SHAER_RAM_SIZE         (0x20000)   . U8 S% L, T' i/ ]$ ]  I% t* w7 t) X

! F6 |0 [1 |& m1 |9 v1 \( utypedef struct
; E" H( I6 O+ E( z% r{3 g8 M1 K: a. J" i+ S% J" ?/ p
        unsigned int a;5 A; Z2 w5 S9 v
        unsigned int b;0 G- r& W0 }/ a
        unsigned int packet_cout;! l( p5 Q) s: y% A4 W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 t% O# w' ~! X3 L; ?. F

8 r+ z" S3 \. b8 a* j, p+ s5 p1 ~* _void read_MSG_buffer(int *baseaddr);! k( O2 u9 \9 [
unsigned int count_copy = 0;& r6 n  S0 {) N
6 S  W/ q+ I4 e4 s  g1 {/ ]6 h4 B
int main()" X' s8 O& W- T8 w. c. a  W
{( M8 `3 f% K* ^, v3 X. Z$ u1 A' ~
        int fd;
) A6 c5 o# ^& n' f/ U) p5 f        int *mem = NULL;3 j! B7 \# g+ Z2 t; p' p2 \, o
* J) r' N  n. v$ h3 F
        if((fd = open("/dev/mem", O_RDWR)) <0)' S0 ?0 ^2 [" v' a
        {! q) u6 O; _7 W3 C4 z, x
                perror("open error");
3 C/ a' x& _" u- K. C& O# `                return -1;
+ U( b1 Z+ J) X0 q0 u        }
5 z1 F6 u; m, F7 h% `& y/ {' @( T        
' s* G0 \3 X6 c( K* C; w& G4 M2 _        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* \8 x9 f7 M- C
: s- x: R9 J+ K$ p1 ^
        while(1)
" e" j$ m) q8 V; o# C        {
# D) P! R6 ]" u( [- z                read_MSG_buffer(mem);3 I0 E7 y/ Q! J* h% z
        }               
8 M/ V+ \8 K; S: O}9 m3 O; _) K7 O6 S; H* _

4 ~; s$ q2 y' }6 U+ M/ lvoid read_MSG_buffer(int *baseaddr)- b1 r0 ?, ]/ Q9 d9 r1 t/ C4 k
{
0 f3 }5 J) M6 `8 B. ?( g- s        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 R2 n6 V# ], o* j
5 V! o* S7 Q' R        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- z8 n7 x# R, I, @- ]! ~# v- Z; }
5 z! H" E( V* ]2 J0 y" B! K
        if(pshreRAM->packet_cout != count_copy)
6 b1 G/ P7 A( y% ^& G: G        {
# d! x; }/ a2 g( o- u8 Y9 \                printf("a is %d\n", pshreRAM->a);+ f) i" p) F& M  k( R# d0 _  u4 q
                printf("b is %d\n", pshreRAM->b);) U" u- s$ X' |  h' x1 L
                printf("count is %d\n", pshreRAM->packet_cout);6 E1 T! M4 m$ N: ^9 F/ a
                count_copy = pshreRAM->packet_cout;! N1 M4 u$ G) v1 P  p. W2 H
        }4 D9 ^' }- ?3 v& Q* |9 w% `. l
        else7 j7 _3 n( r' y, e/ g  {
        {
( H5 m9 l+ R) d8 G/ A. y                printf("No effective message!\n");3 e; Y/ R. d# a7 o5 S3 Y0 \0 R  t
        }: G' p. [; v. p$ g; _! [/ f. A
}" q7 M9 r6 \% l( F( O. x+ m9 k

: ]4 N1 E' P6 ^8 D4 o' T( s1 Q* ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! o4 M1 y$ k; G7 o+ X
4 X8 ^: d& D# p( P6 B% q$ X. C. R8 W# V

- u/ a$ v6 A0 C
' |- \8 H4 x/ e
2 h9 a% F, W; c$ x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 07:50 , Processed in 0.046676 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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