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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( W0 |, c$ s" T6 |/ v/ s' Q
7 N! W# q5 _! a4 W4 ^OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 y: u. A6 |* [#include <unistd.h>8 C9 R8 b+ e% R/ \$ v+ t
#include <sys/mman.h>
2 q' C. |) Y% Z1 \& z#include <sys/types.h>
" _6 e- O. |: j' f* T#include <fcntl.h>
* b5 X% w3 a. ~: l5 A
$ e+ R) r* L. w  b" T; W" Z#define SHAER_RAM_BASE_ADDR    (0x80000000)   
0 E; B; o( X8 m- v0 N/ `) p' R0 s; X2 E
0 T4 k% i2 U3 M3 B1 Y$ z0 i, vtypedef struct/ H8 S9 q; t2 u. P
{
& V, }  z+ K4 Q$ {3 c( P        unsigned int a;
& S+ k7 Y( I4 Z% x2 a7 _( ~        unsigned int b;  x/ b$ K) g* w5 e8 c- w, m7 b, n# P
        unsigned int packet_cout;
. c3 x: h2 e3 a, d, ]4 h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* f0 C6 Z' }! \7 n
/ t  \1 k0 C  J4 n6 z& m6 qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 ?! _  I3 B/ ]4 U' J6 q; q/ v
unsigned int count_copy = 0;9 _# i+ d, I+ O4 y4 z% E

7 O8 N4 X* r0 R, J' V. [6 \; X+ ?1 s+ [$ r0 `2 [- Q! A
int main()1 {1 Y7 [: A/ t" Q7 }6 P& `
{9 j" z: b, E+ L2 l% ^: H
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* d$ I2 }+ D) O$ O" K        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ C8 S) K# {* X* |3 h6 z6 K  N; ]
        while(1)
" F! B& b/ b1 A  J9 M! R        {
' K) \! x. `9 a" f# G9 w) c+ G                read_MSG_buffer(pshreRAM);; }; G3 x. ?) Z6 [: L
        }               
/ y6 z5 w2 t$ A/ k& u6 h7 E( q7 z}- l1 f' A# Y% I! }0 o- B5 K: F% \/ L! G

" n. f! X( }4 q: O' |# Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 V! c: N9 ?/ l& v6 I{: q/ e  a0 S6 w% o, T# m. P
        RX_MSG_PROTOCOL buf;
/ b5 x$ l( I7 x        
2 z- V4 r# g8 j& M0 l        buf.a = pshreRAM->a;
& b; s$ R5 f: @9 S8 J2 i        buf.b = pshreRAM->b;" ~2 ~5 E/ J; B  l
        buf.packet_cout = pshreRAM->packet_cout;
$ ?! A; q8 r( k        
/ b4 z1 d% @& G7 `% _9 K' V        if(buf.packet_cout != count_copy), {5 T1 D8 D) `# d; U# u
        {
- ]+ g9 Y1 p( g& S( i8 C                printf("a is %d\n", buf.a);$ ?1 g1 _0 F! W2 p) ^
                printf("b is %d\n", buf.b);
6 [' V* i. s7 @: r$ }6 }+ K                printf("count is %d\n", buf.packet_cout);
7 I& r6 o  ]* ^+ C& z; h& |" g                count_copy = buf.packet_cout;" Z" [6 v8 y9 i- [8 ]' T1 x8 F
        }
5 ?  S* f- h9 M' w6 V2 H        else
1 A$ G  y( |9 U$ r9 @& ?2 C* K. w3 z        {
/ d6 K# z% q$ E$ T5 t                printf("No effective message!");
+ }5 [  o! h7 V        }1 j6 U1 E9 L' q5 q! t
}
. D- r7 ^' g4 p5 u  ^* N; V. X
7 p# Q" h7 v& k% G
( s3 h; `; Y. A3 ^) v4 s& E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 O. C; d$ @( U" N. H, J, v1 t( d
使用下面代码,对内存使用了mmap函数后:5 x& j; c# h2 [- |- _1 o$ q
#include <stdio.h>% y% x- @# _4 C9 \* W  Y3 a
#include <unistd.h>
+ i1 F& H& I5 l' H#include <sys/mman.h>) M& N7 s) Y' j" R0 ]( P1 A
#include <sys/types.h>
- e) ~5 E( W' @  G#include <fcntl.h>
! i8 J% K) w3 H0 y/ D3 f
4 \2 x4 _9 ~& D( T$ Y#define SHAER_RAM_BASE_ADDR    (0x80000000)
8 |9 q: x+ L3 P. k* l* y- P#define SHAER_RAM_SIZE         (0x20000)   . [  m% z9 h, ~) [. J8 Q
! c- r' n5 n& q# f
typedef struct  E9 ^8 g5 {6 n2 w9 S& h! e. i; {) p
{
; |2 a) e! r9 k) r! S" H        unsigned int a;, b$ l( R6 p! a! Q, B& F
        unsigned int b;  ^* m+ Y; w; n. e- V( _) z
        unsigned int packet_cout;
3 i8 Q# `1 U( j) E) J; h% a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& n7 l; J% G  _8 [1 Z% U/ O3 b" I# N1 C8 X  X) s. j; [3 E5 `
void read_MSG_buffer(int *baseaddr);* i" Q* f6 o* s4 [
unsigned int count_copy = 0;+ `- P8 {  G- L2 P& m2 l
8 h7 k6 L& g/ E7 D4 z
int main()
5 P8 U) m2 Y' ^9 _0 E/ x{9 B' D- O( d% u1 _* C. M, `
        int fd;
% f+ o0 K! w2 ]+ y        int *mem = NULL;
# T0 j9 {  X( m$ A9 y# ]8 @0 T2 ^/ ^; r0 e: ?; _' @
        if((fd = open("/dev/mem", O_RDWR)) <0)  h( S: Q& z" a$ v
        {
5 k0 {' ?( W% D0 T                perror("open error");
0 r0 Y( k9 M- q4 u6 I+ G4 u                return -1;
, `, t7 Y( ~! r2 y        }
" g9 B+ c6 e  c0 B+ i        
8 g, @" Q% A9 B' Y+ ~        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ {( t* X! v8 d% V- P5 p
2 v; V$ c4 R# O( V9 [
        while(1)$ v8 x2 l3 `8 _6 W; a
        {! J( N) D/ s/ e  Q) p% E
                read_MSG_buffer(mem);4 H8 f$ v# f2 b* b3 ^( Z( j/ F
        }               
+ ]6 r* g4 Q" b4 u, N% q- n}4 I. ~: V8 r6 v5 q

  G4 y' ?' y8 k, mvoid read_MSG_buffer(int *baseaddr)
5 r# K: T0 e) [  Z  u. P, ^{
8 h8 z$ W5 w+ w7 T# S        pRX_MSG_PROTOCOL pshreRAM = NULL;
# G( d/ w6 |# a) S. l( C! J7 ^0 A' o' r8 G  y  x/ `
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! W/ i; m: @' C/ K; {2 l' P
1 o) K1 D# P- ?5 J& _0 M. O        if(pshreRAM->packet_cout != count_copy)4 Y, D- ~  M9 j0 c8 k
        {
  g- ]' g- P4 c6 y5 X                printf("a is %d\n", pshreRAM->a);
; r) }# W* }' M; O9 `                printf("b is %d\n", pshreRAM->b);
/ ~) V& i$ W  J4 ?                printf("count is %d\n", pshreRAM->packet_cout);1 u7 \5 h0 d4 k, l; Z) }& [
                count_copy = pshreRAM->packet_cout;* \/ }6 j6 J  f& ~/ m* K
        }4 P5 x% U: e  p4 ?0 J
        else0 ]) j: }4 Z; a
        {
- I0 k3 D4 ?( I# u/ a4 a' S                printf("No effective message!\n");2 d9 ^' I& @' r) e4 H
        }
1 u: Y5 o; K& r( ]0 r}
+ S5 \( @0 H! N: b1 [* I. A( Z4 _5 d% d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# |. B' J- j0 b4 Z7 _5 s2 b! c$ x2 |) o( K4 j5 N
& J  K6 x2 g! E0 E9 G# `
; j# M5 e( j# K( K
+ A6 l$ p1 L% S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-27 10:54 , Processed in 0.064208 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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