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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  A3 j/ \+ F6 Q) e8 Y8 J1 Q3 P# A( S" q2 d. c% c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! o* K  M- x' |! ~2 }4 |" B#include <unistd.h>
( |; v* u. S. p2 x9 n#include <sys/mman.h>, f: z. D0 m- e  e9 `6 d$ A
#include <sys/types.h>- c& Q0 X# b5 N* J& G
#include <fcntl.h>
8 I& {8 Z% J4 V
7 e& k# F- |$ R, ~# X" B  G4 c) i2 ^#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 m0 Z0 {, s2 F) b/ k! g- D& K2 K1 g) S, v- O' I
typedef struct
2 B- u7 }3 d6 c  i  b/ q- n{) m% \6 m1 R1 N0 K
        unsigned int a;
) j6 E/ p. A5 N2 i& u/ e        unsigned int b;
4 h( C& M; V) j$ w        unsigned int packet_cout;2 `; M9 f7 L4 t7 r; P8 a% d6 `8 G5 N2 {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 m0 I0 v; j: y/ o, F- L- x+ r9 d5 k3 Q; \# t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% g  u5 L4 c/ Q+ c4 a
unsigned int count_copy = 0;
5 A5 g  R5 F: b& x1 X0 K& y; A0 ~* R2 B+ R$ S% w( u! ]

$ J+ F9 ~7 i4 X' [; W1 eint main()2 ^$ H1 v# z3 t" z4 Z
{2 h) @) _& }, a& o
        pRX_MSG_PROTOCOL pshreRAM = NULL;, d% c0 e8 ~- @- c
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 W. V2 E( f/ w- q+ P: ?

8 c( F" P' a1 e. v- a: K" r        while(1)6 N8 ]% N$ {: p* n
        {
1 n( [6 m$ f* I3 W1 J                read_MSG_buffer(pshreRAM);
6 b  U2 p7 Z( e- S8 e& {$ z/ C        }                : Q5 g/ _: v2 X5 x
}
* v) i7 `" T2 [
, [! \+ @; b0 ]) ~: j0 N& a3 Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  c8 s, C6 G6 ]4 a% y- U: _{* g! ]. W% t. A; ?. `9 H+ e' T
        RX_MSG_PROTOCOL buf;
9 @3 ?' Y$ F9 b4 u        
5 v( k+ P( ^1 J1 _/ U0 |; i: ~        buf.a = pshreRAM->a;; E6 ]- l7 D6 ^( c* o6 l2 K
        buf.b = pshreRAM->b;. w4 ?) x( \# z. f) C  W) N3 x
        buf.packet_cout = pshreRAM->packet_cout;
5 y; {0 _, n* J  k# v        
( K% Q. k; F( S' K& s3 y        if(buf.packet_cout != count_copy)& N" z) |: z8 H8 t6 M
        {
! N8 {: ]# {$ F* p                printf("a is %d\n", buf.a);. B2 U+ C: i" B! X/ m$ x
                printf("b is %d\n", buf.b);( A. z, g$ g4 }
                printf("count is %d\n", buf.packet_cout);9 _+ Q( E* r  b: c
                count_copy = buf.packet_cout;
, A4 i4 v2 t; D; W2 s  _        }, g' @0 ?, E, z
        else8 v1 N. W1 _2 {' p
        {# U/ ^# O% P" s  L2 i* r( t( X, h
                printf("No effective message!");
% I9 N! j7 |. W- {        }, n' v; G; r9 H- P% P( a
}) Z# G, c0 L7 z+ A
1 Q. B5 `8 t9 G! c3 n9 E

6 {* _  R  ]) `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 J% M4 P9 y' H% a' ^
使用下面代码,对内存使用了mmap函数后:
% L8 n( |6 Z# a#include <stdio.h>4 b! m  m. a% B' Y' [6 Z# g. ^
#include <unistd.h>
8 I# k& r' p3 Q/ f0 x8 _' x6 A1 j4 H#include <sys/mman.h>
5 e& j7 J) F5 x7 S4 j6 e- Y#include <sys/types.h>! z) X2 _* n" O9 V: \  y
#include <fcntl.h>1 K! @: H3 A9 F7 l

0 d4 N1 R+ c- Z#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ j& P) K4 h) B  l2 K  J$ v#define SHAER_RAM_SIZE         (0x20000)   
! z7 d, f: K  e3 E1 B# A9 L8 K; j
typedef struct
) w* @$ d5 m& s* u; v9 o9 r{
/ A; W. V. J6 E  f9 x        unsigned int a;
; Z4 K, c. p+ _/ ]# g$ s. W        unsigned int b;
. E6 o" U2 Q: ]$ k! S" K- X4 K        unsigned int packet_cout;
4 d4 W# k9 C; [' t# v; Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 J; y% q4 Q6 K

. Y5 _6 E6 _1 l1 O( wvoid read_MSG_buffer(int *baseaddr);
- \9 Z; W$ M- _) T9 Qunsigned int count_copy = 0;, B, c  O1 p/ f8 V! F  O' ~$ ~

- i; b, m) `9 _8 C) xint main(); h5 f0 ~9 d4 n1 D. _6 t: g
{& g4 O+ [$ h0 V0 |: H; a
        int fd;
+ n! D9 U, i: |  }+ x& \        int *mem = NULL;
+ u/ \5 Q# x2 G
1 Y' R+ `1 H; F. Q* I, a3 g        if((fd = open("/dev/mem", O_RDWR)) <0), \% j$ U' Q+ c% e7 q
        {
( Y4 J' J3 j8 e4 \) M) x' P* Y                perror("open error");
0 b$ s+ {/ t- ^                return -1;
9 t2 @5 z- {; J0 z, ^: j- n        }
/ k) j% z- |' [* b        
) j& K! a. o5 ?+ y& C* b        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ f  r7 J* T. X+ t! Y+ y. L9 E5 k, w, X, }$ E
        while(1)* C! F* B; o/ e2 G
        {
- [5 I: ~5 K" T2 r. m6 k                read_MSG_buffer(mem);. q8 u0 Q" Q) n
        }                0 _* ~$ e; Q5 X. Q! \3 a
}, z4 @% f: m/ R- ^

# I/ G1 @# M* |3 ~! f/ {void read_MSG_buffer(int *baseaddr)1 N/ j$ e& ^* U* T3 {8 A; M
{
6 A+ o6 x, t* ~0 P2 X" E$ N        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ u5 [  {' H  l: \+ Z
7 Q: ^% Q3 [. K( x% `! W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, C3 X, W9 `5 a/ s9 V

( H  L# E; E0 @        if(pshreRAM->packet_cout != count_copy)
* R, A4 t7 x* K/ \        {
3 y0 u  c% r9 P- A9 W                printf("a is %d\n", pshreRAM->a);
7 F  g1 ^- D) h+ k. o                printf("b is %d\n", pshreRAM->b);6 X$ v. d5 i3 {% Q4 {
                printf("count is %d\n", pshreRAM->packet_cout);1 F* |7 {8 s) \+ b$ R: O9 o1 s
                count_copy = pshreRAM->packet_cout;' s+ D- [7 Y/ ]& n) d5 Y* g; z' V
        }- z; W* E. ]9 F% T: |0 v  s5 v
        else* N3 V+ s" v2 K0 v' Z5 I& v, j; l
        {- c) }, {9 G2 k+ V
                printf("No effective message!\n");  f3 Z8 D3 f4 F+ r& G
        }
8 B+ R' m' T: V. W  N}
) m9 a* O7 s- |2 H3 l0 P- o/ Y9 s2 g" N) g. i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- `* Z' d4 G# B
+ ^2 ]* U' O% H- l1 U- K5 |3 [+ G9 n1 s; E# F. k
" W* ^" {; {+ _+ V  J1 k8 q; l) D

+ c$ j+ N1 [. ^+ R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-16 00:10 , Processed in 0.041223 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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