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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 R" t% `; N2 _$ s7 v! P3 I( Y
2 Y7 \6 ^- ?* N1 b2 c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- E. y) s& y8 q8 {  j
#include <unistd.h>
" W7 K6 ?9 V1 u#include <sys/mman.h>
0 |9 M4 n/ E0 R" N& M$ R2 R4 |#include <sys/types.h>( S* B3 `$ D: B7 h
#include <fcntl.h>
. q2 k8 V  o9 L
8 q1 T7 I- n# Q0 g4 ]& {4 l" K#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 T, i& I4 U/ d0 e4 t5 c6 ~' c  |! U) r: e( |
typedef struct
$ G  N7 q, e# ]6 q6 ~; U1 I  z{' L; O& n# m- r. V* N( U- ^) Q0 }
        unsigned int a;1 D" W0 \5 s7 y1 Z8 u/ ~& }( z
        unsigned int b;
) _4 w1 Z  P, |& s2 d( A1 m        unsigned int packet_cout;1 J; R( q. }; C) }* V$ c* b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ J. j4 u" ^& H% `4 c0 \
" y/ _' z/ ?$ x/ m: D* tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 _. \$ V5 p4 ^" ~
unsigned int count_copy = 0;
/ R$ r, C8 [* e4 l' V9 V9 K( W" v4 `& G7 r, \/ p+ M( a5 F* G
2 M% b. x4 w; @, L, U
int main()
3 y5 M! C/ i1 v# [9 e' S{
) S/ N2 H6 r4 q( t        pRX_MSG_PROTOCOL pshreRAM = NULL;
! ^) d) E3 X4 O4 `) \9 b! A        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 D; m9 Q: L( }% k. ?* B+ T. k0 o  C; j6 q! u' Y( J& E. B
        while(1)
* F" L* Z$ u  `! d/ N        {
3 N, @3 x! G* T8 K* w1 c* h  _                read_MSG_buffer(pshreRAM);  g0 [6 t1 ]7 T, o; k
        }               
( O7 l' c8 o" `( t" m}9 s! t; ?- X2 [: P

; o1 q) y% O6 ^: P3 D! Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 b' v) A) r5 F9 l8 [5 v! ]+ I' V{
5 I+ e0 G' I- O, I2 l5 R        RX_MSG_PROTOCOL buf;& y4 g9 l  V% b: p- H! `2 `7 y
        # F# b. Y; m( v" ]' h0 S, o
        buf.a = pshreRAM->a;4 k3 p) p7 m7 |7 |
        buf.b = pshreRAM->b;2 f2 C; }) u1 w
        buf.packet_cout = pshreRAM->packet_cout;) u2 Y  e; O/ A
        
% ]2 Q8 b- t, T: }8 E* I1 ]; H        if(buf.packet_cout != count_copy)3 }) C/ E% G. h2 S4 a  O
        {% M6 S$ q% A" }; R; v- I( a( M
                printf("a is %d\n", buf.a);
: x' \! w) d# Q$ e- N9 a                printf("b is %d\n", buf.b);/ C. J3 D5 G! q3 ]' n
                printf("count is %d\n", buf.packet_cout);' B! n% S6 U  h
                count_copy = buf.packet_cout;; a1 m* V5 |( ]! R
        }
3 s- l! H. W, F& O4 F: u) I        else8 A2 C' H) `  y" ?: K  T3 R
        {
) A$ F9 a- i' {5 P                printf("No effective message!");" m& O0 x# g) r, X+ {( K' K
        }
