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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . y: z. F& j% X3 E

. H7 H$ i- j, z" G1 B/ c  COMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: E1 c- M: Q; n6 C' W7 A8 b# k  e
#include <unistd.h>4 V7 u! B+ j# z( H" ^& p
#include <sys/mman.h>
3 z& T! b% Y' P; o4 v+ X# ]#include <sys/types.h>8 i: }$ V. J7 e5 A8 G
#include <fcntl.h>) s8 j( Q+ }+ i9 o# E6 e# G9 D

: o! i3 J4 |$ v/ Y1 C) V" t, D#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 ?3 ~2 G3 e$ A( I! x0 w* z2 K
& D9 D) t9 R1 v6 f4 F
typedef struct* \3 O" X1 T7 b+ H9 e3 U  |
{" q/ n  p, x+ N4 {5 t
        unsigned int a;
2 ~+ j# ^- N7 e! K5 D) b2 t- o        unsigned int b;
% o; p% u# O- \$ M: k( `! G        unsigned int packet_cout;- S6 ?! Z1 ?( a3 X, ]5 H1 F: K+ _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* I2 }" L7 Z$ e3 V
) n+ `; T7 s% g, n1 U( z! y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( {5 s1 l: R7 {; m- Y" F+ ~unsigned int count_copy = 0;
0 o/ D* k6 w# X+ B% w  E
4 c9 [; ]" f. K! w' ^. b6 @8 f1 Z* N/ M) R; l0 O& i7 t6 b
int main()
/ d$ u3 A. R/ o! t{+ R) a4 {& b* X) Y8 a
        pRX_MSG_PROTOCOL pshreRAM = NULL;. u% R" ^7 ?; `4 |# B/ A
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 E# m8 Q# x; Q4 x: L7 K# h( Z3 o: ?, U, d2 y
        while(1)
+ w( q. [/ A5 x; f& q: J4 e# ~        {5 k! p4 R' W8 i) v" E9 b% C
                read_MSG_buffer(pshreRAM);/ d- k% ]' h+ }% U- c$ u1 l
        }               
