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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , |% K$ \. y# c" C+ k5 @; V( |' p

9 ]: G9 [" @3 }OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" x" O7 x. r% b; p9 l7 `$ k' P#include <unistd.h>
  Q; K4 [5 }; |% |0 {# U; v#include <sys/mman.h>
( h  [5 h: ~0 v, n& n2 V#include <sys/types.h>! H3 Y; m0 Q" ]; Z: ?3 j
#include <fcntl.h>
8 y7 ~, U) s7 u' U7 A' s- n/ x8 H6 Y5 N6 B
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
( r3 Q( B  }- [! z* l9 N' b1 e
/ n: \  K. S1 a/ d8 ptypedef struct
7 |7 z8 R. E- x' }1 M2 c{
& P1 q0 V8 d7 A        unsigned int a;
7 K* a9 p' p  p6 h  E) p2 j! Q. _        unsigned int b;) G( ]3 S0 |  p4 l8 J, T; e
        unsigned int packet_cout;/ |: B' J4 |( t( L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- P5 I  V7 ?" z8 d% C. {9 e, ~2 G, w6 k! w* i4 A" t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) z3 z3 \7 E3 `' a8 m- X
unsigned int count_copy = 0;9 x  @0 |, P) |4 Z
6 h4 T2 Y% d* S- s' [
" @- w" l& s0 k9 u3 o2 O
int main()$ x0 q: ]1 R- w% p
{. R) E4 E& G( @6 ~2 f0 K
        pRX_MSG_PROTOCOL pshreRAM = NULL;  R8 G1 c. G) P7 Z( W1 U
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% v4 W8 T( {9 X9 v, i% J2 c% `' R

$ Y4 m5 L4 ~' [  h        while(1)- D. n& T' `$ `2 |0 c' J+ x. K
        {: U& ?* E5 J0 H9 {3 G
                read_MSG_buffer(pshreRAM);! Y  m$ E5 N1 [1 `4 z$ B2 J
        }                . n" H, l9 H5 f7 ^* m
}
7 \. `9 v# J! }  b# |3 a
2 f( Y) d: E" Q; kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 d# I  _4 X. g6 `9 R5 A0 p* Z{0 S( n" [7 x! o! y
        RX_MSG_PROTOCOL buf;
7 ~( v+ X5 C+ |  O. H        
& f* J2 r. b. |' D        buf.a = pshreRAM->a;
% R0 C7 q) \9 @" _+ b% ?        buf.b = pshreRAM->b;3 \- T8 G+ I5 r( R9 |# H
        buf.packet_cout = pshreRAM->packet_cout;1 {- Y; Q- w6 A0 o6 f
        $ ^" Q$ M! ?* k3 ~' A- F
        if(buf.packet_cout != count_copy)
4 B2 [6 ?; \1 A0 _& c. \# B  h        {0 }  E  k1 k: S& A
                printf("a is %d\n", buf.a);
" q1 i8 h6 g/ I" d7 ?                printf("b is %d\n", buf.b);2 S/ S& v& ~8 u$ s1 P
                printf("count is %d\n", buf.packet_cout);
: m+ L: I( D# u- F" n& m1 Z                count_copy = buf.packet_cout;+ k& S, ]9 \/ T$ [% ~4 I. b
        }
) f/ s/ H  P" @% x$ d. {$ K' ]0 g        else# b8 Z7 e4 b" Q# m; M8 @/ B
        {
+ V& O' v( ]* E! v- O7 \                printf("No effective message!");
! w4 v0 q3 w# a        }6 [+ E7 r9 x+ E" ?, n& a9 u9 S; A  k" O
}
( a9 c+ q1 J) x6 i9 y; p7 n0 Y, r( H% r. I; K6 v

5 f1 e: {; _, I0 M$ y& b* z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* i0 J9 n. z7 U, z# c+ ]7 @  X使用下面代码,对内存使用了mmap函数后:/ p3 w4 D; F' E. N. m8 d% c
#include <stdio.h>
) y/ P  J* z7 D& B2 D/ R#include <unistd.h>/ m% F9 h/ u5 }+ w6 T. x3 v7 Q
#include <sys/mman.h>
. k3 Q3 F% |6 c5 _+ `; z: M$ d. x, J#include <sys/types.h>; n( \# }+ X( u1 f) {
#include <fcntl.h>. n, V" i( \7 O  H

+ I  w) n6 A9 p, k#define SHAER_RAM_BASE_ADDR    (0x80000000); c: \$ k/ T+ a5 s9 w; z% `4 R
#define SHAER_RAM_SIZE         (0x20000)   ) E! T+ c9 X4 i0 i! A$ V

- o+ \1 m5 F2 Ptypedef struct8 V* y; y5 V+ f% h- ?$ [" h
{
9 M* K9 I3 l$ k5 V; Z3 c        unsigned int a;
! P  b+ V, b- |+ o) J9 d5 O        unsigned int b;
0 i& P  Q: V( M; w1 k, A        unsigned int packet_cout;
$ g& x+ |; i! L2 r( t/ k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% O+ |' [: Y5 R: `  Q
2 G. O' N4 U' hvoid read_MSG_buffer(int *baseaddr);
" v/ X! d9 P- D& |) i- eunsigned int count_copy = 0;9 T7 u* s& v+ V, S+ i2 R
  {2 G2 I0 x6 M) c9 A1 z1 A
int main()7 w+ d8 [5 h' W. w! T
{
6 H+ F! K/ ?5 p        int fd;# Z$ l: p  R5 S! s" [, \6 t2 ]; Q
        int *mem = NULL;) B5 \. t8 m- k3 j7 _

2 ]0 {" \! G. ~" ?" }        if((fd = open("/dev/mem", O_RDWR)) <0)
( b8 T! U+ O% f        {" }  D, A7 u4 B. k% u7 O6 @: [. y( E
                perror("open error");
, N0 z5 E4 d$ d' c                return -1;9 L$ K7 ~! \8 E8 Q) O
        }
' t1 F' w6 m3 ~7 B+ z4 y4 g        
# J( {/ Q& r$ N& W( R5 @) `# F3 o        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- O6 ~. \5 Y1 E/ T

% \! a) ^0 j+ S3 s        while(1)- N0 Q3 @( O9 m, w1 G+ }
        {
* A  b5 ^6 H  S) z+ ?2 q  P                read_MSG_buffer(mem);
$ h5 f! Y+ e1 S( h6 r% W        }                ! `: g/ r8 t6 N$ r% m! [
}8 Y. m& l0 _2 m7 [' e
# a. X% |% l9 c! F
void read_MSG_buffer(int *baseaddr)
. `- o; K2 c. q5 I8 ^& U, j* ~{
# u  q% l0 t1 N/ n% _        pRX_MSG_PROTOCOL pshreRAM = NULL;/ [4 p8 U( ^1 K# S) m0 R6 c) T

; g2 o7 r4 W- X/ ^0 F' g        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! x6 j( u; D( Y8 u7 C- u
, U$ @6 g0 a% v        if(pshreRAM->packet_cout != count_copy)8 K, P3 y  b+ G
        {
, q: I8 F4 ?  [% _9 ^/ X! ]. s9 w                printf("a is %d\n", pshreRAM->a);5 x& Q; b- K4 H* {" Y0 I
                printf("b is %d\n", pshreRAM->b);7 n1 j- |! ?& t) S# H! }, ?
                printf("count is %d\n", pshreRAM->packet_cout);
0 T2 U6 R/ i  e3 I# r& o$ i% u& s                count_copy = pshreRAM->packet_cout;
9 P1 _, |* c' A5 A" W+ x- ~        }
: t6 }* A$ I& [! P4 g        else$ _1 i5 ?% j1 s9 i* q7 f
        {) g5 x7 J: g1 Z/ c! t
                printf("No effective message!\n");
. f% b3 Z" d) r* X2 t        }7 s! x  B8 A1 a
}6 U: Z% L/ b/ A$ K1 |/ r+ E, W

4 O7 Z+ R. u) X0 F1 Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 j  o9 c: S) d2 K; x7 Z# C1 ]7 C5 v! r( n5 w
) G2 t% ^  l9 T9 o0 i& r4 w% s+ M: m* W

2 m8 ]! I" a% C, J/ w3 f  |5 [8 |! K# |5 W& f6 W* T+ _& {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-2 08:41 , Processed in 0.041666 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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