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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 Q2 }- J( ?; C2 Y/ c" U; L. {& M) L1 ^, [3 w5 F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 }4 G* T- O3 W& Y
#include <unistd.h>1 y/ [% }6 w+ Z8 O3 T1 m
#include <sys/mman.h>
* O/ M: `0 {  C  R#include <sys/types.h>
5 L5 F5 b8 X. C% S#include <fcntl.h>4 `; h4 b) l4 G! b) R
7 e$ o" W5 L: m1 t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. L0 ~" k6 `3 p. L1 N( k( f8 x' ?3 F
typedef struct+ i* B: |; f# Q' V
{
* u4 r3 K2 A) f: K        unsigned int a;# G0 |/ w4 Q* s4 o& ~
        unsigned int b;
2 j% J0 D" L7 l  k* l6 a        unsigned int packet_cout;
( C* _) O8 T( ?' `. _/ @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ H* n5 P+ k8 D! D" q* h; p* K- P9 q: T. z  x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. X, n7 k/ K- v- @6 q# zunsigned int count_copy = 0;
' Q9 O* \+ f/ [  H9 j
4 r0 t9 R# r5 Z, B# S1 Y8 U
! D2 r& k2 _* o5 {! N# eint main()
8 w% ^* |: w" e: I{
, l, p+ I; j& [5 F        pRX_MSG_PROTOCOL pshreRAM = NULL;; {8 a. E# C0 j0 q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- B2 ]8 Y" N1 H! k, M1 G! E" K; q! Z
        while(1)2 ]/ Z# e  Y6 }
        {! H1 r* \. T) S1 F% b
                read_MSG_buffer(pshreRAM);
+ ~6 i$ Q( q4 V$ g' D3 d        }               
0 X% @7 c5 d8 n( b}" `  X! A! q1 k

9 N+ y2 w5 P9 B* N  M5 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 a$ b7 A" r0 a. l* f  L( G
{
) f3 h" Z3 ?4 ]9 }" K* k        RX_MSG_PROTOCOL buf;+ e3 c; L  r: {0 r. N
        
- Q2 r9 R3 s, g7 x        buf.a = pshreRAM->a;$ I* P. l4 n8 ]) U
        buf.b = pshreRAM->b;% o2 J5 P! ^+ }8 t2 F' \/ B# |
        buf.packet_cout = pshreRAM->packet_cout;
/ \) ~+ B& o* f3 ?* p        
' t- k, H& Q4 C0 F2 B; Z6 H& s0 v3 c        if(buf.packet_cout != count_copy)
! q0 D' Y: C, V9 H4 d        {; u% c" E" s2 d+ }, h6 d1 T
                printf("a is %d\n", buf.a);; H6 C5 W6 m$ s, e1 I8 e0 E
                printf("b is %d\n", buf.b);: i9 D. S$ D4 |/ i
                printf("count is %d\n", buf.packet_cout);6 l; r9 w# C( V0 A9 S( X
                count_copy = buf.packet_cout;4 E- B' o+ q7 K
        }+ m0 \9 _3 T7 H7 E6 s. ~
        else2 a1 b- a9 `; L% U
        {* N; P% G9 G- O) l
                printf("No effective message!");
0 b. P( s9 b) ]4 k, m9 n. n4 Q, i  z        }
5 s; N, g) I: s1 O, D7 s}' u1 d- g6 ^) b. ~3 W' {) F" Z: W
. p1 @3 t6 a1 @; h
" I. H7 t$ R+ S2 b6 p4 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  _- Q$ w3 u$ _( X1 N! S* P使用下面代码,对内存使用了mmap函数后:6 _+ `* _6 N, l  P( J! E
#include <stdio.h>' w' S; l# F4 ~; o
#include <unistd.h>
6 d1 a1 E% y2 X: {#include <sys/mman.h>
6 \! Y7 R, U' `0 K#include <sys/types.h>
( y. q# _. C8 i3 r#include <fcntl.h>
% x; h0 m: U+ f  X) X# r# q/ `. G9 t4 I$ ~! L& M
#define SHAER_RAM_BASE_ADDR    (0x80000000)
, x% F9 P/ z% Q- ?2 [; ^0 }4 Y#define SHAER_RAM_SIZE         (0x20000)   
, _+ N5 }/ P/ p' a0 d, E0 B4 h5 @. {2 A6 @
typedef struct
" n% o+ W8 W1 w) I3 V6 i{
( f6 c# ~- c6 m        unsigned int a;) r& V' m" h. L* b4 K4 D( P( m
        unsigned int b;
1 g$ R. d1 r) e/ I! m        unsigned int packet_cout;
. C: z! `8 t+ u2 G8 Y& E  o8 y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# _9 b- k" w3 g# \! J1 h  R
) V* t/ ^6 l" b* J- Dvoid read_MSG_buffer(int *baseaddr);  e0 ?/ h3 _: H" S
unsigned int count_copy = 0;& K; M) a+ t$ D. `( H$ P; ?8 S

& ~0 E* s* @$ L0 O1 Z8 a+ |- w- xint main()
' j% n& }0 }7 d2 o: P{
( e) l: B; `( T& O% q8 T% X/ u        int fd;
! C, _1 l+ U* r5 D+ s        int *mem = NULL;
2 X( R# m8 m* ?  t! \, G* X! e$ o. [7 e8 Y3 m
        if((fd = open("/dev/mem", O_RDWR)) <0)
2 K# A  Z  m: j" D8 h        {
# K4 n5 a3 q/ Q' u                perror("open error");+ G/ \* f9 y" w$ K0 G. g' f; k) G
                return -1;& u. N5 w" G0 w( @, \% \( X, N
        }  N) M4 g8 T9 x; h" v* Z
        
, U+ }& L/ q) P3 T/ s        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! ?  x( u3 A; q* W/ T0 J+ u& ~( E9 p4 N
        while(1)1 o% U( [: ~9 `% N1 |# W7 v
        {( [: e6 y% V5 O* S
                read_MSG_buffer(mem);) @& Q% g- Z! Q8 P$ ^- M. B5 R) M
        }               
/ X5 |! P  l6 ?}
6 i7 [$ B) q2 d) c
+ B" ]2 P2 u0 Q6 T9 O1 h/ ~9 yvoid read_MSG_buffer(int *baseaddr). [7 R% F+ s* S1 L' D/ ?
{- j' s% c9 [- X% e3 ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# l0 t2 E% L1 `/ i) N/ r
7 Q0 [0 Z& M5 S$ D6 E        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 K# D7 o% Z. z
/ A% ^: _/ C" n8 L2 t1 p7 s7 {
        if(pshreRAM->packet_cout != count_copy)  \0 F+ C7 Z3 g/ Y/ Y" [) s- N: p
        {% `* ~. S! l8 z7 K3 j2 x4 {
                printf("a is %d\n", pshreRAM->a);
# E* j7 c+ K, g( Z/ b9 B1 o3 t                printf("b is %d\n", pshreRAM->b);
! [! p0 k. G* o, m                printf("count is %d\n", pshreRAM->packet_cout);7 I, t$ j3 l& C* n5 l
                count_copy = pshreRAM->packet_cout;
  z) W, ~  h2 f% B/ ^        }3 ^& p( o3 _$ u3 F* Q
        else0 F: P( m' ~+ y) K% z
        {- W/ G: j  W$ ?, O& [  B
                printf("No effective message!\n");# R" A! z. W  F5 D/ E. p
        }, e( O( T% I  O. r0 ~9 B
}* y# N9 c1 G7 m
0 ~; V0 M/ f- w' E" h) q# V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( y9 O5 R1 t2 t& X
$ j( s4 s& D1 y( q
; r5 k# e, w- a" T; a
& Z8 I( G  J! V

  f; V  O) ]. K; \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 07:36 , Processed in 0.046030 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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