$ \/ {5 _( b% L% D}6 L1 s4 b* w8 U: z
4 B7 p# R3 L  Q" C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); E. L5 I8 I) B' Q/ e. I$ M7 u, |
{5 s' m9 R% t2 X5 w; p
        RX_MSG_PROTOCOL buf;
3 A. x& y9 D( I2 K* x2 C        ) q- f4 [2 G- y9 O7 `9 s) [- U
        buf.a = pshreRAM->a;
2 m2 S; ^& q1 R+ o8 ^# x- G        buf.b = pshreRAM->b;0 D; Z' A  l% V
        buf.packet_cout = pshreRAM->packet_cout;
) z" ]* Z' F3 |" P        ) g7 x5 q- H2 O4 G
        if(buf.packet_cout != count_copy)" k* @2 l9 [" O& i0 }$ G: @
        {
/ z2 R% W) f5 u1 k2 K( e                printf("a is %d\n", buf.a);
+ s. F, X" c. L* ~                printf("b is %d\n", buf.b);
" ?& ^6 T$ U; C+ q- K1 G                printf("count is %d\n", buf.packet_cout);
# K. R4 z, _( v                count_copy = buf.packet_cout;4 A% w* F( X  ~1 ?
        }$ P4 O; c9 e: g
        else8 G# M5 M+ C. u) @' q7 ]* r
        {
% F  k* K( c- k5 h9 p                printf("No effective message!");
; `1 L- N! s+ i4 F        }
8 G, X" J7 o+ i9 P; l) e+ `}
, x1 T, D, y6 a7 I& o4 P0 ^3 [6 O4 z& r- _5 x
% l0 K( k, a3 x' `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# l  {( ~. A4 Q* y
使用下面代码,对内存使用了mmap函数后:
; n  q, d' s& n$ Z#include <stdio.h>
. T7 F; m0 y9 G#include <unistd.h>" |% X7 A& z# R! |! b( f
#include <sys/mman.h>
! S& [, C& Y6 w+ o2 }* [. m#include <sys/types.h>, v  b5 p* p3 C9 f7 s% X4 H& I
#include <fcntl.h>
3 F" B. t+ `) U
4 d' ]( K! I7 J, B+ t, i#define SHAER_RAM_BASE_ADDR    (0x80000000). D6 P. r( b$ U! [
#define SHAER_RAM_SIZE         (0x20000)   ! K9 l* R" }/ A$ S  {0 i

7 l3 e1 ~% b, F; X& Q3 \7 Q2 H5 Btypedef struct
  P/ h/ T  ~) M2 X{/ M  H/ \7 i; k6 h' }
        unsigned int a;7 ?" \' R0 u! O" M
        unsigned int b;
  {2 M4 _; b. J& \9 w        unsigned int packet_cout;
; c7 |) U! e4 a0 ?- z" B& q- g! X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: |( z+ }: `- [
7 Z& |; G5 M: r! W- m
void read_MSG_buffer(int *baseaddr);
$ d+ M& @+ q1 ^0 ^% i3 funsigned int count_copy = 0;
6 |. m7 Z) T1 w
( Q" y, b/ C9 `! w/ C% V  Y% t: nint main()
# V" h' p' Q- s. _9 Z- ?{4 z7 N" _1 a6 c$ M& l
        int fd;
0 R( D) {& n& g! E2 X        int *mem = NULL;, U! f; A, }' s6 y4 @4 j8 z
% D. d9 Z( p2 O! E1 ?+ j
        if((fd = open("/dev/mem", O_RDWR)) <0)
6 c4 \. z5 m3 R& a9 u- n! Y        {
+ n  U0 {* }2 X+ h& j& b+ E                perror("open error");
. D, _& b2 h: Q6 J9 N/ ]- [' _2 E                return -1;3 S9 L3 K' C7 R
        }
0 m& O+ ~% ]: b4 i* X        . c* ^5 O# [) U0 @# ~* |
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, F, \+ ^( r  b% O

  D5 y$ N! L9 W4 ?        while(1)
7 z) I5 R+ O$ }# V/ \& @0 a        {  c. |; E; ^: V4 l4 M  p4 K
                read_MSG_buffer(mem);
2 q( B( S( {" z- ?        }               
8 z, O' A1 d" |6 O+ p0 A4 `}3 t3 Z6 Y/ c1 ~5 \" a
  f% x! o8 _4 T. J2 O: `
void read_MSG_buffer(int *baseaddr)
. @/ s( l5 g8 \! g{; P7 o5 o1 e* `1 I! x  z
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 x4 q' S' H! [1 a) D
1 ?; o2 H/ O. H; F8 ~: s
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 d1 [7 [; v/ E5 o/ ^' C

$ d& C, {; h/ y, }$ j" g; ^        if(pshreRAM->packet_cout != count_copy); [  L; W2 }9 k
        {
4 _) K3 s2 K! Y' ~: c: f. `- a                printf("a is %d\n", pshreRAM->a);) K! q; z% f6 [1 O
                printf("b is %d\n", pshreRAM->b);
! p& y, z1 M+ }/ z% h                printf("count is %d\n", pshreRAM->packet_cout);9 `5 O' d3 _' e% t. C0 J9 u
                count_copy = pshreRAM->packet_cout;
" t# r4 \/ a0 g0 [        }
2 }/ D8 z/ }, K" G! j9 L: m& D7 Z        else8 g1 A( n$ p& q% L# ]7 y3 S
        {
( n, X: h/ P9 z                printf("No effective message!\n");" ~4 f1 |2 M5 o# O5 N
        }( n# p& f, m2 o" e2 l+ f: x
}) d, [' M6 [9 o; T0 p4 m) t

4 s( W/ J. `8 ], L没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% T: n( G: G/ Y8 D. r! o( r) b5 }6 Y" Z
1 I  u# d3 d6 x

! {; J8 n" b6 _* _4 D! y/ ~1 _8 o4 n( z- C, s
3 i# D5 b& Z/ B8 G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-11 21:46 , Processed in 0.039927 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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