- q8 Q0 r& q" o}
9 r& `2 h2 D8 M4 K+ t) K" Z: w
( p$ P$ |! f- l: d$ b
+ |" ?: \5 p/ }- `! Y. r但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 j: i) b' `  M使用下面代码,对内存使用了mmap函数后:
$ U9 b- {9 S  {) {#include <stdio.h>
* }6 O: R8 l' Z' \- m# a+ b: k9 L#include <unistd.h>
( m! {- e  u% @6 F' H#include <sys/mman.h>( i5 B, J; h5 J; i* x7 L  T
#include <sys/types.h>& \5 `& ^7 l  o5 I6 {# t
#include <fcntl.h>
  @8 ~6 _4 C) @% g- \8 L4 [- H6 J! Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 \; C% h1 |& M# c4 b) j4 n7 Z
#define SHAER_RAM_SIZE         (0x20000)   5 I9 h- ?! E( ^: E: s: ?+ S3 p! o( M

$ n8 L. i% V# d0 F7 @typedef struct, B  u1 n8 [2 }5 f" g
{
$ w1 m  R6 p2 M4 a5 s3 V. {        unsigned int a;; L" {8 M0 H- B7 v3 B) u  N
        unsigned int b;! w( {  b6 g* q& s
        unsigned int packet_cout;
7 I4 I9 W: z/ Z. L# Y+ q, e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# ]% l) K; A% D0 k
( {% g" S0 [; b6 j8 Q8 f
void read_MSG_buffer(int *baseaddr);9 V5 B$ h5 L1 I* v& P. a4 f" b
unsigned int count_copy = 0;, a, C6 q* X+ S, x4 @  ]! G6 f

0 l4 q+ u" l4 {6 a( iint main()5 A# x& X4 S. Q& q8 |
{3 y% y% r3 C7 h2 A
        int fd;
! J( \" k- v3 L: A5 g, [        int *mem = NULL;
# ^  B1 ?9 R2 h7 g6 a, E) f
. y& X) z2 R( y. l        if((fd = open("/dev/mem", O_RDWR)) <0)
0 w5 m5 v: q" Z! k, ^9 F1 ?        {
2 F1 ]: n" H+ `                perror("open error");) |% ~! L1 N2 a
                return -1;6 Y3 d# H8 S& Z# ]- u; Q* `# g
        }
' L: a) X1 X4 |' s! @0 r        , k; \# b# V4 _) Q! K
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& M( @- |" {5 I
1 p* F' p1 Z7 G' `! l) f        while(1)
( u7 h% z$ {1 ]# t        {8 q7 R' I& I# b3 S; t. |" C- h
                read_MSG_buffer(mem);3 Z( @1 b* Y4 B
        }               
$ z% C0 e) ]5 ^* N  p$ ~" c}4 N' G" n3 [; p

3 q/ H3 |0 P6 f( x' tvoid read_MSG_buffer(int *baseaddr)
( R  U8 g  l0 d' G{, _; O$ n0 s" ^+ R: I
        pRX_MSG_PROTOCOL pshreRAM = NULL;. y' L  H' M$ x5 E
6 R2 D8 p4 Y/ j, Q& W6 F& O
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* \6 s9 g; f3 N' J4 s  O: ?( p" j9 r9 {8 B0 ?$ q9 v
        if(pshreRAM->packet_cout != count_copy)
+ \! ^; n1 W9 A$ ?  C/ U8 {: [9 y        {, ~3 ]' J! {- {6 U
                printf("a is %d\n", pshreRAM->a);( s& a- D# p. S  i
                printf("b is %d\n", pshreRAM->b);
, [- ^7 i& _8 L                printf("count is %d\n", pshreRAM->packet_cout);
8 h, H; i  x. h9 P0 U. x                count_copy = pshreRAM->packet_cout;. k& _& z) j8 z3 v1 P
        }
( V9 t  I; M* W: K: Q3 v# f9 n        else( t+ p, Y; V! j5 Q& N* {
        {
. A; A5 D! Y4 i8 Y$ y                printf("No effective message!\n");0 ]1 C/ Y0 ~9 |3 g! t
        }0 U+ R- Q: \! p% |$ Q- ?
}0 G* Z2 N7 N4 [% a( Z  g
2 d. t/ {: N$ y) p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& W1 G) @+ ^; V6 c! F; |3 f$ b- _- T
" M& C- `* ^/ i9 x- _% w0 O3 b" b. f6 i$ e4 m  ]4 a- ^
. w* @3 j+ B$ y$ J2 X9 x& b$ A
: Z( l7 S, j6 i9 v2 E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-31 07:56 , Processed in 0.042290 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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