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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. K) [4 m% v, a  c8 g
6 `5 h5 w' s8 B) S2 bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! q$ e5 t# y. H- S#include <unistd.h>+ X- B  H, Z' T, k+ |- Y. o- h, e
#include <sys/mman.h>
  B# h0 \5 u7 _#include <sys/types.h>- i; x# L  p/ e$ |* {- P& z
#include <fcntl.h>
; S+ G; @$ ?3 m6 z
, Y# A' u* o" a2 `( V: n) X#define SHAER_RAM_BASE_ADDR    (0x80000000)   0 Q$ W8 ?7 \$ p" j3 T
: G, G* ?. p/ w. n4 l" Q# O) m
typedef struct
" |) u& q: P+ d0 o  O, j, w7 h{$ F: x; x% b) M0 I9 l
        unsigned int a;' ~7 p0 K2 Q# G0 c  |' }$ Q
        unsigned int b;
! x" `; ]* E3 O: |  W: K        unsigned int packet_cout;" w1 j& q# r7 ?8 x' b0 c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ w2 T: f% i, A
# n. {7 B2 y6 A0 {3 W) J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 w+ u; |" x; X8 e
unsigned int count_copy = 0;) g- o  _- `! a; w4 Q' j! O
- d$ g) V: t; L/ A
7 O: r( e2 B( b7 P% N! @/ o; Y
int main()
  c1 C) R/ N5 k3 f$ @  j{
8 U+ }: c7 c& @        pRX_MSG_PROTOCOL pshreRAM = NULL;
: S" P% w. s/ [5 s3 k        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 F5 `/ a4 {+ }
* ^! N7 Q/ [! z( c/ k2 t- ?        while(1)
0 ?  \+ L' \5 m        {' V" J; g; S" F3 a6 }! G! f+ ^
                read_MSG_buffer(pshreRAM);
- U, p9 ]; V  I  U        }               
' Q. z. K: Y' H}3 V6 }" w$ j6 ~$ c& G+ p7 j
8 f1 C8 w, @4 I5 C6 a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ Q: q( I* C2 h% d{' l+ _; l6 B- T2 J" v, `& x
        RX_MSG_PROTOCOL buf;
7 V7 B# \' r/ m  m5 F        5 U: `2 O' Y+ a
        buf.a = pshreRAM->a;
1 P/ Y  M9 g+ Z3 \& Q$ W9 w        buf.b = pshreRAM->b;
' T. c; U+ S: u4 a- d        buf.packet_cout = pshreRAM->packet_cout;
8 K# |: p, S$ Z        , M" ]" F1 z1 E+ S! ]
        if(buf.packet_cout != count_copy)* L6 r; `) A  d8 n8 g  `6 f
        {
' p* O4 k! D- ~6 s                printf("a is %d\n", buf.a);
. i/ Z  N/ K+ [( x; \8 H6 `                printf("b is %d\n", buf.b);1 r( m- X+ ~$ H& B5 o1 i
                printf("count is %d\n", buf.packet_cout);
6 B* f" t- E' R5 M/ e( ]: T                count_copy = buf.packet_cout;
2 Q$ O- f4 w3 E. z# P        }
7 A: v7 [, F9 _, d, N" O+ B        else6 j; c/ T7 U6 ?$ K- s
        {
7 V) ~5 x: x, A) o                printf("No effective message!");2 j  D; m" f0 Y# S7 K# A
        }& m% J; ^1 O! u4 a9 C2 B
}
* }% |9 C9 p8 E3 ^9 q; z6 p* B, R, l( T6 N! D
6 z. A7 f/ V7 m4 T; q/ D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 i! I# x; U) ~! n( ~* h使用下面代码,对内存使用了mmap函数后:
, c& k* J) c7 I* I9 u# t! Z#include <stdio.h>1 W! z- _5 m, y5 O& D
#include <unistd.h>% z( d, O. r, }
#include <sys/mman.h>
4 e; `5 S' P# k' {* l. f: D#include <sys/types.h>% H  J; G: A3 Z) Q5 V4 D
#include <fcntl.h>
+ F% N% v8 @( N' f3 Q4 @; F1 E/ k1 s& C$ U" x
#define SHAER_RAM_BASE_ADDR    (0x80000000)
# C% |4 ?5 C9 {8 p; `#define SHAER_RAM_SIZE         (0x20000)   1 u; m, H7 L& ^" {1 M, S
) {! b& D1 `4 K3 `! c1 m
typedef struct
! c3 C* K6 ~5 X- y5 v7 Z1 f/ i{
1 n/ ?7 }6 Q3 p; b# B        unsigned int a;& w0 }) e# y% k2 \8 y. P
        unsigned int b;+ l& E) \: \' ~: f" N( A
        unsigned int packet_cout;  A4 y# T& h; A  Z/ d' H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  `: N: [' p' b$ V1 W( K  |% R9 Y0 G' a/ H- _9 `9 I) u$ Y
void read_MSG_buffer(int *baseaddr);! K! \+ @5 S3 z. C- [
unsigned int count_copy = 0;
/ U3 o* n) g# Z% i" \8 X- q% {$ r) b+ F; {9 @6 {7 M
int main()
, s5 i4 K* z( L# p; L7 N( e{
# Z$ R3 O& f5 b( @# m# F, G! r0 V, }        int fd;7 n# ^! v/ I8 k6 g9 I( F# e
        int *mem = NULL;+ `' F6 Y; H: b

) N5 g! a# d1 d$ H        if((fd = open("/dev/mem", O_RDWR)) <0)
) D. I, `# q1 I8 H        {
! i* U7 L' |8 `8 W1 x                perror("open error");
3 j6 R9 `( B+ D                return -1;
5 t, W, k" v$ V# l$ B4 a' a5 O        }
# D3 q, o8 _/ i5 I        
- m7 ]3 p* Q2 Z3 C- B2 g        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 j7 r6 b4 T, Z/ ]2 ^/ N
2 P+ Z# s9 t+ }, t
        while(1)) F* e3 y8 u* S9 W8 p2 P
        {
0 R( ]4 D7 O$ c( Q: N9 a' j/ e) T: v                read_MSG_buffer(mem);+ S+ m* ~* [2 X
        }                ! u' ?* l2 @* z9 B" [( x2 O
}0 b" l8 k5 ?0 Z& h- g

4 l6 h* i: F: b% Nvoid read_MSG_buffer(int *baseaddr)
% n6 l& ?/ S4 D. i6 b{
; n  K7 f( T3 g1 e+ ~        pRX_MSG_PROTOCOL pshreRAM = NULL;) M% |7 r9 h$ H$ d0 l$ f
6 N; ^' C. E% n0 f
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' |5 Y9 f. d7 s
- P2 [8 L0 p' R6 L  |        if(pshreRAM->packet_cout != count_copy)
9 O8 N7 n  N+ a) @        {# P4 j3 H6 j; a$ g$ ?3 ?6 ~) d. c, \
                printf("a is %d\n", pshreRAM->a);8 J9 e9 G5 D" F
                printf("b is %d\n", pshreRAM->b);# @5 q8 O) J) y4 m
                printf("count is %d\n", pshreRAM->packet_cout);
0 {3 E3 {+ ^3 o: P* W                count_copy = pshreRAM->packet_cout;
& {# [% T9 \3 ^6 j! s" k        }
. M0 R  |. K" ]7 u9 y/ p        else
  O# U& s/ @. H/ c) ?0 l- b        {+ I) q% S) A8 R4 W, u
                printf("No effective message!\n");7 s1 |+ u5 x# E5 h% j
        }
, C( ]" m7 F9 A' K. O) E: b9 K8 l}8 Z7 W9 I. O$ |- L5 N) s5 t
. u* y( q  V, m% o7 }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, W9 r- C  K, |5 z. F
! N5 K6 ?; {8 `' S9 y- U' G6 h3 l) Z
. g3 J- f2 f" w4 ^

5 `0 T" I& Q, s0 [' [* ^. a- O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-3 17:46 , Processed in 0.039212 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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